Турбо Паскаль 6.0




Экземпляры видимых подэлементов.


Вам будет удобно сохранять указатели на подэлементы группы в локальных экземплярах переменных. Например, диалоговое окно часто хранит указатели на объекты элементов управления в мнемонически названных полях для упрощения доступа (такие поля как OKButton или FileInputLine). Когда этот видимый элемент вставляется в дерево видимых элементов, владелец содержит 2 указателя на этот подэлемент, один в поле, а другой в списке подэлементов. Если Вы не разрешаете это, чтение объекта из потока приведет к дублированию экземпляров. Решение - в предоставлении методов GetSubViewPtr и PutSubViewPtr в TGroup. Когда сохраняется поле, которое является подэлементом, вместо того чтобы записать указатель, как это делается с другими переменными, Вы вызываете PutSubViewPtr, который сохраняет ссылку на позицию подэлемента в списке подэлементов группы. Таким образом когда Вы загружаете группу с помощью Load из потока, Вы можете вызвать GetSubViewPtr, который гарантирует, что это поле и список подэлементов указывают на один объект. Приведем короткий пример использования GetSubViewPtr и PutSubViewPtr в простом окне:

type TButtonWindow = object(TWindow) Button: PButton; constructor Load(var S: TStream); procedure Store(var S: TStream); end;

constructor Load(var S: TStream); begin TWindow.Load(S); GetSubViewPtr(S, Button); end;

procedure Store(var S: TStream); begin TWindow.Store(S); PutSubViewPtr(S, Button); end;

Давайте посмотрим чем этолт метод Store отличается от нормального Store. После сохранения окна Вы просто сохраняете ссылку на поле Button вместо сохранения самого поля. Сам объект кнопки сохраняется как подэлемент окна, когда Вы вызвали TWindow.Store. Все что Вы делаете дополнительно к помещению информации в поток это говорите, что Button указывает на этот подэлемент. Метод Load делает то же в обратном порядке, вначале загружая окно и подэлемент кнопки, а затем восстанавливая указатель на этот подэлемент в Button.




Содержание  Назад  Вперед