Различия в инициализации формы между 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 полностью.