Ссылка или учебное пособие для выяснения путаницы со ссылками на объект - PullRequest
0 голосов
/ 24 октября 2009

Работая с моим текущим проектом набора компонентов на основе TFrames, я сталкиваюсь с различными случаями, когда я хочу заменить один из компонентов TFrame (обычно невизуальный) во время выполнения на один, который генерируется динамически во время выполнения.

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

Конкретный пример одного эксперимента здесь:

(на форме с тремя кнопками TB)

procedure TForm1.Button3Click(Sender: TObject);
var
  MyButton : TButton;

begin
  MyButton := TButton.Create(Self);
  MyButton.Caption := 'New Button';
  MyButton.Parent := Form1;
  Form1.Button2 := MyButton;
  Form1.Repaint;
  ShowMessage('Button2 caption = ' + Form1.Button2.Caption);
end;

Не заменяет Button2 созданной кнопкой, но показывает обе формы. Результаты ShowMessage указывают, что заголовок Button2 все еще = "Button2"

Я задаю себе такие вопросы, как "Является ли эта" замена "уникальной для форм, или это будет верно и для других классов?" и т.д. Короче говоря, я обнаружил еще одну провал в своем собственном невежестве. ;-) При работе с экземплярами / ссылками на объекты / разыменованием / определениями классов / свойствами классов и т. Д. Я обнаружил, что зачастую вещи ведут себя именно так, как они ожидают, но в других случаях - совсем нет и даже близко.

Ясно, что мне нужно изучить эту область. Вместо того, чтобы публиковать глупый вопрос после глупого вопроса, вращающегося вокруг этой темы, я подумал, что задам этот вопрос вместо этого:

Что такое действительно хороший справочник или учебное пособие для лучшего понимания тонких различий в отношении того, как Delphi справляется с такими вещами?

Заранее спасибо за вашу помощь!

1 Ответ

4 голосов
/ 24 октября 2009

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

Я не знаю об уроках по этому вопросу, но я знаю, как вы можете заменить кнопку. Вы в основном понимаете это правильно, но вы также должны освободить Form1.Button2, прежде чем перезаписать ссылку. Это заставит кнопку удалить себя из контрольного списка формы как часть процесса ее уничтожения. Или, если вы хотите сохранить кнопку где-нибудь, а не уничтожить ее, позвоните Form1.RemoveControl(Button2);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...