2010-08-31 4 views
2

У меня есть фрагмент кода, где я переопределяю редактор Inplace TStringGrid и окно подсказки. Для этого я создал свою собственную строковую сетку на основе TStringGrid и использовал TEdit для редактора inplace и подсказки TPanel для инструментов. В TMyStringGrid.Create конструктору я инициализировать их следующим образом:Создание составного элемента управления (родительский элемент других элементов управления) во время выполнения

Constructor TMyStringGrid.Create(); 
Begin 
    inherited Create(AOwner); 
    MyEditor:= TEdit.Create(Self); 
    MyEditor.Parent := Self; 
End; 

В этом случае владелец (основная форма) является освобождающим управлением. Я использовал это в течение многих лет, и это сработало. Дело в том, что другие люди утверждают, что программист должен использовать NIL вместо «Я» при создании экземпляра, которым управляет ребенок, а затем вручную освободить их в Destroy destructor. Похоже, что вторая альтернатива имеет гигантское преимущество перед первым, особенно когда вы динамически создаете множество дочерних элементов управления (не мое дело). Говорят, что другая проблема с моим кодом заключается в том, что дочерние элементы управления могут быть освобождены после вызова Application.ProcessMessages, пока приложение все еще может их использовать.

Итак, я должен оставить свой код без изменений или я должен вручную создать и освободить дочерние элементы управления? Существует ли какой-либо пример комбинированных элементов управления Borland?


Delphi 7, Win XP
Ссылка: http://delphi.about.com/od/kbcurt/ss/dynamiccreateno.htm

ответ

3

Да, вы можете использовать ваш код, не изменяя его.

There is a any Borland example of compound controls? 

Лучший пример для проверки реализации TLabeledEdit.

Он создает ярлык в конструкторе

if Assigned(FEditLabel) then exit; 
    FEditLabel := TBoundLabel.Create(Self); 
    FEditLabel.FreeNotification(Self); 
    FEditLabel.FocusControl := Self; 
+0

Спасибо. +1. Правильно TLabeledEdit! Я полностью забыл о TLabeledEdit в тот момент, когда задал вопрос :) – Ampere

2

Там нет никаких оснований, чтобы пройти ноль вместо Self в этой ситуации. По этой причине этот параметр AOwner существует специально. Воспользуйтесь этим.

При создании элемента управления и его ручном уничтожении есть nil, но для совершенно другой ситуации: если вы создаете элемент управления (обычно форму) внутри функции. Это довольно распространенный вид, например:

MyDialog := TMyDialog.Create(nil); 
try 
    result := MyDialog.ShowModal; 
finally 
    MyDialog.Free; 
end; 

Там, вы хотите, чтобы освободить его сразу, а не ждать, пока текущая форма не разрушается, что может быть гораздо позже. Но когда дело доходит до субкомпонентов, вы обычно хотите, чтобы они были уничтожены одновременно с родительским компонентом, а не позже, поэтому передайте Self в AOwner и дайте VCL позаботиться об этом для вас.

+0

Спасибо. +1. Каково имя шаблона? – Ampere

1

Учитывая, что конструктор, экземпляр сетки принадлежит Aowner (который является типично TForm или TFrame). Редактор inplace принадлежит и имеет родительский экземпляр. Я не вижу, как ProcessMessages приведет к разрушению дочерних объектов, поскольку они будут уничтожены в цикле уничтожения TMyStringGrid. Это ничего Я вижу неправильную реализацию, и я использую тот же дизайн для компонентов, которые я создаю. Собственность на VCL позволяет легко справляться с жизнью при управлении жизненным циклом объектов. И есть не случай, когда nil рекомендуется как владелец, что показано в ответе Мейсона.

В шаблоне, показанном Мейсоном, причина для NIL заключается в том, что без владельца уничтожение объекта не войдет в цикл уведомления. Если вы создаете множество компонентов, разрушения которых вы обрабатываете вручную, вы должны убедиться, что владелец NIL, в противном случае много кода будет выполнено (без необходимости) в каждой конструкции компонента/уничтожении. Многие луны назад, была превосходная белая бумага в веб-архиве (ныне несуществующая) eagle-software.com

+0

Привет. Я думаю, что статья взята из About.com http://delphi.about.com/od/kbcurt/ss/dynamiccreateno.htm – Ampere

+0

С уважением, я не знаю, какая статья была первой. На самом деле, это одна и та же статья, но about.com не включает дату публикации статьи - программное обеспечение для орла - с 1999 года. –

Смежные вопросы