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/)
-   -   [Firemonkey] Styles dynamisch zur Laufzeit ändern (https://www.delphipraxis.net/175494-%5Bfiremonkey%5D-styles-dynamisch-zur-laufzeit-aendern.html)

RWarnecke 25. Jun 2013 21:41

[Firemonkey] Styles dynamisch zur Laufzeit ändern
 
Hallo zusammen,

ich habe mir ein paar eigene Styles erstellt, die wunderbar funktionieren. Jetzt meine Frage, kann ich zum Beispiel in einem Style ein Bitmap (TImage) zur Laufzeit ändern ? Gibt es dazu irgendwelche Anleitungen ?

Edit:
Am besten wäre es, wenn ich die Bitmaps aus Resourcefiles laden könnte.

stahli 25. Jun 2013 23:53

AW: [Firemonkey] Styles dynamisch zur Laufzeit ändern
 
Ich habe mal auf´s Geradewohl ein bischen herum gespielt:

Delphi-Quellcode:
procedure TFormAbfall.Button1Click(Sender: TObject);
var
  O: TFmxObject;
  Ol: TFmxObject;
  Ob: TFmxObject;
begin
  O := FMX.Types.FindStyleResource('checkboxstyle');
  if not Assigned(O) then
    Exit;
  for Ol in O.Children do
  begin
    if Ol.ClassName = 'TLayout' then // if Ol.StyleName = 'layout' then ??
    begin
      for Ob in Ol.Children do
      begin
        if Ob.StyleName = 'background' then
        begin
          if Ob is TSubImage then
          begin
            (Ob as TSubImage).Source.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'as.bmp');
            Exit;
          end;
        end;
      end;
    end;
  end;
end;
Naiver weise dachte ich, so ein Hintergrundbild für meine Checkbox zuzuweisen.
Statt dessen wird das ganze Formular verändert (das Bild als Hintergrund für das Formular verwendet (incl. NoneClient) und alles übrige recht verfälscht).

Vielleicht bringt Dich aber ja davon etwas auf die zündende Idee...


EDIT: "ich habe mir ein paar eigene Styles erstellt, die wunderbar funktionieren" ... sehen wolln

RWarnecke 26. Jun 2013 00:12

AW: [Firemonkey] Styles dynamisch zur Laufzeit ändern
 
Zitat:

Zitat von stahli (Beitrag 1219759)
Ich habe mal auf´s Geradewohl ein bischen herum gespielt:

Delphi-Quellcode:
procedure TFormAbfall.Button1Click(Sender: TObject);
var
  O: TFmxObject;
  Ol: TFmxObject;
  Ob: TFmxObject;
begin
  O := FMX.Types.FindStyleResource('checkboxstyle');
  if not Assigned(O) then
    Exit;
  for Ol in O.Children do
  begin
    if Ol.ClassName = 'TLayout' then // if Ol.StyleName = 'layout' then ??
    begin
      for Ob in Ol.Children do
      begin
        if Ob.StyleName = 'background' then
        begin
          if Ob is TSubImage then
          begin
            (Ob as TSubImage).Source.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'as.bmp');
            Exit;
          end;
        end;
      end;
    end;
  end;
end;
Naiver weise dachte ich, so ein Hintergrundbild für meine Checkbox zuzuweisen.
Statt dessen wird das ganze Formular verändert (das Bild als Hintergrund für das Formular verwendet (incl. NoneClient) und alles übrige recht verfälscht).

Vielleicht bringt Dich aber ja davon etwas auf die zündende Idee...

Danke für Dein Beispiel. Ich habe es sogar noch ein wenig verkürzt :
Delphi-Quellcode:
procedure SetTabItemIcon(TabItemControl: TTabItem; Bitmap: string);
var
  T: TFmxObject;
begin
  if TabItemControl = nil then Exit;
  T := TabItemControl.FindStyleResource('tabicnfile');
  if (T <> nil) and (T is TImage) then
  begin
    TImage(T).Bitmap.LoadFromFile(Bitmap);
  end;
  TabItemControl.Repaint;
end;
Das funktioniert jetzt. Jetzt brauche ich nur noc, dass ich unter Windows die Bitmaps aus Resourcen laden kann.

Zitat:

Zitat von stahli (Beitrag 1219759)
EDIT: "ich habe mir ein paar eigene Styles erstellt, die wunderbar funktionieren" ... sehen wolln

Sind noch nicht ganz fertig. Bis jetzt habe ich beim Treeview nur ein Icon eingesetzt und beim TabItem ein Icon eingesetzt.

stahli 26. Jun 2013 00:29

AW: [Firemonkey] Styles dynamisch zur Laufzeit ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir brachte CheckBox1.FindStyleRessource... immer nil.
Daher der Umweg über die zentrale Ressourcenliste.
Betrifft Deine Änderung dann nur ein einzelnes Tab?

Ich habe mir auch mal einen Style gebastelt (bzw. von einem originalen abgeleitet und erweitert).
Für eigene Komponenten muss man dann allerdings wieder nachbessern, wenn man einen anderen Style verwenden möchte.
Die style.png habe ich mit Gimp verändert.
Das war ziemliche Wurschtelei, auch wenn mir das Ergebnis erst mal gefällt.

Wäre echt mal interessant, ob jemand das Style-Konzept irgendwann plausibel erklären kann (Delphi-Tage?).

PS: Übrigens reicht
Delphi-Quellcode:
if (T is TImage) then
aus. Nil wäre dann false.

RWarnecke 26. Jun 2013 01:07

AW: [Firemonkey] Styles dynamisch zur Laufzeit ändern
 
Zitat:

Zitat von stahli (Beitrag 1219761)
Bei mir brachte CheckBox1.FindStyleRessource... immer nil.
Daher der Umweg über die zentrale Ressourcenliste.
Betrifft Deine Änderung dann nur ein einzelnes Tab?

Ja, es betrifft erstmal nur ein einzelnes Tab, genau das was Du der Procedure übergibst. Sicherlich kann man da noch mehr draus machen. Aber für den ersten Moment reicht mir das erstmal so.

Habe auch noch Probleme die Bitmaps unter Mac OSX zu laden, hat hier jemand noch einen Tipp fürr mich ? Die Bilder werden im Style nicht angezeigt, trotz m.M. richtiger Pfadangabe
Delphi-Quellcode:
SetTabItemIcon(TsbYitem1, 'Contents/MacOS/Folder.png');

RWarnecke 27. Jun 2013 09:38

AW: [Firemonkey] Styles dynamisch zur Laufzeit ändern
 
Zitat:

Zitat von RWarnecke (Beitrag 1219764)
Habe auch noch Probleme die Bitmaps unter Mac OSX zu laden, hat hier jemand noch einen Tipp fürr mich ? Die Bilder werden im Style nicht angezeigt, trotz m.M. richtiger Pfadangabe
Delphi-Quellcode:
SetTabItemIcon(TsbYitem1, 'Contents/MacOS/Folder.png');

Zitat:

Zitat von RWarnecke (Beitrag 1219760)
Das funktioniert jetzt. Jetzt brauche ich nur noch, dass ich unter Windows die Bitmaps aus Resourcen laden kann.

Hat jemand noch zu den beiden Vorgängen eine Idee ? Weder beim Mac noch bei Windows komme ich weiter.

Edit:
Das Laden der Bilder auf'm Mac habe ich gelöst.
Delphi-Quellcode:
SetTabItemIcon(TI_1, ExtractFilePath(ParamStr(0)) + 'opened_folder.png');
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz