Различия в инициализации формы между Delphi и Lazarus?

MainForm создает некоторые вторичные объекты фрейма во время выполнения для отображения различных панелей опций.

вот типичный конструктор для одного из этих классов кадров (каждый из них расширяет TFrame):

constructor Tframe2.Create(AOwner: TComponent);
begin
    inherited;
    edTime.Text := '12:00pm'; //edTime is a TEdit control. this line is where it throws the exception
    //etc.
end;

этот код отлично работал в Delphi (был ли это правильный способ делать вещи), но тот же код в Lazarus продолжает бросать исключение EInvalidOperation, потому что у элемента управления (TEdit) еще нет родительского" окна " (rsControlHasNoParentWindow), которое на самом деле имеет смысл, когда я изучаю код, потому что родитель, похоже, не назначается до тех пор, пока не будет вызван конструктор.

вот код в MainForm инициализирует вторичный фрейм:

if Assigned(frame) then FreeAndNil(frame);
case Node.AbsoluteIndex of
    optInterval: frame := Tframe2.Create(Self); //here's where the constructor gets called.
    //etc
end;
frame := TframeOther.Create(Self); 
if Assigned(frame) then
begin
    frame.Parent := panOptions; //here's where Tframe2's parent gets set
    frame.Align := alClient;
end;  

Итак, может ли кто-нибудь объяснить, есть ли какие-либо важные различия между Delphi и Lazarus в отношении последовательности инициализации формы?

и какой самый стандартный способ решить проблему с порядком инициализации этого типа быть? По сравнению с другими языками, с которыми я более знаком, могут быть разные стратегии для устранения таких ошибок. Я мог бы добавить еще один параметр в конструктор, или если есть метод, который называется post constructor, предварительно рисуя его на экране, который я мог бы переопределить, я мог бы переместить этот код или просто сделать вспомогательный метод и вызвать его после вызова setParent. Какая-то конкретная лучшая практика здесь?

Edit]: похоже, это может быть каким-то образом связано с TEdit. Это выглядит как и строки, инициализирующие состояние для флажков, не имеют той же проблемы. Может, это просто жук в Лазаре?

1 ответов


после дальнейших экспериментов я смог решить большую часть непосредственной проблемы его сбоя, добавив строку, чтобы установить родителя TEdit в качестве кадра (по сравнению с установкой родителя кадра). Вот так:

edTime.Parent := Self;
edTime.Text := '12:00';

но я все равно хотел бы понять лучше Почему это "иногда" нужны.

edit: хотя это исправляет возможность установки текста на TEdit, это не исправляет код авторазмера, который у меня есть, который повторяется через компоненты и изменяет размер всех флажков. По-видимому, форма, не имеющая родительского набора, по-прежнему является" своего рода " проблемой.

edit2: добавление второго параметра в конструктор и установка родителя для всей формы в конструкторе, казалось, устраняли необходимость установки родителя для TEdit полностью.