AGB  ·  Datenschutz  ·  Impressum  







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

StyleManger verursacht Stack Overflow

Ein Thema von RayEn · begonnen am 12. Aug 2022 · letzter Beitrag vom 7. Sep 2022
Antwort Antwort
RayEn

Registriert seit: 18. Aug 2010
8 Beiträge
 
Delphi 11 Alexandria
 
#1

StyleManger verursacht Stack Overflow

  Alt 12. Aug 2022, 15:12
Hallo,

keine Ahnung was ich an meinem Programm verbockt habe.

Wenn ich beim Starten des Programmes einen neuen Style anwende z.B. TStyleManager.TrySetStyle('Sky')
dann funktioniert das wunderbar. Rufe ich den StyleManger während der Laufzeit nocheinmal auf, um einen andren Style zu setzen,
bekomme ich einen Stackoverflow in system.pas in _CallDynaInst.

Ich weiß, dass das Ganze schon einmal funktioniert hat, ich habe nur keine Ahnung was ich seitdem geändert habe, das so ein Verhalten provozieren könnte.
Der Rest der Applikation läuft unauffällig einzig dieser Funktionsaufruf scheitert. Ein Aufruf mit demselben Style wie bein Create klappt.
Wenn ich den anderen Style direkt beim Create einstelle klappt das auch, nur ein Wechsel verursacht dann einen Stack Overflow.
Vielleicht hat ja von euch jemand eine Idee, wo ich zum Suchen anfangen kann.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: StyleManger verursacht Stack Overflow

  Alt 12. Aug 2022, 16:30
Das hat nicht zufällig was mit der in deinem anderen Thread geschilderten Problem bzw. dessen Lösung zu tun?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
RayEn

Registriert seit: 18. Aug 2010
8 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: StyleManger verursacht Stack Overflow

  Alt 12. Aug 2022, 16:49
Hallo,
ja das war auch mein erster Verdacht, aber nach einem 'Rückbau' der Änderungen, bleibt das Fehlerbild erhalten.

Was ich noch viel bemerkenswerter finde - wenn ich in Create die Funktion nacheinander mit verschiedenen Styles aufrufe passiert nichts.
Aber sobald ich den Aufruf aus dem laufenden Programm mache kracht es.

Also habe ich testweise den kompletten Code in Create rauskommentiert um auszuschliessen, dass da etwas schief läuft - gleiches Bild.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#4

AW: StyleManger verursacht Stack Overflow

  Alt 12. Aug 2022, 17:25
Im Create ist die Form noch unsichtbar.
Später sichtbar.

