Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interface - Supports (https://www.delphipraxis.net/189821-interface-supports.html)

stahli 26. Jul 2016 11:48

Delphi-Version: XE3

Interface - Supports
 
Gestern bin ich fast verzweifelt, bis ich meinen Schreibfehler entdeckt habe...

Delphi-Quellcode:
procedure MyProc(aParam: IInterface);
var lMyThing: TMyThing; // richtig wäre natürlich IMyThing
begin
  if Supports(aParam, IMyThing, lMyThing) then
    lMyThing.DoIt;
end;

In DoIt wurde eingesprungen, aber sofort danach gab es einen Zugriffsfehler.

Wäre sicher nicht verkehrt, wenn der Compiler hier abbrechen oder wenigstens warnen würde.

Vielleicht will ja mal jemand einen QC-Eintrag machen (ich bin da nicht mehr UpToDate).

Mavarik 26. Jul 2016 11:53

AW: Interface - Supports
 
Zitat:

Zitat von stahli (Beitrag 1343448)

Vielleicht will ja mal jemand einen QC-Eintrag machen (ich bin da nicht mehr UpToDate).

Und wie soll der lauten?

Der schöne Günther 26. Jul 2016 11:55

AW: Interface - Supports
 
Der dritter Parameter ist völlig typenlos. Manche Dinge wie Supports(..) oder FreeAndNil(..) sind einfach so. Wahrscheinlich irgendwelche Altlasten von vor 25 Jahren. Ich glaube nicht dass sich daran noch etwas ändern wird.

Uwe Raabe 26. Jul 2016 12:04

AW: Interface - Supports
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1343450)
Der dritter Parameter ist völlig typenlos. Manche Dinge wie Supports(..) oder FreeAndNil(..) sind einfach so. Wahrscheinlich irgendwelche Altlasten von vor 25 Jahren. Ich glaube nicht dass sich daran noch etwas ändern wird.

Das ist keine Altlast, sondern liegt daran, daß out- wie var-Parameter der exakt selbe Typ übergeben werden muss. Der tatsächliche Typ ist aber eben nicht bekannt.

Stevie 26. Jul 2016 12:07

AW: Interface - Supports
 
Zitat:

Zitat von Mavarik (Beitrag 1343449)
Zitat:

Zitat von stahli (Beitrag 1343448)

Vielleicht will ja mal jemand einen QC-Eintrag machen (ich bin da nicht mehr UpToDate).

Und wie soll der lauten?

Nehmen wir mal diesen Eintrag und kombinieren ihn mit einer Verbesserung der constraints für Generics und voila, wir können folgende Funktion schreiben:

Delphi-Quellcode:
function Supports<T: IInterface, guid>(const Instance: IInterface; out Intf: T): Boolean;

Bernhard Geyer 26. Jul 2016 12:25

AW: Interface - Supports
 
Ich vermute da schlagt die automtatische Referenzzählung zu.

Du darfst hier wirklich nicht

Delphi-Quellcode:
var lMyThing: TMyThing; // richtig wäre natürlich IMyThing
sondern mussst (!)
Delphi-Quellcode:
var lMyThing: IMyThing;
um mit dem Interface arbeiten zu können

Du bekommst kein TMyThing geliefert sondern nur das Interface. Deshalb ist es vollkommen OK das es danach kracht.
Der Compiler kann hier nicht so richtig warnen da er ja nur das Interface zu sehen bekommt.
Evtl. hat ja dieses einen (Kauf-)Hilfstools das weiter Compilerwarnungen/Fehler ergänzt

Stevie 26. Jul 2016 12:31

AW: Interface - Supports
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1343460)
Evtl. hat ja dieses einen (Kauf-)Hilfstools das weiter Compilerwarnungen/Fehler ergänzt

Ich hab es Roman Yankovsky mal vorgeschlagen (FixInsight)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:53 Uhr.

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