Die
VCL hat nach dem ShowModal das Windows-Control (HWND) der nicht mehr sichtbaren TForm bereits freigegeben.
Im Release wird aber auf das
Handle zugegriffen *1 und weil es nicht mehr da ist, wird das Windows-Control neu erstellt, um danach erneut freigegeben zu werden.
Da gibt es wohl ein kleines Problemchen.
1) das
Handle wird gebraucht, um dem Fenster eine Message zu schicken "gib dich frei", was aber erst "irgendwann" nach dem letzten END; ausgeführt wird, sobald die
VCL jene Message verarbeitet.
Und Free gibt direkt frei, ohne unnötige Umwege.
Es passiert nicht immer, aber in der
VCL ist es möglich die gekapselten Windows-Controls freizugeben, wenn sie nicht benötigt werden, um Systemressourcen zu sparen.
Und hier passiert es zufällig mal.
Das ist z.B. der Grund, warum manchmal Dinge "verschwinden", welche man selbst direkt über die
WinAPI gemacht hat, weil beim Wiederherstellen die
VCL davon natürlich nichts weiß.
Und warum für eine lokale Sache diese besch*** globalen Variablen benutzen?
Am Besten löscht man diese Variablen und kommt dann garnicht erst auf die Idee sie verwenden zu wollen.
Delphi-Quellcode:
procedure TMainDlg.ShowAbrechnungDlg;
var
Dlg: TAbrechnungDlg;
begin
Dlg := TAbrechnungDlg.Create(nil); // oder mit Self statt nil
try
Dlg.ShowModal;
finally
Dlg.Free;
end;
end;
// ab 10.4
procedure TMainDlg.ShowAbrechnungDlg;
begin
var Dlg := TAbrechnungDlg.Create(nil); // oder mit Self statt nil
try
Dlg.ShowModal;
finally
Dlg.Free;
end;
end;