[gelöst] Interface als published property geht nicht

Rund um die LCL und andere Komponenten

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

Beitragvon mse » 23. Feb 2018, 14:01 Re: [gelöst] Interface als published property geht nicht

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.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

Beitragvon Michl » 23. Feb 2018, 15:00 Re: [gelöst] Interface als published property geht nicht

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; 
Michl
 
Beiträge: 2263
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon mse » 23. Feb 2018, 16:40 Re: [gelöst] Interface als published property geht nicht

Noch etwas, vergiss nicht TComponent.FreeNotification() aufzurufen wenn die Implementor-Komponente zu einem anderen Modul gehört, sonst bekommst du vom destroy() nichts mit.
mse
 
Beiträge: 2013
Registriert: 16. Okt 2008, 09: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
Nach oben

• Themenende •
Vorherige

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste

porpoises-institution
accuracy-worried