![]() |
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:
Soweit so gut ...
<Label1 Class="TLabel" Property="Caption" Form="FormXY">
<German>Hallo Welt</German> <English>Hello World</English> </Label1> 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:
machbar sein.
var
C: TComponent; begin C := FindComponentEx('Label1'); 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: |
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:
Nun wäre es aber müssig die ganzen verfügbaren Komponenten zu Fuss so durchzugehen.
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; 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 ? |
Re: Komponenten Property ändern ála 'TLabel'(Comp.).'Caption
Schau dir mal die Unit "TypeInfo.pas" an sowie die fertige Lösung
![]() |
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:
Da brauche ich nichtmal den Klassennamen bei :-D
C := FindComponentEx('Form1.' + CompName);
if IsPublishedProp(C, PropertyName) then SetStrProp(C, 'Caption', Value); 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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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-2025 by Thomas Breitkreuz