MainForm создает несколько вторичных объектов Frame во время выполнения для отображения различных панелей параметров.
Вот типичный конструктор для одного из этих классов фреймов (каждый из них расширяет 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 в отношении последовательности инициализации формы?
И каков был бы самый стандартный способ решения такой проблемы с порядком инициализации? По сравнению с другими языками, с которыми я более знаком, могут быть разные стратегии для устранения таких ошибок. Я мог бы добавить еще один параметр в конструктор, или, если есть метод, который вызывается пост-конструктором, предварительно отрисовывая его на экране, который я мог бы переопределить, я мог бы переместить этот код или просто создать вспомогательный метод и вызвать его после вызова setParent. Какая-нибудь конкретная передовая практика здесь?
Edit]: Похоже, это может быть каким-то образом специфичным для TEdit. Похоже, что строки, инициализирующие состояние флажков, не имеют той же проблемы. Может ли это быть просто ошибкой в Lazarus?