Automatisches Typecasting

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Automatisches Typecasting

Beitrag von _X_ »

Kann man ohne IF-Abfragen erkennen was FindComponent für eine Komponente ist.
Die sollte dann automatisch gecastet werden.

Die Komponente bekommt man ja über TComponent.ClassName.
Wie kann ich die jetzt (hoffentlich) automatisch casten?

mfg _X_

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Automatisches Typecasting

Beitrag von marcov »

_X_ hat geschrieben:Kann man ohne IF-Abfragen erkennen was FindComponent für eine Komponente ist.
Die sollte dann automatisch gecastet werden.
Nach was ?

Vielleicht:

xx:=(<expression> AS TSometype); // assuming xx:tsometype.

aber das wirt Exceptions geben wenn <expression> nicht von typ TSomeType ist oder davon vererbt.

Oder, ohen exception (aber mit ein sicher Risico, keine checks!)

xx:=TSometype(<Expression>);

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Automatisches Typecasting

Beitrag von _X_ »

marcov hat geschrieben:Nach was ?
Nach der Klasse mit dem Namen die in TComponent.ClassName enthalten ist.

mfg _X_

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Automatisches Typecasting

Beitrag von martin_frb »

Da musst du schon etwas genauer sagen was du machen willst. einfach nur "casten" hat ja keine Wirkung.

Du castest ja, um dann eine Methode aufzurufen, die die baseclass nicht hat.
var
FObj: TObject;
FComp: TComponent;

FObj := FSomeButton.
FComp := FSomeButton.

wenn du jetzt den namen haben willst, must du FObj casten
TButton(FObj).Name oder TComponent(FObj).Name Die sind 100% identisch (*1)
FComp must du nicht casten (du kannst, aber es macht überhaupt keinen unterschied.

Jetzt zurück zu original Frage. Wenn du gecastest hast, willst du wahrscheinlich irgendeine Methode aufrufen? Und diese Methode existiert nur unter einigen Klassen?
Dann musst du sowieso prüfen ob du eine solche Klasse hast...

Ansonsten beschreibe nochmal was du vorhast. Und ob die Klasen selbst definiert sind, oder vorgegeben....


(*1)
Es gibt eine Ausnahme, wenn die ChildClass nicht virtuelle Methoden "reintroduced".

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: Automatisches Typecasting

Beitrag von _X_ »

martin_frb hat geschrieben:Wenn du gecastest hast, willst du wahrscheinlich irgendeine Methode aufrufen? Und diese Methode existiert nur unter einigen Klassen?
Dann musst du sowieso prüfen ob du eine solche Klasse hast...
Wie?
martin_frb hat geschrieben:Ansonsten beschreibe nochmal was du vorhast. Und ob die Klasen selbst definiert sind, oder vorgegeben....".
Die sind vorgegeben. Z.b. TEdit, TMemo, oder auch TTimer.

mfg _X_

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Automatisches Typecasting

Beitrag von pluto »

Hier musst du einzelnen prüfen um was es sich handelt und die Eigenschaft gezielt setzten. Es gibt aber auch Scrip Sprache für FPC. z.b. LUA wird unterstützt. Ich habe auch irgendwo Pascal Header. Es gibt aber auch noch andere. Aber hier musst du auch die Klassen die Unterstützt werden manuell hinzufügen. Automatisch geht das leider nicht. Wie denn auch ?

Du könntest höchsten eins machen: Du suchst den Komponenten Namen mit FindComponent und hier musst du jetzt prüfen um was es sich handelt und jetzt kannst du von der niedrigsten Klasse anfangen. Zu schauen ob die Eigenschaften vorhanden sind die du setzten möchtest. die RTTI(ich glaube die macht das) stellt dazu entsprechende Funktionen bereit. Ich weiß im Moment nicht mehr wie die hießen irgendwas mit GetPro..... Aber das ist auch noch keine Gute Lösung.

Es gibt noch eine andere: Es gibt den OI. Denn kannst du auch in deinen Anwendungen Verwenden. Wenn du den jetzt eine Komponente zuweist kann er die Eigenschaft ändert. Das ist das einfachste. Du könntest ja ein Dialog erstellen wo der drauf ist. Ist halt nicht so komfortabel für ein Edit aber müsste auch gehen und du könntest ihn als Vorlage verwenden. Ich hoffe du kannst mir noch folgen. Mit Hilfe des OI kannst du aber "nur" Eigenschaften setzten. Du könntest ihn auch in Verbindung mit einer Scrip Sprache verwenden. Nur das habe ich bisher noch nicht gemacht.
MFG
Michael Springwald

Antworten