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/)
-   -   Delphi Komponenten Property ändern ála 'TLabel'(Comp.).'Caption' (https://www.delphipraxis.net/131127-komponenten-property-aendern-%E1la-tlabel-comp-caption.html)

moelski 19. Mär 2009 10:54


Komponenten Property ändern ála 'TLabel'(Comp.).'Caption'
 
Moin !

Ich muss für ein kleines Tool eine einfaches Multilang Interface mittels XML schreiben.
Ich habe da auch schon grundlegend Ideen zu, aber noch ne Frage zur Ausführung...

Also, ich würde in der XML Struktur den Wert ablegen. Bei mir geht es vornehmlich um Captions / Text - also eigentlich nur Strings.
So jetzt würde ich das gerne so in der XML ablegen:
XML-Code:
<Label1 Class="TLabel" Property="Caption" Form="FormXY">
  <German>Hallo Welt</German>
  <English>Hello World</English>
</Label1>
Soweit so gut ...
Nun möchte ich natürlich beim Programm Start die Sprache einstellen.

Datz müsste ich erstmal das Label1 finden. Das sollte ja mit...
Delphi-Quellcode:
var
  C: TComponent;
begin
  C := FindComponentEx('Label1');
machbar sein.

Jetzt muss ich ja als nächstes den Wert setzen. Das würde ja so gehen:
TLabel(C).Caption := 'Hello';

Aber wie kriege ich es nun hin, das er die Property und die Klasse aus meiner XML verwendet? Letztlich sind das ja nur zwei Strings die ich aber an der Stelle nicht so verwenden kann.
:gruebel:

moelski 19. Mär 2009 15:58

Re: Komponenten Property ändern ála 'TLabel'(Comp.).'Caption
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin !

So ich habe mal ne Demo erstellt wo ich das etwas "händisch" durchgehe.
Ich will damit nur mal andeuten was ich eigentlich realisieren möchte.

Der wichtige Teil ist das hier:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  C: TComponent;
  ClassName, CompName, PropertyName : String;
  Value                            : String;
begin
  ClassName    := 'TCheckBox';   // die werte kämen aus der XML Struktur ...
  CompName     := 'CheckBox1';
  PropertyName := 'Caption';
  Value        := 'Hallo Welt';

  C := FindComponentEx('Form1.CheckBox1');
  if C.ClassName = ClassName then begin
    if ClassName = 'TCheckBox' then
                                                  // 0       // 1    // 2     // 3
      case AnsiIndexText(LowerCase(PropertyName), ['caption', 'text', 'lines', 'height']) of
        0 : TCheckBox(C).Caption := Value;
        3 : TCheckBox(C).Height := StrToInt(Value);
      end;

    if ClassName = 'TEdit' then
      case AnsiIndexText(LowerCase(ClassName), ['caption', 'text', 'lines', 'height']) of
        1: TEdit(C).Text := Value;
      end;
  end;
end;
Nun wäre es aber müssig die ganzen verfügbaren Komponenten zu Fuss so durchzugehen.
In meinem Fall würde das sicher gehen, da ich nicht so viel an Komponenten verwende und meist eh nur Caption oder Text anpassen muss. Aber generell würde ich das schon gerne vereinfache.
Geht das evtl. mit RTTI Mitteln? Und wenn ja ... Hat da jemand ein Beispiel zu ?

Bernhard Geyer 19. Mär 2009 16:04

Re: Komponenten Property ändern ála 'TLabel'(Comp.).'Caption
 
Schau dir mal die Unit "TypeInfo.pas" an sowie die fertige Lösung GNU GetText für Delphi

moelski 19. Mär 2009 16:10

Re: Komponenten Property ändern ála 'TLabel'(Comp.).'Caption
 
Moin Bernhard,

danke für den Hinweis. Ich habe mich eben entsonnen das ich irgenwann schon mal was ähnliches brauchte und habe mit dem Suchbegriff RTTI meine Codes durchgesucht. Und siehe da ... Hab was wiedergefunden.
Und dann bin ich auch auf die Unit "TypInfo" gekommen :)

Und nach ein bisserl Suche entsprang mir dieser Code:
Delphi-Quellcode:
  C := FindComponentEx('Form1.' + CompName);
  if IsPublishedProp(C, PropertyName) then
    SetStrProp(C, 'Caption', Value);
Da brauche ich nichtmal den Klassennamen bei :-D

Das ist eigentlich schon alles was ich gesucht habe.

Danke nochmal an Bernhard für den Tip und evtl. kanns ja jemand anders mal brauchen.

Zitat:

GNU GetText für Delphi
Ist mir bekannt. Ich würde das gerne mal selber versuchen 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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