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/)
-   -   Crash beim VCL Stil Wechsel zur Laufzeit (https://www.delphipraxis.net/212228-crash-beim-vcl-stil-wechsel-zur-laufzeit.html)

TurboMagic 7. Jan 2023 17:13


Crash beim VCL Stil Wechsel zur Laufzeit
 
Hallo,

in meinem D11.2 VCL Projekt gibt's manchmal einen Absturz im Dialog zur Stylauswahl wenn ich den Stil wechsle.

Mit folgendem Code wechsel ich den Stil, lb_Styles ist dabei eine Listbox die alle verfügbaren Stile enthält:

Delphi-Quellcode:
  Application.MainForm.ActiveControl := nil;
  TStyleManager.TrySetStyle(lb_Styles.Items[lb_Styles.ItemIndex]);
Leider passiert der Absturz nur in manchen Programmsitzungen und gerade mal wieder nicht, somit gibt's leider
keinen Stacktrace.

Irgendwer noch eine Idee woher das kommen könnte bzw. was man dagegen tun kann?
Ich glaube mich auch zu erinnern, dass das Thema schon mal diskutiert wurde, kann mich aber nicht mehr genau
erinnern wo und finde es somit gerade auch nicht mehr.

Grüße
TurboMagic

TiGü 9. Jan 2023 08:34

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Steht die Property
Delphi-Quellcode:
PopupMode
eines deiner Formulare auf
Delphi-Quellcode:
pmExplicit
?
Der https://quality.embarcadero.com/browse/RSP-39019 ist in 11.2 immer noch fehlerhaft und ungelöst.
Vgl: https://www.delphipraxis.net/211199-...-overflow.html

KodeZwerg 9. Jan 2023 16:48

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
In meinem kzTheming Projekt nutze ich folgenden Code um ein Menu Eintrag automatisch mit Styles zu versorgen und ein Event zum wechseln aufzurufen.

Hiermit fülle ich einen Menü Eintrag mit allen Styles die ich mitgegeben habe:
Delphi-Quellcode:
procedure kzTheme.AddNativeStyle(const AMenuItem: TMenuItem);
  procedure AddMenuEntry(const ACaption: string; const AValue: Integer);
  var
    Item: TMenuItem;
  begin
    Item := TMenuItem.Create(FMenuItem);
    Item.Caption := ACaption;
    Item.OnClick := NativeStyleClick;
    Item.AutoCheck := False;
    Item.RadioItem := False;
    Item.Checked := TStyleManager.ActiveStyle.Name = ACaption;
    if ((AValue) mod 10) = 0 then
      Item.Break := mbBarBreak;
    FMenuItem.Add(Item);
  end;
var
  Arr: TArray<string>;
  SystemStyle: string;
  FoundStyle: String;
  i: Integer;
begin
  FMenuItem := AMenuItem;
  FMenuItem.Clear;
  FMenuItem.AutoLineReduction := maAutomatic;

  Arr := TStyleManager.StyleNames;
  TArray.Sort<string>(arr);
  SystemStyle := TStyleManager.SystemStyle.Name;
  AddMenuEntry(SystemStyle, 0);

  i := 1;
  for FoundStyle in Arr do
  begin
    if FoundStyle <> SystemStyle then
    begin
      AddMenuEntry(FoundStyle, i);
      Inc(i);
    end;
  end;
end;
Diese Methode wird für jeden Menu Eintrag aufgerufen:
Delphi-Quellcode:
procedure kzTheme.NativeStyleClick(Sender: TObject);
var
  StyleName: String;
  i: Integer;
begin
  StyleName := StripHotkey(TMenuItem(Sender).Caption);
  TStyleManager.SetStyle(StyleName);
  (Sender as TMenuItem).Checked := true;
  for i := 0 to Pred(FMenuItem.Count) do
    if (not FMenuItem.Items[i].Equals(Sender)) then
      FMenuItem.Items[i].Checked := false;
end;
Aufzurufen als
Delphi-Quellcode:
AddNativeStyle(MeinMenu);
.

Ich hoffe es hilft Dir weiter.

TurboMagic 9. Jan 2023 19:49

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von TiGü (Beitrag 1517204)
Steht die Property
Delphi-Quellcode:
PopupMode
eines deiner Formulare auf
Delphi-Quellcode:
pmExplicit
?
Der https://quality.embarcadero.com/browse/RSP-39019 ist in 11.2 immer noch fehlerhaft und ungelöst.
Vgl: https://www.delphipraxis.net/211199-...-overflow.html

Muss ich prüfen, die Form ist modal.

TurboMagic 9. Jan 2023 20:04

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von KodeZwerg (Beitrag 1517241)
Diese Methode wird für jeden Menu Eintrag aufgerufen:
Delphi-Quellcode:
procedure kzTheme.NativeStyleClick(Sender: TObject);
var
  StyleName: String;
  i: Integer;
begin
  StyleName := StripHotkey(TMenuItem(Sender).Caption);
  TStyleManager.SetStyle(StyleName);
  (Sender as TMenuItem).Checked := true;
  for i := 0 to Pred(FMenuItem.Count) do
    if (not FMenuItem.Items[i].Equals(Sender)) then
      FMenuItem.Items[i].Checked := false;
end;
Ich hoffe es hilft Dir weiter.

Die ruft doch auch nur TStyleManager.SetStyle auf. Oder hab's ich was übersehen? Der Rest ist ja nur die Integration in ein TMenu...

Aber danke!

TurboMagic 9. Jan 2023 21:34

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von TiGü (Beitrag 1517204)
Steht die Property
Delphi-Quellcode:
PopupMode
eines deiner Formulare auf
Delphi-Quellcode:
pmExplicit
?
Der https://quality.embarcadero.com/browse/RSP-39019 ist in 11.2 immer noch fehlerhaft und ungelöst.
Vgl: https://www.delphipraxis.net/211199-...-overflow.html

Sowohl die Form zur Selektion des Stils als auch MainForm haben PopupMode = pmNone.
Die Stil Selektionsform hat FormStyle fsNormal und wird per ShowModal aufgerufen,
wobei das Hauptformular der Owner ist.

Grüße
TurboMagic

jaenicke 10. Jan 2023 07:57

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Hast du kein Logging drin, um den Stracktrace im Fehlerfall zu bekommen?

Gausi 10. Jan 2023 08:44

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Greifst du irgendwo auf die Handles der Form oder anderer Komponenten zu? Beim Wechsel des Styles werden ja alle Elemente neu erzeugt, wodurch die Handles ungültig werden ...

KodeZwerg 10. Jan 2023 09:12

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von TurboMagic (Beitrag 1517255)
Zitat:

Zitat von KodeZwerg (Beitrag 1517241)
Diese Methode wird für jeden Menu Eintrag aufgerufen:
Delphi-Quellcode:
procedure kzTheme.NativeStyleClick(Sender: TObject);
var
  StyleName: String;
  i: Integer;
begin
  StyleName := StripHotkey(TMenuItem(Sender).Caption);
  TStyleManager.SetStyle(StyleName);
  (Sender as TMenuItem).Checked := true;
  for i := 0 to Pred(FMenuItem.Count) do
    if (not FMenuItem.Items[i].Equals(Sender)) then
      FMenuItem.Items[i].Checked := false;
end;
Ich hoffe es hilft Dir weiter.

Die ruft doch auch nur TStyleManager.SetStyle auf. Oder hab's ich was übersehen? Der Rest ist ja nur die Integration in ein TMenu...

Aber danke!

Das ist korrekt, nur leider weiß ich nicht wie Du Deine ListBox füllst, deswegen mein detaillierter Kode.

TurboMagic 10. Jan 2023 11:59

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von jaenicke (Beitrag 1517277)
Hast du kein Logging drin, um den Stracktrace im Fehlerfall zu bekommen?

Doch, aber es tritt nicht jedes Mal oder auf allen Rechnern auf und beim letzten Crash hab' ich
leider den Trace nicht gespeichert, weil ich gedanklich da gerade an was anderem war.

TurboMagic 10. Jan 2023 17:42

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,

ich konnte jetzt so einen Crash nachstellen. Wenn ich mit der Tastatur in der Listbox navigiere,
wechselt das Fenster auf den dann selektierten Stil.

Anbei ein Stacktrace und wenn ich meine Fehlermeldung wegklicke und danach zum Windows Stil
wechseln will (evtl. aber auch zu anderen), kommt FastMM um die Ecke und hat noch einen ungültigen
Speicherzugriff.

Habe das mal als Textdateien angehängt. Soweit ich das sehe hat es wohl mit dem Tastaturhandling
zu tun und tritt nicht immer gleich auf.

Die FastMM Meldung scheint nur in Verbindung mit dem zurück wechseln auf den Windows Stil per Tastatur aufzutreten,
wenn vorher der andere Crash passiert ist.

Anbei auch ein Screenshot des Dissasemblies wenn der Crash auftritt.

Der Dialog zur Stilwahl hat eine ListBox mit den Stilen drin und die hat nur dieses OnClick Ereignis:

Delphi-Quellcode:
  Application.MainForm.ActiveControl := nil;
  ActiveControl := nil;
  StyleName    := lb_Styles.Items[lb_Styles.ItemIndex];
  Repaint;
  ActiveControl := lb_Styles;
Grüße

TurboMagic

jaenicke 10. Jan 2023 20:41

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Versuche einmal das Setzen des Styles von dem OnClick abzukoppeln:
Delphi-Quellcode:
  TThread.ForceQueue(nil, procedure
    begin
      TStyleManager.TrySetStyle(lb_Styles.Items[lb_Styles.ItemIndex]);
    end);

TurboMagic 11. Jan 2023 07:21

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von jaenicke (Beitrag 1517317)
Versuche einmal das Setzen des Styles von dem OnClick abzukoppeln:
Delphi-Quellcode:
  TThread.ForceQueue(nil, procedure
    begin
      TStyleManager.TrySetStyle(lb_Styles.Items[lb_Styles.ItemIndex]);
    end);

Danke für den Tipp, ist heute Abend einen Versuch wert!

TiGü 11. Jan 2023 07:59

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Das mit den Repaint sieht komisch aus, brauchst du das zum aktualisieren?

Magst du uns nicht ein kleines Testprogramm stricken und als ZIP-Archiv anhängen?

TurboMagic 11. Jan 2023 18:43

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von TurboMagic (Beitrag 1517322)
Zitat:

Zitat von jaenicke (Beitrag 1517317)
Versuche einmal das Setzen des Styles von dem OnClick abzukoppeln:
Delphi-Quellcode:
  TThread.ForceQueue(nil, procedure
    begin
      TStyleManager.TrySetStyle(lb_Styles.Items[lb_Styles.ItemIndex]);
    end);

Danke für den Tipp, ist heute Abend einen Versuch wert!

Versuch erstmal am Compiler gescheitert :(
Der sagt E2003 Undeclared identyfier bei TThread.
Ich kann auch nicht Cltr-Click auf ForceQueue machen.
Unit System.CLasses ist aber eingebunden.
Rufe ich das fully quallyfied mittels System-CLasses.TThread auf, meint
der Compiler E2003 zu System, aber Ctrl-Click auf ForceQueue springt zu
deren Implementierung.

Kommentiere ich diese 3 Zeilen aus, gibt's kein Gemecker mehr...

Was nun?

Anbei mal das kleine Testprojekt. Wenn's dumm läuft hab' ich da ein paar Stile reingenommen die
ich aus GetIt nachinstalliert habe, aber über Projektoptionen/Erscheinung kann man beliebige
Stile wählen, das Problem tritt denke ich trotzdem auf.

mytbo 11. Jan 2023 20:49

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von TurboMagic
Was nun?

Delphi-Quellcode:
const
  WM_FORMSTYLECHANGED = WM_USER + 779;

  Tf_SelectStyle = class(TForm)
  private
    procedure WMFormStyleChanged(var pmvMessage: TMessage);
      message WM_FORMSTYLECHANGED;

procedure Tf_SelectStyle.WMFormStyleChanged(var pmvMessage: TMessage);
begin
  StyleName := lb_Styles.Items[pmvMessage.LParam];
end;

procedure Tf_SelectStyle.lb_StylesClick(Sender: TObject);
begin
  PostMessage(Handle, WM_FORMSTYLECHANGED, 0, lb_Styles.ItemIndex);
end;
Sehen aufgestylte Oberflächen alle so gewöhnungsbedürftig aus? Da bleibe ich lieber bei der Windows Klötzchen-Optik.

Bis bald...
Thomas

Uwe Raabe 11. Jan 2023 21:18

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von TurboMagic (Beitrag 1517343)
Versuch erstmal am Compiler gescheitert :(
Der sagt E2003 Undeclared identyfier bei TThread.

Anstatt den Code per Copy-Paste aus dem Forum zu nehmen, gib ihn doch besser mal von Hand ein. Manchmal kommt irgendwelcher Müll aus dem Browser. Alternativ kannst du auch die führenden Leerzeichen löschen.

jaenicke 11. Jan 2023 21:24

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von TurboMagic (Beitrag 1517343)
Der sagt E2003 Undeclared identyfier bei TThread.

Du hast da Leerzeichen, die keine sind. ;-)
Schau mal im Hexeditor:
Anhang 55735

Ach ja, und wegen dem cChangeInThread:
ForceQueue sorgt dafür, dass der Code wie aus einem Thread kommend in die Warteschlange kommt und abgekoppelt abgearbeitet wird, obwohl man schon im Hauptthread ist. Es wird also nichts in einem anderen Thread gemacht.

himitsu 11. Jan 2023 22:02

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Ja, aktuelle Browser (z.B. Firefox) kopieren Tabulatoren und NonBreakingSpaces seit einer Weile nicht mehr als Leerzeichen, sondern als das was sie sind. (obwohl sie immernoch als Leerzeichen im Browser angezeigt werden)

Leider muß das Forum aber die mit diesem Zeichen auffüllen, da der Browser sonst mehrere Leerzeichen wie EINES behandelt und dann die Einrückung hier nicht mehr stimmt.


Bissl blöd das Ganze, wenn man es direkt aus dem Thread kopiert.
Zitieren (nicht absenden) und daraus kopieren geht aber.


Zitat:

Ich kann auch nicht Cltr-Click auf ForceQueue machen.
Natürlich nicht,

Wenn bereits die Klasse/Namespace nicht gefunden wurde, woher soll jemand dann wissen worin ForceQueue gesucht werden soll?

Wenn, dann auf TThread klicken, was aber auch nicht geht weil er kennt es ja nicht.
* z.B. weil die nötige Unit nicht im USES steht
* oder weil durch blöde unsichtbare Sonderzeichen, welche zufällig als "Buchstabe" behandelt werden, es nicht 'TThread' heißt, sondern #160'TThread' und das gibt es natürlich nicht, selbst wenn die vermeintlich richtige Unit eingebunden ist

TurboMagic 12. Jan 2023 07:49

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von mytbo (Beitrag 1517347)
Zitat:

Zitat von TurboMagic
Was nun?

Sehen aufgestylte Oberflächen alle so gewöhnungsbedürftig aus? Da bleibe ich lieber bei der Windows Klötzchen-Optik.

Bis bald...
Thomas

Die Bemerkung verstehe ich noch nicht ganz, speziell nicht ohne Screenshot.
Von welchem Stil redest du? Hast du verschiedene angeschaut? Was ist daran gewöhnungsbedürftig?

Gräüße
TurboMagic

mytbo 12. Jan 2023 19:12

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von TurboMagic
Die Bemerkung verstehe ich noch nicht ganz, speziell nicht ohne Screenshot.

Bei mir sehen die Elemente auf der gestylten Oberfläche zu dominant aus. Die Images wirken unproportional, viel zu groß und das Symbol Halteverbot ist unten gekappt. Vielleicht muss es auch so sein. Das Thema VCL Styling ist für mich Neuland. Für externe Arbeiten war Stylen noch nicht gefordert und für eigene Projekte schreibe ich die Oberflächen mit Hilfe eines Layout-Builders. Der ordnet automatisch alles pixelgenau an. Mein bevorzugter Stil ist Flat Style mit 3D-Effekt für das aktive Element. Man hängt am lieb Gewonnenen.

PS: Ich hoffe, du hast meinen Kommentar als Verwunderung und nicht als Beurteilung aufgefasst.

Bis bald...
Thomas

TurboMagic 13. Jan 2023 07:06

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Aha, du bewertest die Stile anhand meiner kleinen Testanwendung?
Naja, die wurde nur schnell "zusammengenagelt" um das Problem zu zeigen.
Da wurde nicht wirklich drauf geachtet, dass Buttongrößen etc. zu den Icongrößen
passen etc., das liegt also nicht am Stil.

Du kannst ja deine VCL-Anwendung mal mit einem anderen Stil testhalber ausführen.
Projekt/Optionen/Erscheinungsbild. Dort einen Stil ankreuzen und unten in der Combobox
auswählen. Dann Programm starten. Im Dialog gibt's glaube ich auch eine Vorschau, bzw.
Delphi 11.2 kann jetzt einen Stil im FOrm Designer nutzen, dann sieht man's gleich beim
Designen.

Grüße

TurboMagic

TurboMagic 13. Jan 2023 17:24

AW: Crash beim VCL Stil Wechsel zur Laufzeit
 
Zitat:

Zitat von jaenicke (Beitrag 1517317)
Versuche einmal das Setzen des Styles von dem OnClick abzukoppeln:
Delphi-Quellcode:
  TThread.ForceQueue(nil, procedure
    begin
      TStyleManager.TrySetStyle(lb_Styles.Items[lb_Styles.ItemIndex]);
    end);

So, wenn man die unsichtbaren falschen Zeichen die in durch die Webseite
reinkamen rausmacht, scheint das eine funktionierende Lösung zu sein.

Aber mal sehen, evtl. gibt's in 11.3 dann auch einen anderen Lösungsansatz...

Grüße
TurboMagic


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