![]() |
FindComponent auch für property ???
Hi Leute,
kann man irgendwie auf eine property einer Komponente zugreifen, von der man nur jeweils die Strings hat ? Also so etwas z.B.:
Delphi-Quellcode:
//Zuordnung:
FindComponent('Form1.Caption') := 'Test'; //auslesen: var s: string; s := String(FindComponent('Form1.Caption')); |
Re: FindComponent auch für property ???
Nein. Du kannst aber
![]() ![]() Such mal im Forum nach RTTI oder den oben genannten Funktionsnamen. Das Objekt selbst, musst du vorher mit FindComponent oder wie auch immer selbst finden. |
Re: FindComponent auch für property ???
Hmm...
Dieser Code wird zwar kompiliert, löst aber eine Exception aus:
Delphi-Quellcode:
GetPropInfo(FindComponent('Form1'),'Caption'); |
Re: FindComponent auch für property ???
Zitat:
Delphi-Quellcode:
GetPropInfo((FindComponent('Form1') as TForm),'Caption'); |
Re: FindComponent auch für property ???
Zitat:
|
Re: FindComponent auch für property ???
Zitat:
Delphi-Quellcode:
Form1 hat nur unwahrscheinlich eine Komponente, die auch wieder Form1 heisst ;)
GetPropInfo((Form1.FindComponent('Form1'){...}
da geht das doch besser:
Delphi-Quellcode:
btw, es waere im Sinne der OOP, auf Form1 zu verzichten, und auf self zurueckzugreifen. Wenn eine aussenstehende Klasse die Eigenschaften setzen soll, so sollte die Instanz per Parameter mitgegeben werden. Aber Form1.Irgendwas zu verwenden.... *uarghs*
GetPropinfo(Form1, 'Caption');
greetz Mike |
Re: FindComponent auch für property ???
Zitat:
Es sollte z.B. auch so gehen können:
Delphi-Quellcode:
GetPropInfo(FindComponent('Label1'),'Caption');
|
Re: FindComponent auch für property ???
kannst du uns auch sagen welche Exception kommt? mir ist es eigentlich neu das Form1.FindComponent das Form1 findet, denn ein Form hat sich nicht selbst in seiner eigenen liste. Man sollte schon sicherstellen ob FindComponent auch was gefunden hat. Und wie bereits erwähnt wäre es auch sinnvoll zu wissen welche Fehlermeldung du bekommst.
|
Re: FindComponent auch für property ???
Naja, bei Label1 kommt keine Exception....
Gut, dass mit Form1 habe ich verstanden - daran lag's wohl :wink: Aber wie bekomme ich jetzt den String (TCaption) von Label1.Caption zurück? So:
Delphi-Quellcode:
bekomme ich dann logischerweise 'Caption' zurückgeliefert...
GetPropInfo(FindComponent('Label1'),'Caption').Name
|
Re: FindComponent auch für property ???
Zitat:
Ein bisschen weiter oben steht geschrieben: Zitat:
greetz Mike |
Re: FindComponent auch für property ???
Cool, das funktioniert!!!! :thumb:
Vielen Dank an alle. |
Re: FindComponent auch für property ???
Kaum ist ein Problem gelöst, kommt schon das nächste:
Funktioniert das auch mit einer "Untereigenschaft" ? also z.B.: Label1.Font.Name ???? Dieses Beispiel war ja für Label1.Caption |
Re: FindComponent auch für property ???
Zitat:
"Untereigenschaften" sind auch nur wieder Eigenschaften von Klassen. TLabel.Font ist vom Typ TFont, den Instanz-Zeiger kriegst du ueber Label1.Font, und die Eigenschaft heisst "Name". Funktioniert also gleich wie bei TLabel.Caption ;) greetz Mike |
Re: FindComponent auch für property ???
Du müsstest mit GetObjectProp(Label1,'Font') das Schrift-Objekt ermitteln und dann wieder mit SetStrProp(Font,'Name','Test') setzen.
Delphi-Quellcode:
var
tmpObject: TObject; // TObject da tatsächliche Klasse zur Laufzeit unbekannt ist und auch egal ist begin tmpObject:=GetObjectProp(Label1,'Font'); SetStrProp(tmpObject,'Name','Test); end; |
Re: FindComponent auch für property ???
Ja, das geht!
Danke :thumb: Hab's noch etwas vereinfacht: Das ganze geht auch in einer Zeile und ohne zusätzliche Variable:
Delphi-Quellcode:
Das ganze ändert also die Schriftart von Label1 in Arial,
SetStrProp(GetObjectProp(FindComponent('Label1'), 'Font'), 'Name', 'Arial');
wobei alles nur in Strings übergeben wird! |
Re: FindComponent auch für property ???
Hi, ich bin's nochmal:
Ist es auch irgendwie möglich, den Defaultwert einer property abzufragen? |
Re: FindComponent auch für property ???
Hi!
Was meinst du mit "Default-Wert"? Den Wert den sie beim Start des Programms haben/hatten? Ciao Frederic |
Re: FindComponent auch für property ???
Zitat:
Bzw. den Wert, den eine Property annimmt, wenn nichts an der entspr. Stelle in der dfm-Datei steht. z.B. ist der Defaultwert der Property 'Transparent' eines TLabel FALSE. |
Re: FindComponent auch für property ???
Wie kann man nun allg. den Default-Wert einer Property erhalten?
Ist das überhaupt möglich??? |
Re: FindComponent auch für property ???
Da wird er den wert aus der klasse Lesen oder der Superklasse, wenn die Klasse auch kein Wert vorsieht.
|
Re: FindComponent auch für property ???
Bei GetPropInfo bekommst du einen Pointer auf einen Record TPropInfo zurück, der ein Feld Default hat. Da der allerdings nur ein LongInt ist, weiß ich net, was bei einer String-Property drin steht. Vielleicht garnichts, vielleicht aber auch der richtige String, bei einem entsprechende Cast:
Delphi-Quellcode:
Keine Ahnung ob es klappt.
var
PropInfo: PPropInfo; begin PropInfo:=GetPropInfo(Form1,'Caption'); showmessaege(String(Pointer(PropInfo.Default)); end; |
Re: FindComponent auch für property ???
Danke!
Bei Integer- und Boolean-Typen klappt's wunderbar (ordinale Typen). Wenn man eben String() durch IntToStr() ersetzt.
Delphi-Quellcode:
IntToStr(GetPropInfo(Self,'Caption').Default
Bei einem String: Mit IntToStr() wird -2147483648 zurückgeliefert, String() löst eine AV aus. Weiß jemand, wie man sonst noch -2147483648 in einen ordentlichen String umwandeln kann? |
Re: FindComponent auch für property ???
Ha, wenn du mal in der Hilfe zu default schaust steht da:
Zitat:
|
Re: FindComponent auch für property ???
Okay, der normale Default-Wert eines Strings ist ja eigentlich auch immer '' (leerer String).
Wenn man mal in der dfm-Datei eines Projekts ein wenig rumspielt und hier ein paar Zeilen, wo irgendwelche Strings stehen einfach löscht (z.B.: Caption = 'Form1') - wenn man dann das Projekt in Delphi lädt wird man feststellen, dass an dieser Stelle überall leere Strings stehen. Ergo: Der Default-String ist immer '' Aber was ist dann mit -2147483648 ??? Ist das irgendwie der Integer-Wert eines leeren Strings? |
Re: FindComponent auch für property ???
guck mal in die hilfe zu [oh]nodefault[/oh] ;)
Zitat:
|
Re: FindComponent auch für property ???
Aha.
Ich sollte wohl doch mal ab und zu wieder in die Hilfe schauen :wink: Danke nochmal! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 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