Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 264
Erhaltene Danke: 12



BeitragVerfasst: Mo 21.11.22 15:55 
Hallo zusammen,
Unter den Compilereinstellungen Projekt/Optionen/Erscheinungsbild kann man ein gegenüber Windows-Standard abweichende Farbdarstellung der grapfischen Oberfläche wählen, z.B. Windows-Dark. Ja nach Tageslicht hätte ich gern einmal eine normale dann eine dunkle Darstellung. Wirksam wird jedoch eine hellle/dunkle Darstellung erst nach dem Compilieren und ist fest im Programm verankert.
Frage: gibt eine einfache Möglichkeit zur Laufzeit die Farbdarstellung zu wechseln?
MfG hRb
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19152
Erhaltene Danke: 1710

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 21.11.22 22:07 
Meinst du vielleicht TStyleManager.TrySetStyle?
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 264
Erhaltene Danke: 12



BeitragVerfasst: Mi 30.11.22 00:38 
Hallo jaenicke
Vielleicht ist es das. Konnte es aber nicht testen. Habe keine Erfahrung mit Class-Definitionen
Folgenden Code versuchte ich
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Style1Click(Sender: TObject);
begin //normal hell
  TStyleManager.Setstyle('');
end;

procedure TForm1.Style2Click(Sender: TObject);
begin  //dunkel
  TStyleManager.Setstyle('Windows10 Dark');
end;

Dies brachte Laufzeitfehler, mit der Meldung "Stil 'Windows10 Dark' " bzw "Stil '' " nicht gefunden.
Wollte dann den aktuellen Stil ermitteln mit.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Style2Click(Sender: TObject);
var s :string;
begin
  s:= TStyleManager.Setstyle;
end;

Dies liefert beim Compilieren Fehler: E2010 Inkompatible Typen: 'string' und 'TCustomStyleServices', d.h. es fehlt die overload-Anweisung wie in der Hilfe beschrieben.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  public
    { Public-Deklarationen }
    class procedure SetStyle(const Name: string); overload;
  end;

Hier komme ich nicht weiter. Setstyle ist nicht bekannt An welcher Stelle im Programm muss eine dieser Anweisungen stehen?
ausblenden Delphi-Quelltext
1:
2:
3:
class procedure SetStyle(const Name: string); overload;
class procedure SetStyle(Style: TCustomStyleServices); overload;
class procedure SetStyle(Handle: TStyleServicesHandle); overload;

Weiß also nicht nicht wie man die in Delphi vorgegebenen Stile anspricht. Gibt es dafür Constanten?
siehe SetStyle
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4699
Erhaltene Danke: 1026

Win10
C#, C++ (VS 2015/17/19)
BeitragVerfasst: Mi 30.11.22 08:01 
Ich habe einfach mal die TStyleManager Eigenschaften in der Doku durchgeschaut:
- StyleNames
- Style[Name]
bzw. gezielt
- SystemStyleName

PS: Da SetStyle eine Prozedur ist, mußt du entweder nach einer passenden Eigenschaft oder der zugehörigen Get-Funktion suchen, in diesem Fall also GetStyle (nur ist diese hier [eigenartigerweise] protected, also bleibt nur der Zugriff über die public Eigenschaften).
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19152
Erhaltene Danke: 1710

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 30.11.22 08:20 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Dies brachte Laufzeitfehler, mit der Meldung "Stil 'Windows10 Dark' " bzw "Stil '' " nicht gefunden.
Hast du die entsprechenden Stile denn in den Projektoptionen angehakt? Sonst werden diese nicht mit einkompiliert.

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Folgenden Code versuchte ich
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Style1Click(Sender: TObject);
begin //normal hell
  TStyleManager.Setstyle('');
end;
Das wird nicht gehen. Leere Stilnamen gibt es nicht.

Tipp:
Den Namen für den Standardstil findest du unten in der Combobox: Windows ;-)
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 264
Erhaltene Danke: 12



BeitragVerfasst: Mi 30.11.22 22:06 
Zitat:
Hast du die entsprechenden Stile denn in den Projektoptionen angehakt? Sonst werden diese nicht mit einkompiliert.