Also entweder liegt es an einer Komponente, die bereits gezeichnet wurde und nun da etwas schief steht,
oder es liegt an einem Ereignis, worauf nur sichtbare Komponenten reagieren. (also im Create hätte es auch geknallt, wäre die Form bereits sichtbar gewesen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
RayEn

Registriert seit: 18. Aug 2010
8 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: StyleManger verursacht Stack Overflow

  Alt 12. Aug 2022, 17:36
Im Create ist die Form noch unsichtbar.
Später sichtbar.

Also entweder liegt es an einer Komponente, die bereits gezeichnet wurde und nun da etwas schief steht,
oder es liegt an einem Ereignis, worauf nur sichtbare Komponenten reagieren. (also im Create hätte es auch geknallt, wäre die Form bereits sichtbar gewesen)
Ja klingt logisch - da der Überlauf anscheinend erst beim updaten auftritt - die Funktion TrySetStyle selbst wird ohne Fehler beendet - muss ich wohl mal sukzessive Elemente entfernen um den Übeltäter zu finden.
Oder gibt es eine Routine, wo ich mir sinnvoll einen Breakpoint setzen kann, um zu sehen, welche Komponenten gerade aktuallisiert werden?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.029 Beiträge
 
Delphi 12 Athens
 
#6

AW: StyleManger verursacht Stack Overflow

  Alt 12. Aug 2022, 18:24
Nja, blöd ist ja, dass der Stacktrace vorzeitig abbricht (ein Limit) und man bei einem Stacküberlauf dann nur sieht wo es in der Schleife läuft, aber da wo die Schleife anfing, das bleibt im Dunklen.

Dass es einen Bruch gibt, ist ja OK, aber hier wäre es nett, wenn Emba uns dennoch einen "Alles laden"-Knopf geben würde.
(oder wenn man in der Mitte nach x Einträgen alles weg läßt und dann den Anfang auch noch anzeigt)

Man könnte den zwar den Stackspeicher verrigern ... so klein, damit der Abbruch früher kommt und der Stack noch bis zum Anfang ausgelesen wird .... aber neeeee.



Nja, du siehst ja wo es in der Schleife fest hängt ... da macht man an einen der wiederholenden Stellen einen Haltepunkt.
In CPU-Ansicht oder besser im Code, wenn es das gibt, weil die DLL ja beim nächsten Start wo anders liegen könnte.

Dann neu starten, hoffen, die gewählte Stelle erst beim Überlauf durchlaufen wird.
Ergebnis man ist am Anfang des Überlaufs und sieht daher noch was vorher im Stack steht, also wer für den Überlauf verantworklich ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
RayEn

Registriert seit: 18. Aug 2010
8 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: StyleManger verursacht Stack Overflow

  Alt 7. Sep 2022, 12:26
Hallo,

kurze Rückmeldung zu meinem Problem:

ich hatte das Thema für mich erst mal beerdigt, weil ich bei der Ursachensuche nicht voran gekommen war. Da der Wechsel des Styles 'nur' dann Probleme verursacht hat, wenn das während des Programlaufs versucht wurde, habe ich das einfach in die Startphase (Create) verlegt. Man muss halt dann nach der Auswahl immer einen Neustart des Programms machen, nicht schön funktioniert.

Vorhin habe ich aus einer Laune heraus das Thema noch einmal angeschaut und dabei festgestellt, dass in VCL.Forms CreateParams die Zuweisung WndParent := Application.MainFormHandle in Folge wieder CreateParams aufruft. Passiert aber anscheinend nur, wenn der PopupMode des Hauptfensters auf pmExplicit gesetzt ist. Das hatte ich wohl beim Testen von Lösungen für mein anderes Problem (Hauptformular blieb durch andere Formulare verdeckt, obwohl es ausgewählt war) auf pmExplicit gestellt - zurück auf pmNone gestellt und alles ist OK.

Habe das Ganze auch mal in einem Testprojekt probiert: Formular, dass einen Button enthält, der dann StyleManager.TrySetStyle('Sky') aufruft - sobald im (Haupt)Formular pmExplicit gesetzt ist, bekomme man einen Stack Overflow.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: StyleManger verursacht Stack Overflow

  Alt 7. Sep 2022, 13:10
Formular, dass einen Button enthält, der dann StyleManager.TrySetStyle('Sky') aufruft - sobald im (Haupt)Formular pmExplicit gesetzt ist, bekomme man einen Stack Overflow.
Hört sich nach einer guten Vorlage für einen Bugreport an.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: StyleManger verursacht Stack Overflow

  Alt 7. Sep 2022, 15:41
Ich habe es einmal kurz ausprobiert. Der Stacktrace wird bei mir komplett angezeigt.

Das Problem ist sehr einfach erklärt:
Es wird im Zuge des Änderns des Styles ein CM_RECREATEWND geschickt. Das sorgt dafür, dass das Fensterhandle neu erzeugt wird. Nun ist es dummerweise so, dass TCustomForm.CreateParams so aussieht:
Delphi-Quellcode:
          pmExplicit:
            begin
              if Assigned(FPopupParent) and not (csDesigning in ComponentState) then
              begin
                WndParent := FPopupParent.Handle;
                LParent := FPopupParent;
              end
              else
                WndParent := Application.MainFormHandle;
Sprich, wenn der PopupMode auf pmExplicit steht, wird dort auf Application.MainFormHandle zurückgegriffen. Das existiert ja gerade nicht, also wird dort wiederum ein neues Handle erzeugt, aber dummerweise gibt es das nicht, also wird ein neues Handle erzeugt, aber dummerweise... ihr versteht.

Da ja offenbar immer noch kein Bugreport vorhanden ist (ich konnte auch keinen finden, habe z.B. nach pmExplicit gesucht), habe ich das nun erledigt:
https://quality.embarcadero.com/browse/RSP-39019
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke ( 7. Sep 2022 um 15:43 Uhr)
  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 07:33 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