tria писал(а):Может я какой-то неправильный, но у меня и в Делфи применение Free к уже уничтоженному объекту ВСЕГДА приводило к ошибке.
Не заниливались просто... Для этого потом FreeAndNil и сделали.
Модератор: Модераторы
tria писал(а):Может я какой-то неправильный, но у меня и в Делфи применение Free к уже уничтоженному объекту ВСЕГДА приводило к ошибке.
For i:=0 to ComponentCount - 1 do begin
If not Components[i].InheritsFrom(TForm) Then Continue;
fm:=(Components[i] as TForm);
If fm.Visible Then fm.Close;
end;
tria писал(а):Нашел!
В главной форме приложения в OnClose закомментарил код:
- Код: Выделить всё
For i:=0 to ComponentCount - 1 do begin
If not Components[i].InheritsFrom(TForm) Then Continue;
fm:=(Components[i] as TForm);
If fm.Visible Then fm.Close;
end;
и все заработало!
Обычно циклы по коллекциям объектов начинают крутить с конца. Если немного подумаете, поймёте почему
tria писал(а):Вот потому то в цикле стоит Close а не Free.
С Close на Делфях все работало нормально.
CloseAction := caFree;
For i:=0 to MDIChildCount-1 do begin
MDIChildren[i].Close;
:)tria писал(а):А обманывать мне кого-либо смысла нету...
Вроде как один раз в начале цикла. По крайней мере, закладываться на какое-то другое поведение я бы не рискнул.tria писал(а):Тут еще вопрос, вычисляется ли MDIChildCount-1 один раз при начале цикла, или каждый раз после прохода.
В давнишней теории говорилось, что один раз до начала цикла для оптимизации. Но что-то мне помнится, что где-то у меня вычислялось при каждом проходе. Но могу и ошибаться.
tria писал(а):Если убрать закрытие дочерних форм в OnClose главной, то почему-то не вызываются OnCloseQuery дочерних форм. Вот для чего я когда-то это делал...
Может правильнее сделать то же самое в OnCloseQuery главной формы?
Сергей Смирнов писал(а):...то форма всё равно уничтожается и список форм перестраивается. Как оно на дельфях умудрялось работать ума не приложу
procedure TForm1.BitBtn1Click(Sender: TObject);
var i:integer;
m:integer;
Function f():integer;
begin
m:=m+1;
Result:=m;
End;
begin
m:=1;
For i:=1 to f() do ShowMessage(IntToStr(i));
end;
Дотошный Вы человек. Как говорится, "снимаю шляпу".Sergei I. Gorelkin писал(а):Легко Close с Action=caFree не вызывает уничтожения формы, а только ставит запрос на уничтожение в очередь. В Дельфи это происходило с помощью PostMessage, поэтому форма оставалась бы жива до выборки этого сообщения из очереди. Но! при закрытии главной формы происходит вызов Application.Terminate, после которого цикл выборки сообщений прерывается, и форма уничтожается уже не из-за вызова Close, а за счет уничтожения ее владельца.
В LCL все иначе - поскольку системная очередь сообщений есть не везде, там свой отдельный платформенно-независимый механизм обработки асинхронных событий, который явно выполняет все поставленные в очередь запросы даже после Application.Terminate.
Сергей Смирнов писал(а):Дотошный Вы человек. Как говорится, "снимаю шляпу".
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35