Проблемы с Shape.Top и Shape.Left

Я думаю, что это не было подчеркнуто каким-либо ответом, но еще один хороший пример и использование для нового места размещения - это сокращение фрагментации памяти (с помощью пулов памяти). Это особенно полезно для встроенных и высокодоступных систем. В этом последнем случае это особенно важно, потому что для системы, которая должна работать 24/365 дней, очень важно не иметь фрагментации. Эта проблема не имеет ничего общего с утечкой памяти.

Даже когда используется очень хорошая реализация malloc (или аналогичная функция управления памятью), очень долго приходится разбираться с фрагментацией. В какой-то момент, если вы не умеете рационально использовать вызовы резервирования / выпуска памяти, вы можете получить множество небольших пробелов, которые трудно повторно использовать (назначить новые оговорки). Таким образом, одним из решений, которые используются в этом случае, является использование пула памяти для распределения перед собой памяти для объектов приложения. После каждого раза, когда вам нужна память для какого-либо объекта, вы просто используете новое место размещения для создания нового объекта в уже зарезервированной памяти.

Таким образом, после запуска вашего приложения у вас уже есть вся необходимая память. Все новые резервирования / освобождения памяти относятся к выделенным пулам (у вас может быть несколько пулов, по одному для каждого класса объектов). В этом случае не происходит фрагментации памяти, так как не будет пробелов, и ваша система может работать в течение очень длительных периодов (лет) без фрагментации.

Я видел это на практике специально для VoxWorks RTOS, поскольку его система распределения памяти по умолчанию сильно страдает от фрагментации. Поэтому выделение памяти с помощью стандартного метода new / malloc было в основном запрещено в проекте. Все резервирования памяти должны поступать в выделенный пул памяти.

0
задан Pᴇʜ 17 January 2019 в 07:09
поделиться

2 ответа

Я понял это, ребята.

Таким образом, в ориентации 0 или 180 Shape.top и Shape.Left дают точные последовательные измерения.

В 90 или 270 верхний и левый должны быть скорректированы, чтобы дать точные последовательные измерения.

Код: Shape.Top - ((Shape.Width-Shape.Height) / 2) и Shape.Left + ((Shape.Width-Shape.Height) / 2)
(ПРИМЕЧАНИЕ. РЕГУЛИРОВКА ТОЛЬКО ПРИМЕНЯЕТСЯ, КОГДА ОБЪЕКТИРУЕТСЯ НА 90 или 270 // Shape.Rotation)

Кроме того, здесь используется форма с угловым соединителем

0
ответ дан Icewing726 17 January 2019 в 07:09
поделиться

Я сочувствовал вашему распознаванию проблемы и не понял этого явления, но после тестирования кажется, что исходные координаты сохраняются даже при повороте фигуры. Это связано с тем, что даже если вращение выполняется снова, вращение выполняется с использованием исходного значения координаты. Если вы искусственно выровняете положение, координаты появятся соответственно. Я проверил это следующим образом.

Sub Measure()
Dim rngT As Range
Dim sp As Shape
Set sp = ActiveSheet.Shapes("Measurement")

'MsgBox (sp.Top & "//" & sp.Left)
Set rngT = Range("k" & Rows.Count).End(xlUp).Offset(1, 0)
rngT = sp.Top
rngT.Offset(, 1) = sp.Left
End Sub

Sub test()
    Dim sp As Shape
    Dim Ws As Worksheet
    Dim vDB
    Dim i As Integer, t As Single, l As Single
    Dim r As Integer
    vDB = Range("k2", Range("L" & Rows.Count).End(xlUp))

    Set Ws = ActiveSheet
    r = UBound(vDB, 1)
    For i = 1 To r
        t = vDB(i, 1)
        l = vDB(i, 2)
        Set sp = Ws.Shapes.AddShape(msoShapeRectangle, l, t, 10, 10)
    Next i


End Sub
0
ответ дан Dy.Lee 17 January 2019 в 07:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: