AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

sporadische Exceptions bei TForm.SetFocus

Ein Thema von dataspider · begonnen am 28. Jul 2021 · letzter Beitrag vom 30. Jul 2021
Antwort Antwort
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#1

sporadische Exceptions bei TForm.SetFocus

  Alt 28. Jul 2021, 07:53
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
Frank Reim

Geändert von dataspider (28. Jul 2021 um 08:08 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 28. Jul 2021, 10:17
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;
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 29. Jul 2021, 14:11
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
Frank Reim
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
480 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 29. Jul 2021, 14:41
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.
Bernd
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#5

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 29. Jul 2021, 16:40
Das würde dann aber heißen, dass es eventuell sinnvoll sein könnte bereits hier  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 Show; verlagern. Das wäre dann zumindest schonmal ein Ansatz zum Weitersuchen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.008 Beiträge
 
Delphi 12 Athens
 
#6

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 29. Jul 2021, 17:14
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.

Wichtig, ich benutze embedded Forms...
Vermutlich liegt da der Hund begraben...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 29. Jul 2021, 17:16
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

Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 30. Jul 2021, 10:41
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin
Online

Registriert seit: 15. Sep 2008
Ort: Dubai
614 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: sporadische Exceptions bei TForm.SetFocus

  Alt 30. Jul 2021, 13:50
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?
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 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