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 FindComponent auch für property ??? (https://www.delphipraxis.net/68443-findcomponent-auch-fuer-property.html)

Martin K 29. Apr 2006 17:12


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'));

jim_raynor 29. Apr 2006 17:15

Re: FindComponent auch für property ???
 
Nein. Du kannst aber Hier im Forum suchenGetPropInfo aus der Unit TypInfo Informationen zu einer Published Eigenschaft ermitteln und mit Hier im Forum suchenSetStrProp dann ändern.

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.

Martin K 29. Apr 2006 17:32

Re: FindComponent auch für property ???
 
Hmm...

Dieser Code wird zwar kompiliert, löst aber eine Exception aus:
Delphi-Quellcode:

GetPropInfo(FindComponent('Form1'),'Caption');

Die Muhkuh 29. Apr 2006 17:33

Re: FindComponent auch für property ???
 
Zitat:

Zitat von Martin K
Hmm...

IMHO:

Delphi-Quellcode:

GetPropInfo((FindComponent('Form1') as TForm),'Caption');

Martin K 29. Apr 2006 17:37

Re: FindComponent auch für property ???
 
Zitat:

Zitat von Spider
IMHO:

Delphi-Quellcode:

GetPropInfo((FindComponent('Form1') as TForm),'Caption');

Löst auch eine Exception aus... :cry:

JasonDX 29. Apr 2006 17:39

Re: FindComponent auch für property ???
 
Zitat:

Zitat von Spider
GetPropInfo((FindComponent('Form1') as TForm),'Caption')[/delphi]

Anders geschrieben:
Delphi-Quellcode:
GetPropInfo((Form1.FindComponent('Form1'){...}
Form1 hat nur unwahrscheinlich eine Komponente, die auch wieder Form1 heisst ;)
da geht das doch besser:
Delphi-Quellcode:
GetPropinfo(Form1, 'Caption');
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*

greetz
Mike

Martin K 29. Apr 2006 17:46

Re: FindComponent auch für property ???
 
Zitat:

Zitat von JasonDX
Delphi-Quellcode:
GetPropInfo((Form1.FindComponent('Form1'){...}
Form1 hat nur unwahrscheinlich eine Komponente, die auch wieder Form1 heisst ;)
da geht das doch besser:
Delphi-Quellcode:
GetPropinfo(Form1, 'Caption');
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*

greetz
Mike

Ja, das mit Form1 war ja auch nur ein Beispiel.

Es sollte z.B. auch so gehen können:
Delphi-Quellcode:
GetPropInfo(FindComponent('Label1'),'Caption');

SirThornberry 29. Apr 2006 17:47

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.

Martin K 29. Apr 2006 17:53

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:
GetPropInfo(FindComponent('Label1'),'Caption').Name
bekomme ich dann logischerweise 'Caption' zurückgeliefert...

JasonDX 29. Apr 2006 17:58

Re: FindComponent auch für property ???
 
Zitat:

Zitat von Martin K
Aber wie bekomme ich jetzt den String (TCaption) von Label1.Caption zurück?

hmmmm....
Ein bisschen weiter oben steht geschrieben:
Zitat:

Zitat von jim_raynor
Du kannst aber Hier im Forum suchenGetPropInfo aus der Unit TypInfo Informationen zu einer Published Eigenschaft ermitteln und mit Hier im Forum suchenSetStrProp dann ändern.

D.h. mit SetStrProp kannst du string-Properties setzen. Jetzt geben wir dem ganzen noch etwas Phantasie dazu und gucken, ob es etwa nicht GetStrProp gibt... tatsaechlich, sie existiert. Und rate mal, was die macht ;)

greetz
Mike

Martin K 29. Apr 2006 18:07

Re: FindComponent auch für property ???
 
Cool, das funktioniert!!!! :thumb:

Vielen Dank an alle.

Martin K 29. Apr 2006 18:16

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

JasonDX 29. Apr 2006 18:29

Re: FindComponent auch für property ???
 
Zitat:

Zitat von Martin K
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

Ja, die Klasse war TLabel, Label1 die Instanz davon, und Caption die Eigenschaft.
"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

jim_raynor 29. Apr 2006 19:14

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;

Martin K 29. Apr 2006 23:51

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:
SetStrProp(GetObjectProp(FindComponent('Label1'), 'Font'), 'Name', 'Arial');
Das ganze ändert also die Schriftart von Label1 in Arial,
wobei alles nur in Strings übergeben wird!

Martin K 30. Apr 2006 11:59

Re: FindComponent auch für property ???
 
Hi, ich bin's nochmal:

Ist es auch irgendwie möglich, den Defaultwert einer property abzufragen?

fkerber 30. Apr 2006 12:06

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

Martin K 30. Apr 2006 12:19

Re: FindComponent auch für property ???
 
Zitat:

Zitat von fkerber
Hi!

Was meinst du mit "Default-Wert"?
Den Wert den sie beim Start des Programms haben/hatten?


Ciao Frederic

Ja, genau den!
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.

Martin K 30. Apr 2006 13:06

Re: FindComponent auch für property ???
 
Wie kann man nun allg. den Default-Wert einer Property erhalten?
Ist das überhaupt möglich???

mkinzler 30. Apr 2006 13:25

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.

jim_raynor 30. Apr 2006 13:35

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:
var
  PropInfo: PPropInfo;
begin
  PropInfo:=GetPropInfo(Form1,'Caption');
  showmessaege(String(Pointer(PropInfo.Default));
end;
Keine Ahnung ob es klappt.

Martin K 30. Apr 2006 13:45

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?

jim_raynor 30. Apr 2006 13:55

Re: FindComponent auch für property ???
 
Ha, wenn du mal in der Hilfe zu default schaust steht da:

Zitat:

default und nodefault werden nur für Ordinal- und Mengentypen unterstützt
Ergo. Gibts für Strings keinen Default wert.

Martin K 30. Apr 2006 14:00

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?

jfheins 30. Apr 2006 14:01

Re: FindComponent auch für property ???
 
guck mal in die hilfe zu [oh]nodefault[/oh] ;)

Zitat:

Mithilfe des Bezeichners nodefault kann ein geerbter default-Wert ohne Angabe eines neues Wertes außer Kraft gesetzt werden. Die Direktiven default und nodefault werden nur für Ordinal- und Mengentypen unterstützt, bei denen die Ober- und Untergrenze des Basistyps einen Ordinalwert zwischen 0 und 31 hat. Enthält eine Eigenschaftsdeklaration weder default noch nodefault, gilt sie als mit nodefault definiert. Für Real-, Zeiger- und String-Typen gilt der implizite default-Wert 0 bzw. nil und '' (leerer String).

Hinweis: Sie können den ordinalen Wert 2147483648 nicht als Standardwert verwenden. Dieser Wert wird intern für die Darstellung von nodefault verwendet.

Martin K 30. Apr 2006 14:08

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 12:46 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