Visuelle Komponente "zu Fuß" instantiieren

Rund um die LCL und andere Komponenten
Antworten
MacNight
Beiträge: 4
Registriert: Mo 19. Okt 2009, 13:05
OS, Lazarus, FPC: Winux (L 0.9.28 FPC 2.2.4)
CPU-Target: Win32, MacOSX 10.6

Visuelle Komponente "zu Fuß" instantiieren

Beitrag von MacNight »

Hallo alle zusammen,

ich hoffe, ich stelle diese Frage an der richtigen Stelle. :oops:

Ich versuche gerade, eine Komponente von lNet (TLUDPComponent) innerhalb eines selbst typisierten Objektes zu instantiieren und komme nicht weiter, da im "constructor Create" ein "aOwner" vom Typ "TComponent" erwartet wird. "self" geht hier nicht, da er vom Typ des übergeordneten Objektes ist und damit nicht kompatibel.

Da dieses Objekt die UDP-Kommunikation kapseln soll, kann ich die TLUDPComponent im Hauptfenster nicht gebrauchen. Das Objekt als eine Komponente zu deklarieren, ist an sich nicht nötig, da sie selbst nicht visuell ist.

Hat hier jemand eine Idee, wer der Owner der lNet-Komponente sein darf? Oder muss ich das bisher als class(TObjekt) typisierte Objekt als TComponent deklarieren?

Ich weiß noch aus meinen Delphi-Zeiten, dass sich visuelle Komponenten auch nicht-visuell erzeugen lassen, aber im Moment stehe ich auf dem Schlauch... :?
Gruß aus Berlin
Udo (aka MacNight)

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Visuelle Komponente "zu Fuß" instantiieren

Beitrag von mschnell »

Instanz Insta einer visuellen Komponente TComp aktivieren:

Insta := TComp(Self);

Wenn man die auch sehen will (ist bei lnet wohl eher nicht der Fall:

z.B.
Insta.Parent := Self; (wenn Self das Form ist, auf dem Insta gezeigt werden soll)

TCopmponent ist streambar, was TObject nicht ist. Deshalb müssen visuelle Komponenten von TComponent abgeleitet werden, weil die Programm-Initialisierung sie aus einem Stream liest, um sie zu instanziieren. Wenn man etwas zu Fuß instanziiert" ist es egal.

-Michael

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: Visuelle Komponente "zu Fuß" instantiieren

Beitrag von pluto »

Eigentlich ist der Owner gar nicht so wichtig. Der gibt nur an, wer die Komponente verwaltet. Ich kenne zwar die Komponente nicht genau, die du verwendest, aber beim Timer z.b. kann Owner auch NIL sein. Also Praktisch so: Timer1:=TTimer.Create(nil);
Notfalls könntest du auch noch folgendes machen:
Du musst die Unit Froms einbinden. Dann kannst du auf "Application" zurückgreifen und darüber das MainFrom erwischen. In etwa so:
Timer1:=TTimer.Create(application.MainFrom);
Vielleicht ist das übertragbar auf deine Komponente....
MFG
Michael Springwald

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Visuelle Komponente "zu Fuß" instantiieren

Beitrag von Hitman »

... oder man nimmt "einfach" garnicht erst die Komponenten sondern nutzt die LCL-unabhängigen lNet Klassen ... dann allerdings nicht vergessen, dich selbst ums CallAction zu kümmern.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Visuelle Komponente "zu Fuß" instantiieren

Beitrag von mschnell »

pluto hat geschrieben:Eigentlich ist der Owner gar nicht so wichtig.
Der Owner hat (mindestend) zwei Aufgaben:
1) die Komponente wird automatisch gefreed wenn der Owner gefreed wird
2) man kann alle owned Copmponents einer Komponente zur Realtime finden, wenn man das will.

Wenn man beides nicht braucht, kann der Owner NIL sein.

-Michael

MacNight
Beiträge: 4
Registriert: Mo 19. Okt 2009, 13:05
OS, Lazarus, FPC: Winux (L 0.9.28 FPC 2.2.4)
CPU-Target: Win32, MacOSX 10.6

Re: Visuelle Komponente "zu Fuß" instantiieren

Beitrag von MacNight »

Hallo alle zusammen,

danke für die Antworten.
Da ich mich selbst auch um das "Destroy" der Komponente kümmere, könnte ich tatsächlich "nil" verwenden.
Und da die Komponente nur innerhalb des Objektes sichtbar sein soll, muss sie auch nicht (von außen) auffindbar sein.

Ich denke, die Frage könnte hiermit als "Gelöst" gekennzeichnet werden...
Gruß aus Berlin
Udo (aka MacNight)

Antworten