Hey,
ja, ich bin da mal ganz durchgesteppt. Diese kleine Zuweisung auf FMenu macht hintenrum ja ne ganze Menge.
Ich kann nun zwar den Code ändern (hab die Verzeichnisrechte alle auf Vollzugriff umgestellt...), aber er scheint das trotzdem nicht zu compilieren - wenn ich nämlich eine Zeile einfüge, sind die blauen Punkte noch an der selben Stelle und die
IDE erzeugt also keine neuen DCUs? Bei den
Vcl.Forms aber scheinbar schon, bei den
Vcl.Menus aber nicht?! Ich hab nicht finden können, wo die hincompiliert sind (Es war dann auch schon spät).
Es scheint besser zu sein (obwohl ich mir nicht sicher bin, daß der Compiler meine Änderung mitgenommen hat), wenn zuerst
FMenu.WindowHandle:=0
gesetzt wird und dann die
Winapi.windows.SetMenu(Handle, 0)
angewiesen wird, statt umgekehrt. Ein
if assigned(FMenu) then
scheint auch hilfreich.
Das Problem tritt ja auf beim Zerstören der Objekte, WMDestory...
Ich habe eine kleine Routine im FormResize:
Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
begin
m_time.ImageIndex:=byte(form1.WindowState<>wsMinimized);
Timer1.Enabled:=m_time.ImageIndex=1;
end;
Die Idee war, wenn das Form minimiert ist, muss der Timer nicht an sein.
m_time (TMenuItem) hat eine kleine Grafik, die anzeigt, ob die Funktion aktiv ist (ImageIndex=1) oder nicht (ImageIndex=0).
Dennoch ist es so, daß der Fehler nur dann auftritt, wenn ImageIndex=0..., ist es 1 dann knallt es seltsamerweise nicht
Bei durchsteppen ist mir aufgefallen, daß das FormResize nach dem FormCloseQuery auch aufgerufen wird.
Die Zuweisung des ImageIndex ist dann wohl nicht so optimal, wenn das MenuItem gerade vorher zerstört wurde
Dass diese Möglichkeit aber im
Vcl.Menus nicht berücksichtigt wird...?!
Delphi-Quellcode:
procedure TMenu.SetWindowHandle(Value: HWND);
begin
FWindowHandle := Value;
Wenn FWindowHandle schon aufgelöst ist, endet es hier (bei mir). Ein
if assigned(FWindowHandle) then
könnte hilfreich sein.
Ich habe das Problem jetzt so gelöst, daß ich im FormCloseQuery eine globale Variable
ending:=true
setze und dann es so mache:
Delphi-Quellcode:
procedure TForm1.FormResize(Sender: TObject);
begin
if not ending then begin
m_time.ImageIndex:=byte(form1.WindowState<>wsMinimized);
Timer1.Enabled:=m_time.ImageIndex=1;
end;
end;
Dann ist auch alles gut.
Und ich habe wieder was gelernt