Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Supports ohne out Parameter (https://www.delphipraxis.net/170914-supports-ohne-out-parameter.html)

Thom 10. Okt 2012 12:10

AW: Supports ohne out Parameter
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1186490)
Dieses Vorgehen ist aber nicht in jedem Fall anwendbar. Man muss sich schon entscheiden, ob man nur mit Interface-Referenzen und Referenzzählung arbeiten will, oder ob man ohne Referenzzählung selber die Objekt-Instanzen verwalten will. Für beide Vorgehen gibt es je nach Anwendungsfall gute Gründe. Man muss dann nur die passende Elternklasse verwenden.

Selbstverständlich. Aber was hat das mit der Ausgangsfrage zu tun? Es ging darin nicht um "in jedem Fall", sondern das ganz konkrete Beispiel. Und da ist nun mal die Verwendung des Variablentyps IInterface, das vom Objekt TInterfacedObject eingeführt wird, die korrekte Lösung. :zwinker:

Blup 10. Okt 2012 12:12

AW: Supports ohne out Parameter
 
Zur Verdeutlichung des Ablaufs:
Delphi-Quellcode:
var
  a: TFirstSecond;
  i: IInterface;
  f: IFirst;
  s: ISecond;

begin
  a := TFirstSecond.Create;
  i := a;  // a.RefCount wird 1

  if Supports(a, IFirst) then // a.RefCount wird 2 und wieder 1
    Writeln('a supports IFirst');

  if Supports(a, ISecond) then // a.RefCount wird 2 und wieder 1
    Writeln('a supports ISecond');

  if Supports(a, IFirst, f) then // a.RefCount wird 2
    Writeln('[out] a supports IFirst');

  if Supports(a, ISecond, s) then // a.RefCount wird 3
    Writeln('[out] a supports ISecond');
 
  i := nil; // a.RefCount wird 2
  f := nil; // a.RefCount wird 1
  s := nil; // a.RefCount wird 0 und a wird freigegeben

  Readln;
end.

pflaume 10. Okt 2012 12:16

AW: Supports ohne out Parameter
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1186492)
War im Beispiel der falsche Overload der Funktion - der richtige enthält übrigens eine entsprechende Warnung:

Delphi-Quellcode:
function Supports(const Instance: TObject; const IID: TGUID): Boolean;
var
  Temp: IInterface;
begin
  // NOTE: Calling this overload on a ref-counted object that has REFCOUNT=0
  // will result in it being freed upon exit from this routine.
  Result := Supports(Instance, IID, Temp);
end;

Dieser Kommentar fehlt bei mir. Ich habe im Moment auch keine Version außer 2009 zur Hand.

Uwe Raabe 10. Okt 2012 13:38

AW: Supports ohne out Parameter
 
Zitat:

Zitat von pflaume (Beitrag 1186500)
Dieser Kommentar fehlt bei mir. Ich habe im Moment auch keine Version außer 2009 zur Hand.

Der Kommentar ist offenbar erst seit XE enthalten.

shmia 10. Okt 2012 18:01

AW: Supports ohne out Parameter
 
Teste mal das (Jugend forscht :-) ):
Delphi-Quellcode:
if Assigned(TFirstSecond.GetInterfaceEntry(IFirst)) then
    Writeln('TFirstSecond supports Interface IFirst');

if Assigned(TFirstSecond.GetInterfaceEntry(ISecond)) then
    Writeln('TFirstSecond supports Interface ISecond');

Uwe Raabe 10. Okt 2012 18:51

AW: Supports ohne out Parameter
 
Zitat:

Zitat von shmia (Beitrag 1186557)
Teste mal das (Jugend forscht :-) ):
Delphi-Quellcode:
if Assigned(TFirstSecond.GetInterfaceEntry(IFirst)) then
    Writeln('TFirstSecond supports Interface IFirst');

if Assigned(TFirstSecond.GetInterfaceEntry(ISecond)) then
    Writeln('TFirstSecond supports Interface ISecond');

Ja, und?

Bummi 10. Okt 2012 19:08

AW: Supports ohne out Parameter
 
ist
Delphi-Quellcode:
  if Supports(TFirstSecond, ISecond) then
nicht intuitiver?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz