AGB  ·  Datenschutz  ·  Impressum  







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

TStylemanager verwenden

Ein Thema von Delbor · begonnen am 4. Jun 2017 · letzter Beitrag vom 5. Jun 2017
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

TStylemanager verwenden

  Alt 4. Jun 2017, 15:14
Delphi-Version: XE8
Hi zusammen

Wennich schon beim austesten bin, dann kann ich auch mal die Sachenn um TStylemanager ausprobieren - dachte ich mir und hab dann zur Designtime ein Style eingebunden. Damit sieht dann meine Projektunit so aus:
Delphi-Quellcode:
program SQLiteTestProject;

uses
  Vcl.Forms,
  SQLiteTestMainUnit in 'SQLiteTestMainUnit.pas{SQLiteTestMain},
  DMLSQLiteUnit in 'DMLSQLiteUnit.pas{DMLSQLite: TDataModule},
  PathFinderFrameUnit in 'PathFinderFrameUnit.pas{PathFinderFrame: TFrame},
  Vcl.Themes,
  Vcl.Styles,
  ModifyBitClass in 'ModifyBitClass.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  TStyleManager.TrySetStyle('Golden Graphite');
  Application.CreateForm(TSQLiteTestMain, SQLiteTestMain);
  Application.Run;
end.
Und da vermeinte ich doch den Fehler gleich zu sehen: unter uses sind Vcl.Themes und Vcl.Styles aufgeführt. Ich hingegen hatte in meiner Unit nur gerade eine der beiden eingebunden...(**)

So verpasste ich der Mainform eine Combobox, über die einer der verfügbaren Styles ausgewählt werden kann/soll:
Delphi-Quellcode:
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
...
  Vcl.Buttons, Vcl.Samples.Spin, Vcl.Menus, Vcl.Themes, Vcl.Styles;

//** Wie ich schon angedeutet habe, war hier erstmal nur VCL.Themes aufgeführt; das Hinzufügen von VCL.Styles hat jedoch nichts geändert


procedure TSQLiteTestMain.CmbxStylesCloseUp(Sender: TObject);
begin
  CmbxStyles.Items.AddStrings(TStylesManager);
end;
Bei ersten Tests ist mal alles themenbezogene hier in dieser Prozedur. Ausgelagert kann, soweit sinnvoll, immer noch werden (ZB die Combo bei Programmstart füllen).
Das Problem ist: TStyleManager ist hier unbekannt, auch wenn ich unter Uses beide Units aufführe.
TStyleManager ist als 'sealed' deklariert (Embarcadero.DelhiXE8), es kann also keine Instanz erstellt werden.
Beispielcodes zur Verwendung von TStyleManager habe ich keinen gefunden.

Was läuft da schief?

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TStylemanager verwenden

  Alt 4. Jun 2017, 15:22
Ich kann dir zu deinem eigentlichen Problem keine HIlfe geben. Aber sealed; heißt doch nur, dass eine Ableitung der Klasse erstellt werden kann. Instanziieren kann man die trotzdem.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TStylemanager verwenden

  Alt 4. Jun 2017, 15:54
Hi Aviator
Danke fuer deine Antwort! Eigentlich wollte ich nochmal nach sealed suchen, bin dann aber über das gestolpert.
Da wird auch die Klasse direkt verwendet, ohne eine Instanz zu erstellen.
Und dann hat sich das ganze, zumindest bis jetzt, in Luft aufgelöst:
Ich hatte TStylesManager verwendet. Auf er verlinkten Seite wird aber TStyleManager benutzt.
So kanns also mal weitergehen...

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TStylemanager verwenden

  Alt 4. Jun 2017, 16:25
Hi zusammen
Nun hab ich nochmal nach 'sealed' gesucht und gefunden hab ich das hier und dieses.
Damit dürfte klar sein: es dürfen keine Instanzen erstellt werden.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TStylemanager verwenden

  Alt 4. Jun 2017, 16:30
Damit dürfte klar sein: es dürfen keine Instanzen erstellt werden.
Öhhhmm ...

lies mal die Anmerkung durch (Hervorhebung von mir):
Zitat von Docwiki:
Anmerkung: TKeyCaptions ist "sealed" und kann daher nicht weiter abgeleitet werden.
Oder auch siehe hier: https://www.delphi-treff.de/object-pascal/vererbung

