[gelöst] Interface als published property geht nicht

Rund um die LCL und andere Komponenten
mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [gelöst] Interface als published property geht nicht

Beitrag von mse »

Michl hat geschrieben:@mse: Eigentlich funktionieren jetzt COM Interface Properties im Designer von Lazarus.

In Anwendungen ist die Kombination von tobject.destroy() und COM-Interface trotzdem problematisch. Es ist besser statdessen CORBA-Interface zu verwenden.
Kannst du mir erklären, warum ich unter 32bit ein Offset von 48 und bei 64bit ein Offset von 88 habe, wenn ich testen will, ob der Zeiger auf AComponent gleich Zeiger auf ObjectHasInterface ist?! (ObjectHasInterface ist eine Instanz von TCompInterface = class(TComponent, ITestInterface) )

Wie sieht GetObjectHasInterface() aus?

Code: Alles auswählen

 
 result:= FObjectHasInterface;
 

?
Dann ist ObjectHasInterface kein pointer auf eine TCompInterface Instanz sondern ein pointer auf einen Eintrag in der Interface-Tabelle des Objektes, welches ITestInterface implementiert. Wo dieser Eintrag innerhalb der Objektinstanz liegt ist ein "undocumented implementation detail" und von der Pointergrösse abhängig.
Um zu testen ob ObjectHasInterface von AComponent implementiert wird:

Code: Alles auswählen

 
 if AComponent.IsImplementorOf(ObjectHasInterface) then begin
 end;
 

Schneller ginge es den instance offset aus der Interfacetabelle herauszulesen, ich weiss nicht, ob FPC dies erlaubt.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: [gelöst] Interface als published property geht nicht

Beitrag von Michl »

Danke für die ausführliche Erklärung!

mse hat geschrieben:Um zu testen ob ObjectHasInterface von AComponent implementiert wird:

Code: Alles auswählen

 
 if AComponent.IsImplementorOf(ObjectHasInterface) then begin
 end;
 
Das war der mir fehlende Punkt. Es ist jetzt gut so und funktioniert augenscheinlich.

CORBA ist nochmal ein neues Thema.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: [gelöst] Interface als published property geht nicht

Beitrag von mse »

Noch etwas, vergiss nicht TComponent.FreeNotification() aufzurufen wenn die Implementor-Komponente zu einem anderen Modul gehört, sonst bekommst du vom destroy() nichts mit.

Antworten