Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objekt+Properties über Strings ansprechen (https://www.delphipraxis.net/150005-objekt-properties-ueber-strings-ansprechen.html)

LingNeu 5. Apr 2010 07:47


Objekt+Properties über Strings ansprechen
 
Hallo Delphifreunde,
mit der Funktion FindComponent kann man ja Objekte fast wie in einem Array ansprechen, wenn man die Objekte durchnummeriert und anschließend in einer Schleife abarbeitet.
Ich hätte gerne in Datenbankfeldern(string) den Namen, die Eigenschaft und den Typ gespeichert und in einem weiteren Feld den Eigenschaftswert eingetragen.
Anschließend möchte ich das Objekt im Programm ansprechen können. Irgendwie hänge ich jetzt und komme nicht weiter.
Vielleicht kann mir jemand von euch weiterhelfen.

Delphi-Quellcode:
// in der Tabelle TDB stehen die Felder zur Verfügung
cmp := TDB['cmpName'];    // im Feld cmpName steht 'Edit1' (string)
pro := TDB['cmpProperty']; // im Feld cmpProperty steht 'Text' (string)
typ := TDB['cmpTyp'];     // im Feld cmpTyp steht 'TEdit' (string) als Typ
txt := TDB['cmpTxt'];     // im Feld cmpTxt steht 'eins' (string) als Eigenschaftswert

// soweit bin ich gekommen
(FindComponent(cmp) as TEdit).text := txt; // Ergebnis Edit1.text := 'eins'
Wie müsste ich die Strings "zusammensetzen" damit ich diese dann als Objekt ansprechen kann.
Geht den sowas überhaupt, oder macht da der Compiler Schwierigkeiten?
Danke für jede Hilfe
ciao
LingNeu

alzaimar 5. Apr 2010 08:20

Re: Objekt+Properties über Strings ansprechen
 
Ganz so einfach geht das nicht. FindComponent durchsucht ja nur eine Liste von Kontrollelementen nach dem Element mit dem angegebenen Namen.

Um Ähnliches für Objekte zu realisieren, musst Du die Objekte, zusammen mit einem Namen in einer Liste speichern. Dafür eignet sich z.B. eine TStringList und deren Methode 'AddObject'.

LingNeu 5. Apr 2010 13:07

Re: Objekt+Properties über Strings ansprechen
 
Hallo alzaimar,
da hast Du Recht - das ist anscheinend nicht ohne Weiteres zu lösen.
Ich habe nun mal ein ganz einfache Beispiel kreiert
Sind nur 5 Edits. Die ersten 4 enthalten die Strings
Im Edit5 kommt das Ergebnis. Ich bräuchte lediglich noch den String von Edit2 und Edit3
Schade, das es da keine Möglichkeit gibt.
ciao
LingNeu

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var cmp,pro,typ,txt: string;
begin
cmp := Edit1.Text ; //'Edit5'
pro := Edit2.Text ; //'Text'
typ := Edit3.Text ; //'TEdit'
txt := Edit4.Text ; //'eins'
(FindComponent(cmp) as TEdit).Text := txt; //Ausgabe erfolgt in Edit5

// so wäre es ideal ...
//(FindComponent(cmp) as typ).pro := txt;

end;

zeras 5. Apr 2010 13:27

Re: Objekt+Properties über Strings ansprechen
 
Kann man das dann nicht über größere Case Schleifen zuweisen?
Erkläre doch mal genauer, was du damit machen willst. Vielleicht gibt es einen anderen Lösungsansatz.

himitsu 5. Apr 2010 13:35

Re: Objekt+Properties über Strings ansprechen
 
Das "as typ", bzw eigentlich das "is typ" kannst du über .ClassName lösen lösen.

Für den Rest, also das "pro", wirst du die RTTI bemühen müssen.

LingNeu 5. Apr 2010 13:47

Re: Objekt+Properties über Strings ansprechen
 
hallo zusammen,
danke für eure Hinweise.
Ich wollte mir ein mehrsprachiges System aufbauen. Natürlich weiß ich, dass es da fertige Sachen gibt.
Da kenne ich z.B. die SiComponenten und dort bin ich auf die Idee gekommen, mir auch sowas anzulegen.
Bei den SiComponenten werden alle Komponenten mit den Eigenschaften - Text oder Caption in einer Tabelle mit ihrem Text abgelegt und man kann sich mehrere Spalten anlegen. Dabei repräsentiert jede Spalte eine eigene Sprache
und der Anwender kann in seiner Landessprache die entsprechenden Texte eingeben. Bei Applikationsstart werden die Objekte mit ihren hinterlegten Eigenschaften gefüttert.

In der 1.Spalte der Tabelle stehen also z.B.
Label1.Caption
Edit12.Text
copyright


In der 2.Spalte stehen die deutschen Texte
'Hauptname'
'Meier'
'Firma xy'


Wenn es mir gelänge meine Komponenten per Hand in eine Tabelle einzupflegen, könnte ich die passenden Texte jederzeit ändern und eben auch auf andere Sprachen umstellen.
Na, vielleicht hat von euch einer noch eine Idee
ciao
LingNeu

himitsu 5. Apr 2010 14:00

Re: Objekt+Properties über Strings ansprechen
 
http://www.delphipraxis.net/internal...t.php?t=164238
Dort hab ich auch ein eigenes System verbaut, welches über die Komponentennamen geht.

Wenn ich mal mehr Zeit hab, dann will ich das auch mal erweitern und noch etwas umbauen.

Aktuell wird ja aus einem Konstanten-Array gelesen.
Und welche Property nun geändert wird, wird über den Typen der gefundenen Komponente bestimmt.

Man muß also eine .pas austauschen und neu kompileren, um die Sprache zu ändern.
(wo das Array herhommt ist aber egal ... man könnte es auch aus einer Datei auslesen)

LingNeu 5. Apr 2010 15:09

Re: Objekt+Properties über Strings ansprechen
 
@himitsu,
danke für den Hinweis.
Uff - da muss ich noch viel lernen.
... Aber, ohne Fleiss ...
ciao
LingNeu

himitsu 5. Apr 2010 15:19

Re: Objekt+Properties über Strings ansprechen
 
Zitat:

Zitat von LingNeu
Uff - da muss ich noch viel lernen.

Muß ich auch noch.
Und ich will nicht behaupten daß dieses "System" supergut ist oder es mal werden wird, aber für meine Bedürfnisse ist es soweit ausreichend.

Und da du ja anscheinend in eine ähnliche Richtung gehn willst, kannst'e dir auch gern was abgucken.


Gut, den Namen des Property mitzugeben wäre wesentlich flexibler, aber nötig ist es oftmals garnicht, da viele Komponenten eine gemeinsame Basiskomponente haben, über welche man den Text dann zuweisen könnte.



In meinem alten FileSplitter steckt noch eine andere Methode drinnen, welche über die Resourcen (vorwigend für NonVCL-Programme geeignet) die Strings und sogar ganze Formulare/Dialoge in unterschiedlichen Sprachen laden kann.


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