Ok, war mir nicht bewusst. Dachte mit der Einbindung der Unit VCL.Themes auch die Standard-Style dabei zu haben. Nach dem Hinweis die Styles "einzubinden" d,h, angekreuzt zu lassen, war auch klar dass ein Style-Typ ohne Name [''] nicht funktioniert: korrekt muss es 'Windows' lauten.
Folgendes Ergebnis erhalte nach Einbindung:
Bei Klick auf Style 2 (Dunkel) = 'Windows10 Dark' erscheint nachstehende Fehlermeldung (s. Anhang Image2)
Nach Fortsetzen erscheint noch eine Meldung über Zugriffsverletzung (s. Anhang Image3), aber die gewünschte Oberfläche erscheint.
Nach diesen beiden (ignorierten) Meldungen kann ich beliebig zwischen Style1 und Style2 hin- und herschalten OHNE WEITERE FEHLERMELDUNG!
Bleibt also nur noch die Frage, warum die Fehlermeldung.
Allerdings: nehme ich meine exe aus dem Ordner des Compilers heraus in einen fremden Ordner, gibt es keine Meldungen, d.h es könnte trotz dieser Meldungen alles ok sein.
Ein Problem mit verschiedenen Styles besteht noch (ist auch in den Hilfen erwähnt). Ich habe in meiner Anwendung ein Panel alButtom, in dem ich Anwenderfehlermeldungen anzeige. Dieses Panel färbe ich je nach Fehlergrad unterschiedlich ein. Dieses Umfärben funktioniert bei 'Windows10 Dark' nicht mehr. Weiterhin färben sich Icon-Symbole nicht mit um, d.h. schwarze Pixel werden nicht weiß. Also so easy wie es zunächst mit anderen Styles aussieht, ist es nicht.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von hRb am Mi 30.11.22 22:18, insgesamt 1-mal bearbeitet
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 264
Erhaltene Danke: 12



BeitragVerfasst: Mi 30.11.22 22:16 
Noch eine Ergänzung:
Laut Doku werden Styles in vsf-Dateien gespeichert. Habe schon geglaubt mit Loadfromfile arbeiten zu müssen. Dies ist mit dem Hinweis von jaenicke, die gewünschten Styles anzukreuzen, offenbar nicht notwendig (sofern man sich mit den Varianten unter Objekt/Optionen begnügt).
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19152
Erhaltene Danke: 1710

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 30.11.22 22:33 
Ich bekomme hier keine Fehler. Vielleicht hast du Komponenten, die mit den VCL-Styles nicht klarkommen?
Wenn du das Problem in einem Beispielprojekt reproduzieren kannst, das du hier anhängen kannst, schaue ich es mir gern an.

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Ein Problem mit verschiedenen Styles besteht noch (ist auch in den Hilfen erwähnt). Ich habe in meiner Anwendung ein Panel alButtom, in dem ich Anwenderfehlermeldungen anzeige. Dieses Panel färbe ich je nach Fehlergrad unterschiedlich ein.
Dafür ist ein Panel nicht geeignet. Versuche es mal mit TShape.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 264
Erhaltene Danke: 12



BeitragVerfasst: Di 06.12.22 17:28 
Hallo jaenicke,
1. das Angebot klingt gut. Inzwischen habe ich alle möglichen Farbdesign durchprobiert und nun tritt der Fehler auch bei mir nicht mehr auf (auch bei einem komplett neu erstellten Programmbeispiel). Also lassen wir es als Phänomen stehen. Vielleicht kommt es bei einem anderen Programm wieder mal vor.
2.
Zitat:
Vielleicht hast du Komponenten, die mit den VCL-Styles nicht klarkommen?

Ja, z.B. die Hintergrundfarbe eines Panel oder bei Richedit.
Zitat:
Dafür ist ein Panel nicht geeignet. Versuche es mal mit TShape.

(Warum zeichnen?, will doch nur Text ausgeben?)
Auf dem Panel liegt natürlich noch ein Label zur Textausgabe.
Bei Warnmeldungen z.B.: Panel = Rot und Labelcolor = weiß,
Bei Hinweismeldungen: Panel = Grün und Labelcolor = schwarz
Dies funktioniert bei Style Windows wie gewünscht, nicht aber bei anderen Styles.
Ich habe mal ein kleines Testprogramm beigefügt. Unter Style Windows ist alles ok aber schon bei Windows10 funktioniert es nicht wie programmiert. Da scheint so manches offen, bzw bei Style-Wechsel muss vieles nachgearbeitet werden.
Bei der Gelegenheit: Warum bekommt ein komplett neu erzeugtes Programm Dateinamen mit Nr 4 (project4.dproj)?
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19152
Erhaltene Danke: 1710

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 06.12.22 21:32 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
(Warum zeichnen?, will doch nur Text ausgeben?)
Auf dem Panel liegt natürlich noch ein Label zur Textausgabe.
Ein Panel hat mit Themes per Definition keine Hintergrundfarbe, ein TShape aber schon. Wenn du das TShape hinter das Label auf das Panel legst, kannst du Brush.Color setzen, um die Hintergrundfarbe zu setzen.

user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
Bei der Gelegenheit: Warum bekommt ein komplett neu erzeugtes Programm Dateinamen mit Nr 4 (project4.dproj)?
Dann liegen bereits 3 Projekte im Projekte-Ordner.