Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   SetStyle verursache Exception (gelöst) (https://www.delphipraxis.net/210491-setstyle-verursache-exception-geloest.html)

BigAl 1. Mai 2022 08:45

SetStyle verursache Exception (gelöst)
 
Hallo zusammen,

vorab: Dies nur zur Info, falls mal jemand das gleiche Problem hat.

Meine Applikation hat plötzlich sporadisch Exceptions ausgelöst sobald ich den Skin der Applikation zur Laufzeit geändert habe. Die Exception ist nicht unmittelbar aufgetreten, sondern erst nachdem die Kontrolle wieder an die VCL gegangen ist. Meine eigener Code war im Call-Stack nicht beteiligt. Bei der Suche bin ich dann irgendwann fast verzweifelt. In der Versionskontrolle bin ich dann bis an den Punkt zurückgegangen an dem der Fehler nicht mehr aufgetreten ist (lag schon ein paar Tage zurück). Sämtliche Änderungen die ich im folgenden Commit (ab dem der Fehler auftrat) gemacht habe, hatten scheinbar nichts mit dem Fehler zu tun, da diese alle in Units waren, die zu dem Zeitpunkt der Exception noch gar nicht beteiligt waren.

Was ich in dem Commit noch gemacht habe: Ich habe die Caption des Hauptformulars geändert. Das war dann letztendlich das Problem. Sobald der Titel des Hauptfensters eine bestimmte Länge überschreitet tritt der Fehler auf. Die Caption sah in der dfm wie folgt aus:

Caption =
'XXX XXXX XXXXXXXX - XXXXXXXXX XXX XX XXXXXXXX XXXXX XXXXXXXXXXX ' +
'XXXX - XXXXXXX'

Aber auch wenn ich in der dfm die Caption auf 'XXX XXXX XXXXXXXX' setze und dann beim OnCreate diese entsprechend erweitere kommt die Exception.

Wie gesagt: Dieser Beitrag nur, falls mal jemand ein ähnliches Problem hat.

In diesem Sinne

Alex

TurboMagic 1. Mai 2022 20:57

AW: SetStyle verursache Exception (gelöst)
 
Kannst du bitte ein minimales Demoprogramm für den Sachverhalt schreiben und einem QP Report, den du dann dafür erstellst anhängen?
Solche Probleme sollten EMBT gemeldet werden, damit die Mal irgendwann abgestellt werden.

EMxRay 2. Mai 2022 18:48

AW: SetStyle verursache Exception (gelöst)
 
Ich habe mal versucht dieses Problem nachzustellen, da ich auch in meinem aktuellen Projekt den Style zur Laufzeit ändern kann.
Aber bei mir kann die Caption so lang sein wie ich will (>300 Zeichen), da passiert nichts, keine Exception. Ich habs auch bei mehreren Forms geprüft. Mein Projekt ist 32bit und läuft von XP bis Win10.

BigAl 2. Mai 2022 20:06

AW: SetStyle verursache Exception (gelöst)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von EMxRay (Beitrag 1505370)
Ich habe mal versucht dieses Problem nachzustellen, da ich auch in meinem aktuellen Projekt den Style zur Laufzeit ändern kann.
Aber bei mir kann die Caption so lang sein wie ich will (>300 Zeichen), da passiert nichts, keine Exception. Ich habs auch bei mehreren Forms geprüft. Mein Projekt ist 32bit und läuft von XP bis Win10.

Das ist halt das Problem wenn man so einen Fehler melden will. Es passiert halt meist nur in einer ganz bestimmten Konstellation. Und mein Projekt kann ich nicht ohne weiteres an Emba geben (zumal es der Firma und nicht mir gehört). Fakt ist, dass der Fehler ab einer Caption-Länge von 72 Zeichen auftritt. Zu dem Zeitpunkt ist nur das Hauptformular mit einem Main-Menu und ein Datenmodul aktiv, welche lediglich eine Datenbank-Connection enthält, welche aber noch nicht aktiv ist.

Der Start im Hauptprogramm sieht also so aus:

Delphi-Quellcode:
begin
  {$IFDEF DEBUG}
  ReportMemoryLeaksOnShutdown := True;
  {$ENDIF}

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'xxx xxxx xxxxxxxx';
  Application.CreateForm(TMSData, MSData);
  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.
Im Hauptformular (TfrmMain) wird auch nichts außergewöhnliches gemacht. Ich linke ca. 10 Styles mit der Applikation. Hatte aber auch schon weniger versucht.

Hier mal der Call Stack:
Anhang 55056

Und hier knallts:
Anhang 55057

Wie gesagt: Es passiert nur, wenn der Caption des Hauptformulars 72 Zeichen oder mehr hat.

Ich habe auch versucht es mit einem der Demo-Programme von Delphi zu reproduzieren. Da Funktioniert es komischerweise problemlos. Sowas zu melden ohne es mit einem Beispiel belegen zu können ist nach meiner Erfahrung sinnlos. Die aktuelle Applikation kann ich nicht weitergeben, da die meiner Firma gehört und viel Firmen Know-How enthält.

TiGü 3. Mai 2022 07:35

AW: SetStyle verursache Exception (gelöst)
 
Ich würde nach dem Ausschlussverfahren auf einer Kopie des problematischen Projektes arbeiten.
In immer kleineren Schritten Sachen aus dem Hauptformular löschen und das Projekt starten, bis das Problem nicht mehr auftritt.
Der erste Schritt wäre die Entfernung/Auskommentierung aller "Business"/Firmen Know-How relevanten Logik, bis nur noch das Formular übrig bleibt.

TiGü 3. Mai 2022 07:56

AW: SetStyle verursache Exception (gelöst)
 
Außerdem suchst du irgendwie an der falschen Stelle.
Aus dem gezeigten Call Stack geht eindeutig hervor, dass jemand mit dem linken Mouse-Button auf ein TMainMenu mit TMenuItem-Einträgen geklickt hat.
(Oder wilder: jemand hat die entsprechende Windows-Botschaft gesendet)

Prüfe doch mal bitte, ob in Vcl.Forms.TFormStyleHook.WMNCCalcSize eine Instanz von TFormStyleHook.TMainMenuBarStyleHook erzeugt wird.
Bei mir in Delphi 10.4 ist das Zeile 16910 in Vcl.Forms.

Wird ggf. beim Starten und Initialisieren deines Hauptformulars das Mainmenu dynamisch angefasst? TMenuItem geladen und entladen bzw. hinzugefügt und entfernt?
Ist TMainMenu.Automerge auf True? Ist das ein MDI-Formular?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:17 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