Abschnitt "Versiegelte Klassen".

Heißt also: Instanziieren funktioniert immer. Im Zweifelsfall versuch es doch einfach mal. Mir ist eigentlich kein Fall bekannt, in dem man eine Klasse nicht instanziieren kann. Es sei denn die besitzt nur Class Methods bei denen es keinen Sinn macht. Auch ein Singleton instanziiert man einmal und nimmt sich danach nur noch die bestehende Instanz.
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TStylemanager verwenden

  Alt 4. Jun 2017, 17:24
Hi Aviator

Kann sein, dass ich falsch liege, aber auch eine Instanz ist für mich genaugenommen abgeleitet. Zumindest ist mir hier in der DP kein Thread aufgefallen, der eine Instanz von TStyleManager verwendet hätte.

Am Beispiel eines Panels: Benenne ich es zB. in 'MainPanel' um, steht im Header des OI 'Mainpanel:TMainpanel'

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: TStylemanager verwenden

  Alt 5. Jun 2017, 15:56
Das Problem ist: TStyleManager ist hier unbekannt, auch wenn ich unter Uses beide Units aufführe.
In deinem Sourcecode verwendest du allerdings auch TStylesManager und nicht TStyleManager .

Beispielcodes zur Verwendung von TStyleManager habe ich keinen gefunden.
OK, hier ein bisschen Code für den Anfang. Erstellen eines Sub-Menüs mit allen verfügbaren Styles plus Event zum Wechseln des Style:

Delphi-Quellcode:
  ...
    mnuStyle: TMenuItem;
  private
    FActiveStyle: string;
    procedure SetActiveStyle(const Value: string);
    procedure mnuStyleItemClick(Sender: TObject);
    procedure LoadStyleMenu;
    procedure AddStyleMenuItem(S: string);
  public
    property ActiveStyle: string read FActiveStyle write SetActiveStyle;
  ...

procedure TMainForm.LoadStyleMenu;
var
  arr: TArray<string>;
  S: string;
  systemStyleName: string;
begin
  mnuStyle.Clear;
  arr := TStyleManager.StyleNames;
  TArray.Sort<string>(arr); // alphabetisch sortieren
  systemStyleName := TStyleManager.SystemStyle.Name;
  AddStyleMenuItem(systemStyleName); // Windows immer zuerst
  for S in arr do begin
    if S <> systemStyleName then begin
      AddStyleMenuItem(S);
    end;
  end;
end;

procedure TMainForm.AddStyleMenuItem(const AStyleName: string);
var
  itm: TMenuItem;
begin
  itm := TMenuItem.Create(Self);
  itm.Caption := AStyleName;
  itm.RadioItem := true;
  itm.AutoCheck := true;
  itm.Checked := (AStyleName = TStyleManager.ActiveStyle.Name);
  itm.OnClick := mnuStyleItemClick;
  mnuStyle.Add(itm);
end;

procedure TMainForm.mnuStyleItemClick(Sender: TObject);
begin
  ActiveStyle := (Sender as TMenuItem).Caption;
end;

procedure TMainForm.SetActiveStyle(const Value: string);
begin
  if FActiveStyle <> Value then begin
    FActiveStyle := Value;
    if FActiveStyle = 'then begin
      TStyleManager.SetStyle(nil);
    end
    else begin
      TStyleManager.TrySetStyle(FActiveStyle);
    end;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: TStylemanager verwenden

  Alt 5. Jun 2017, 16:02
Kann sein, dass ich falsch liege, aber auch eine Instanz ist für mich genaugenommen abgeleitet.
Ne, da liegst du in der Tat falsch. Die Terminologie "ableiten" ist wirklich nur auf Klassen anzuwenden. Von Klassen mit dem sealed Attribut kannst du auf jeden Fall auch Instanzen erzeugen. Das bezieht sich wirklich nur darauf, dass eine versiegelte Klasse nicht die Oberklasse einer weiteren Klasse sein kann.

Am Beispiel eines Panels: Benenne ich es zB. in 'MainPanel' um, steht im Header des OI 'Mainpanel:TMainpanel'
Du meinst vermutlich "Mainpanel: TPanel"? Das soll aber auch keine Ableitungsrelation aufzeigen, sondern einfach nur, dass die Instanz mit dem Namen "Mainpanel" vom Typ "TPanel" ist.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  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 00:46 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