Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.537 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer

  Alt 27. Nov 2015, 19:01
Zitat:
Im Prinzip dürfte es ja nicht schwer sein, das sowohl für die VCL und FMX selber nachzubauen: Gewünschte Komponenten auf die Form und die entsprechenden Routinen zum laden der Styles einbauen.
Von wegen, das ist doch Fummelprogrammierung. Nur mit Deiner Hilfe bin ich weitergekommen. Für die Praxis ist diese Art von Programmierung nicht geeignet, da man den Aufwand nicht einschätzen kann.
Ich bin mir nicht ganz sicher was Du meinst. Gut, es hängt natürlich immer ein wenig von der Erfahrung ab, die man mit dem einen oder anderen Bereich gesammelt hat. Wenn das eine oder andere Neuland ist, ist es sicher nicht ganz so einfach, wie ich das mal so locker von mir gegeben habe.

Einen VCL-Style kann man in der Tat nur einmal laden, beim 2. Mal gibt es eine Exception. Sollte man vermeiden, da es da z.T. zu anderen Problemen kommen kann. Daher muss man sich merken, ob der Style schon geladen wurde.

Auf der VCL-Seite ist es ein wenig tricky zu prüfen, ob der Style schon geladen ist, da Style-Name und Style-Dateiname nicht immer gleich sein müssen, da gibt es dann schon mal Probleme. Ich merke mir daher Dateiname und Name des Styles in einer Stringliste. Ich verwende in meinen Programmen immer so einen Auswahl-Dialog (siehe Screenshot), wo man sich den gewünschten Style auswählen und aktivieren kann.

Hier mal ein Auszug vom Source-Code, der Dir vielleicht eine Idee gibt, wie man das lösen kann (GetFieldStr ist eine eigene Prozedur, welche Elemente in einem String, getrennt durch ein betimmtes Feldtrennzeichen zurück liefert):

Delphi-Quellcode:
procedure hs_ChangeDesign(sMenu: string);
var
  OK: Boolean;

  // Prüfen, ob der Style schon geladen wurde
  function StyleIsLoaded (var s: string): boolean;
  var i: Integer;
  begin
    result := false;
    for I := 0 to slStyles.Count-1 do begin
      if GetFieldStr ('=', slStyles[i], 1) = s then begin
        s := GetFieldStr ('=', slStyles[i], 2); // den Namen des Styles ermitteln und zurückgeben
        Result := True;
        break;
      end;
    end;
  end;

begin
  ProgStyle := sMenu;

  if ProgStyle = '*Windowsthen begin
    TStyleManager.SetStyle('Windows');
  end else begin
    if TStyleManager.IsValidStyle(chkPath (AppPath) + SMenu) then begin
      if FileExists (chkPath (AppPath) + sMenu) then begin
        try
          OK := StyleIsLoaded (sMenu);

          if OK then begin
            // Style ist schon geladen, SetStyle kann verwendet werden
            TStyleManager.SetStyle(sMenu);
          end else begin
            // Style noch nicht geladen, muss erst geladen werden, dann zur Merkliste hinzufügen
            TStyleManager.SetStyle(TStyleManager.LoadFromFile(chkPath (AppPath) + sMenu));
            slStyles.add (Progstyle + '=' + TStyleManager.ActiveStyle.Name);
          end;
        except
        end;
      end;
    end else begin
      TStyleManager.TrySetStyle('Windows');
    end;
  end;
end;
Vom Ablauf ist es so, dass der Dialog beim Aufruf prüft, welche Style-Dateien im Programmverzeichnis liegen und liest die dann in die Dropdown-Box ein (zum Programmstart wird natürlich schon ein Style geladen, der ist dann schon in der zuvor von mir erzeugten Style-Liste - slStyles - drin).

Vielleicht kennt aber auch jemand anders noch eine einfachere Variante.
Miniaturansicht angehängter Grafiken
styles.jpg  
  Mit Zitat antworten Zitat