Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   sporadische Exceptions bei TForm.SetFocus (https://www.delphipraxis.net/208431-sporadische-exceptions-bei-tform-setfocus.html)

dataspider 28. Jul 2021 07:53

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:
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;
Was kann noch die Ursache für eine Exception sein?
Ich teste doch schon auf Visible, CanFocus und csDestroying...:?
Wichtig, ich benutze embedded Forms...

Frank

Delphi.Narium 28. Jul 2021 10:17

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;

dataspider 29. Jul 2021 14:11

AW: sporadische Exceptions bei TForm.SetFocus
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1492906)
SetFocus geht nur, wenn schon sichtbar.

Ich dachte, der Test auf Visible reicht aus.
Na ja, ich habe die 2 Änderungen von dir übernommen und schau mal...

Vielen Dank

BerndS 29. Jul 2021 14:41

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.

Delphi.Narium 29. Jul 2021 16:40

AW: sporadische Exceptions bei TForm.SetFocus
 
Das würde dann aber heißen, dass es eventuell sinnvoll sein könnte bereits hier
Delphi-Quellcode:
 if (Self <> rwScreen.ActiveForm) then
mal zu prüfen, was mit Self und rwScreen.ActiveForm los ist. Sprich: ist da einer schon weg (Nil), ...?

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:
Show;
verlagern. Das wäre dann zumindest schonmal ein Ansatz zum Weitersuchen.

Uwe Raabe 29. Jul 2021 17:14

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:

Zitat von dataspider (Beitrag 1492892)
Wichtig, ich benutze embedded Forms...

Vermutlich liegt da der Hund begraben...

dataspider 29. Jul 2021 17:16

AW: sporadische Exceptions bei TForm.SetFocus
 
Zitat:

Zitat von BerndS (Beitrag 1492969)
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.

Die Routine wird ja nur aufgerufen, wenn in das Formular geklickt wird. (WM_MOUSEACTIVATE)
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

stahli 30. Jul 2021 10:41

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.

Sinspin 30. Jul 2021 13:50

AW: sporadische Exceptions bei TForm.SetFocus
 
Zitat:

Zitat von dataspider (Beitrag 1492977)
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.

Erstmal, das SetFocus gehört zu was? Zum Form?
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 02:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz