Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Delphi Quellcode von VCLStyleViewer u. FMXStyleViewer (https://www.delphipraxis.net/187375-quellcode-von-vclstyleviewer-u-fmxstyleviewer.html)

Pfaffe 24. Nov 2015 10:51

Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Im Ordner "C:\Program Files (x86)\Embarcadero\Studio\17.0\bin\" liegen die VCLStyleViewer.exe und die FMXStyleViewer.exe.
Ich hätte Interesse am Quellcode diesen Anwendungen. Gibt es den irgendwo? Oder ein anderes gleichwertiges Demo?

Harry Stahl 24. Nov 2015 21:11

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Wäre mir nicht bekannt, dass der Quellcode offen ist.

Für FMX gibt es das "ControlsDemo", im Menü des Demoprogramms gibt es einen Befehl "Load Style".

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.

Pfaffe 25. Nov 2015 14:38

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Zitat:

Für FMX gibt es das "ControlsDemo", im Menü des Demoprogramms gibt es einen Befehl "Load Style".
Das TStyleManager.SetStyle(TStyleStreaming.LoadFromFil e(OpenDialog1.FileName)); in der Demo funktioniert.

In der vcl läuft bei mir ein
TStyleManager.SetStyle(TStyleManager.LoadFromFile( OpenDialog1.FileName);
auf eine Exception, wenn ich zweimal hintereniander den gleichen Style lade. Zudem wird eine OnShow ausgelöst.
Setze ich ein ReportMemoryLeaksOnShutdown := True; dann hagelt es memory leaks.
Auch TStyleManager.UnRegisterStyle(TStyleManager.Active Style); hilft nicht.

Pfaffe 26. Nov 2015 07:41

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Als Alternative zu TStyleManager.SetStyle(TStyleStreaming.LoadFromFil e(OpenDialog1.FileName)) funktioniert auch TStyleManager.SetStyleFromFile(OpenDialog1.FileNam e).
Jetzt suche ich nach einer Möglichkeit wieder auf den Systemstyle umzuschalten. In der Hilfe steht dazu setsystemstyle, diese Methode scheint es aber gar nicht zu geben.
Alles ein bisschen seltsam.:gruebel:

Harry Stahl 26. Nov 2015 21:59

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Kannst Du (grob beschrieben) unter Windows z.B. so machen:

Delphi-Quellcode:
  if FindResource(HInstance, PChar('win8style'), RT_RCDATA) <> 0 then
    TStyleManager.SetStyle(TStyleStreaming.LoadFromResource(HInstance, 'win8style',
     RT_RCDATA));
Da werden die fest verdrahteten Styles geladen. Je nach Windows-Version lädst Du halt "win7style" usw.

Pfaffe 27. Nov 2015 10:12

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Danke, die FMX Variante funktioniert soweit unter Windows. Nur wie ist das unter anderen Betriebssystemen?
Unter der vcl bekomme ich es überhaupt nicht hin.
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.

Harry Stahl 27. Nov 2015 18:01

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Pfaffe (Beitrag 1322674)
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 = '*Windows' then 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.

Pfaffe 28. Nov 2015 20:16

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Hier meine Lösungen:

vcl-Variante
Delphi-Quellcode:
procedure TFStyles.Set_Styles(const FileName: string);
var
  StyleInfo: TStyleInfo;
begin
  if sametext(FileName, 'DEFAULT') then // DEFAULT -> Betriebssystem
    TStyleManager.SetStyle('Windows') // Einstellung unter den Projektoptionen auf WINDOWS lassen
  else
    begin
      if TStyleManager.IsValidStyle(FileName, StyleInfo) then begin // Wenn FileName nicht valide ist, dann wir eine Exception geworfen
        try
          TStyleManager.SetStyle(StyleInfo.Name);
        except
          TStyleManager.SetStyle(TStyleManager.LoadFromFile(FileName)); // OnShow wird ausgelöst
        end;
      end;
    end;
end;
FMX-Varainte
Leider fehlt mir die Defaut Stylebezeichner für iOS und Android. Wenn die Jemand kennt, dann her damit.
Delphi-Quellcode:
procedure TForm1.Set_Styles(FileName: string);
begin
  if sametext(FileName, 'DEFAULT') then // DEFAULT -> Betriebssystem
    begin
      try
        if TOSVersion.Platform = pfWindows then
          begin
            FileName:= 'win' +TOSVersion.Name.Substring(TOSVersion.Name.Length-2).trimleft+ 'style'; // Windows 7,8,10
            if FindResource(HInstance, PChar(FileName), RT_RCDATA) <> 0 then
              TStyleManager.SetStyle(TStyleStreaming.LoadFromResource(HInstance, FileName, RT_RCDATA));
          end
        else // if TOSVersion.Platform = (pfWindows, pfMacOS, pfiOS, pfAndroid, pfWinRT, pfLinux); then
          raise Exception.Create(format('Betriebssystem "%s" wird derzeit nicht unterstützt.', [TOSVersion.ToString]));
      except
      end;
    end
  else
    begin
      TStyleManager.SetStyleFromFile(FileName);
    end;
end;

Pfaffe 28. Nov 2015 22:58

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Zitat:

Ich bin mir nicht ganz sicher was Du meinst.
Ich bin auf Emba ziemlich stinkig. Die Entwicklungsumgebung ist ja nicht gerade billig. Der Preis würde ein untergeordnete Rolle spielen, wenn man den Leistungen von Emba vertrauen könnte. Ich habe nicht die Zeit und auch nicht das Kapital um für Emba in meiner Freizeit den kostenlosen Betatester zu machen.
Unter http://www.embarcadero.com/de/produc...udio/whats-new steht "Embarcadero® RAD Studio™ 10 Seattle ist der schnellste Weg zur Erstellung und Aktualisierung datenintensiver, hochgradig vernetzter und optisch anspruchsvoller Anwendungen für Windows 10, Mac, mobile Geräte ..."
Tatsache ist:
a. Auch nach dem Update 1 läuft die IDE immer noch nicht stabil. Nicht benötigte Packages müssen in der Regiestrie ausgeschaltet werden. Wenn man nicht permanent an den Fenstergrößen rumziehen möchte, muss man sich Zusatztools aus China installieren (wie peinlich). IDEFixPacks werden benötigt.
b. In Hilfedateien stehen falche Dinge, die mich in die Irre führen und mich unproduktive Zeit kosten.
c. Auf der Willkommensseite werde ich mit Werbung bestrahlt, die ich nur mit Hilfe dritter, hier im Forum, abschalten konnte. Wenn es eine Freeware wäre, dann würde ich es akzeptieren, das es keine offizielle Möglichkeit gibt, Werbung auszuschalten.
d. :oops:

Harry Stahl 29. Nov 2015 14:44

AW: Quellcode von VCLStyleViewer u. FMXStyleViewer
 
Zitat:

Zitat von Pfaffe (Beitrag 1322801)
FMX-Varainte
Leider fehlt mir die Defaut Stylebezeichner für iOS und Android. Wenn die Jemand kennt, dann her damit.

Ich habe mal bei verschiedenen "Untersuchungen" folgendes ermittelt:

'ipadstyle' // IOS
'androidstyle' // Android
'lionstyle' // MAC

Habe es selber aber nicht verwendet, da ich im konkreten Fall was anders gemacht habe. Sollte aber funktionierten, den Test muss ich nun Dir überlassen. Funktioniert natürlich nur, wenn das kompilierte Programm auf der jeweiligen Plattform ausgeführt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:43 Uhr.
Seite 1 von 2  1 2      

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