![]() |
sporadische Exceptions bei TForm.SetFocus
Hallo
Ich erhalte von MadExcept immer mal einen Fehlerbericht, z.B.: exception class : EAccessViolation exception message : Zugriffsverletzung bei Adresse 006BCFBF in Modul 'AIS3.exe'. Lesen von Adresse 00000040. 006bcfbf +1cb AIS3.exe Vcl.Forms TCustomForm.SetFocusedControl 005c66e7 +21f AIS3.exe Vcl.Controls TWinControl.WndProc 008f0118 +1ac AIS3.exe cxControls TcxControl.WndProc 00bd963d +029 AIS3.exe cxGridCustomView TcxGridSite.WndProc 005c60d0 +02c AIS3.exe Vcl.Controls TWinControl.MainWndProc 004ff5c0 +014 AIS3.exe System.Classes StdWndProc 77bd0d94 +034 ntdll.dll KiUserCallbackDispatcher 033900f2 +066 AIS3.exe RWForms 1399 +8 TRWForm.doMouseActivate 033904ef +0ef AIS3.exe RWForms 1586 +26 TRWForm.WMMouseActivate Hier die betreffende Routine
Delphi-Quellcode:
Was kann noch die Ursache für eine Exception sein?
procedure TRWForm.doMouseActivate(AControl: TControl);
begin if (not WinControlValid(Self)) or IsDestroying then Exit; FLastClickedControl := AControl; if (Self <> rwScreen.ActiveForm) then begin try if (Visible and CanFocus) then SetFocus; // Hier wird Exception ausgelöst! except ///// Nur vorübergehend end; rwScreen.ActiveForm := Self; end; end; Ich teste doch schon auf Visible, CanFocus und csDestroying...:? Wichtig, ich benutze embedded Forms... Frank |
AW: sporadische Exceptions bei TForm.SetFocus
SetFocus geht nur, wenn schon sichtbar.
Mach davor bitte mal noch ein Show. Dann sollte das Problem behoben sein oder zumindest reduziert. Oder eventuell so?
Delphi-Quellcode:
procedure TRWForm.doMouseActivate(AControl: TControl);
begin if (not WinControlValid(Self)) or IsDestroying then Exit; FLastClickedControl := AControl; if (Self <> rwScreen.ActiveForm) then begin // Erstmal uns selbst zum aktiven Formular machen, rwScreen.ActiveForm := Self; // uns selbst anzeigen Show; // und dann erst den Focus setzen. try if (Visible and CanFocus) then SetFocus; // Hier wird Exception ausgelöst! except ///// Nur vorübergehend end; end; end; |
AW: sporadische Exceptions bei TForm.SetFocus
Zitat:
Na ja, ich habe die 2 Änderungen von dir übernommen und schau mal... Vielen Dank |
AW: sporadische Exceptions bei TForm.SetFocus
Hallo,
ich würde als Ursache eher vermuten, dass hier auf etwas zugegriffen wird, was irgendwie nicht mehr gültig ist. Wieso sollte sonst bei SetFocus eine AV kommen! Wenn das ensprechende Form mit Free freigeben wird, würde ich es mal mit Release versuchen. So wird sichergestellt, das alle Botschaften verarbeitet sind. |
AW: sporadische Exceptions bei TForm.SetFocus
Das würde dann aber heißen, dass es eventuell sinnvoll sein könnte bereits hier
Delphi-Quellcode:
mal zu prüfen, was mit Self und rwScreen.ActiveForm los ist. Sprich: ist da einer schon weg (Nil), ...?
if (Self <> rwScreen.ActiveForm) then
Wenn bei SetFocus 'ne AV kommt und SetFocus zu Self gehört, dann müsste ja Self ggfls. nicht mehr existent sein. Geht das? Wenn das Formular schon freigegeben wurde, dann müsste sich der Fehler nun auf das
Delphi-Quellcode:
verlagern. Das wäre dann zumindest schonmal ein Ansatz zum Weitersuchen.
Show;
|
AW: sporadische Exceptions bei TForm.SetFocus
Der originale Code hat ja gar kein Show und das ActiveForm wird auch erst später gesetzt (sollte eigentlich obsolet sein, da das bereits in SetFocusedControl passiert).
Es wäre nun schön, die exakte Zeile in SetFocusedControl zu kennen um den Fehler besser zu analysieren. Also entweder im Debugger laufen lassen (geht nur, wenn der Fehler forciert werden kann) oder mit Debug-DCUs compilieren, dann bekommt man auch die Zeilennummern im Callstack. Zitat:
|
AW: sporadische Exceptions bei TForm.SetFocus
Zitat:
Mit dem Schliessen hängt das sicher nicht zusammen. Ich habe auch bei Developer Express einen 4 Jahre alten Beitrag gesehen, wo das gleiche Szenario geschildert war. Letztendlich wirft ja TCustomForm.SetFocusedControl die Exception. Wenn MadExcept statt einen Screenshot ein Video der letzten 10 Sekunden erzeugen würde, wäre die Fehlersuche leichter:lol: Frank |
AW: sporadische Exceptions bei TForm.SetFocus
Mögliches Problem: Wurde evtl. ein Control gelöscht, das den Fokus hatte?
Dann versucht Windows dieses Control nochmal neu "ohne Fokus" zu zeichnen - was entsprechend fehl schlägt. Workarround: Control zunächst nur Visible=False setzen, dieses merken und später löschen, nachdem es "als unsichtbares Control neu gezeichnet" wurde. |
AW: sporadische Exceptions bei TForm.SetFocus
Zitat:
Für in einem Grid enthaltene Edits sollte man die Funktionen des Grid verwenden wenn man den Focus setzen will. DevExpress? Eingebettete Formulare in andere Formulare? Verwendest Du die DevEx Docking Komponenten zum einbetten? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz