Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Object (Interface) <> nil (https://www.delphipraxis.net/193802-object-interface-nil.html)

EWeiss 11. Sep 2017 12:34


Object (Interface) <> nil
 
Ich erstelle ein Interface.

Delphi-Quellcode:
  PopUpMenu := CTRL_PopUpMenuCreate;


Wenn ich nun ein Item des PopUpMenu klicke beende ich das Interface bsp. TSkinPopUpMenu mit Free. (In der DLL)

Das Object ist nun NIL nur wie soll ich das der Anwendung mitteilen? Ohne extra Funktionen dafür erstellen zu müssen. (soll Automatisiert ablaufen)
Ein Prüfen auf
Delphi-Quellcode:
if not Assigned(PopUpMenu) then


würde in dem Fall nichts bringen.
Wieder so ein Spezial fall.

Das ist die Fehlermeldung die ich bekomme wenn PopUpMenu in der DLL NIL ist aber nicht in der Anwendung.
Ich könnte das Object selbst auf NIL setzen
Delphi-Quellcode:
    IDM_About:
      begin
        PopUpMenu := nil;
Nur das ist nicht der sinn der Sache.

gruss

himitsu 11. Sep 2017 13:13

AW: Object (Interface) <> nil
 
Das Menü oder mindestens das Interface, für den Zugriff darauf, gibt sich nicht frei, sondern erst wenn es keine Referenz mehr gibt ... Interface halt :zwinker:

EWeiss 11. Sep 2017 13:24

AW: Object (Interface) <> nil
 
Zitat:

Zitat von himitsu (Beitrag 1380776)
Das Menü oder mindestens das Interface, für den Zugriff darauf, gibt sich nicht frei, sondern erst wenn es keine Referenz mehr gibt ... Interface halt :zwinker:

Meine Classe aber oder?
Delphi-Quellcode:
  TSkinPopUpMenu = class(TInterfacedPersistent, ISkinPopUpMenu)


gruss

mkinzler 11. Sep 2017 13:44

AW: Object (Interface) <> nil
 
Dzu gibtst die nstanz der Klasse frei, diese verringert den Referenzzähler des Interfaces. Ist dieser dann 0 wird dieses auch Freigeben.

EWeiss 11. Sep 2017 13:51

AW: Object (Interface) <> nil
 
Zitat:

Zitat von mkinzler (Beitrag 1380785)
Dzu gibtst die nstanz der Klasse frei, diese verringert den Referenzzähler des Interfaces. Ist dieser dann 0 wird dieses auch Freigeben.

Die Classe TSkinPopUpMenu ist frei.
Nur die Anwendung bekommt ja nichts davon mit das ist mein Problem.

Und selbst setze ich sie nicht auf NIL in der DLL das geschieht automatisch sobald wie du sagst alle Referenzzähler auf 0 sind.

gruss

sakura 11. Sep 2017 14:04

AW: Object (Interface) <> nil
 
Zitat:

Zitat von EWeiss (Beitrag 1380787)
Nur die Anwendung bekommt ja nichts davon mit das ist mein Problem.

Solange Du in der Anwendung eine Variable hast, welche auf das Interface des Objektes zeigt, wird dieses nicht automatisch freigegeben.

Wenn Du also willst, dass das Objekt, zu welchem das Interface gehört, freigegeben wird, musst Du zuvor auch in der Anwendung die Variable auf nil setzen.

...:cat:...

sakura 11. Sep 2017 14:05

AW: Object (Interface) <> nil
 
Des Weiteren werden Variablen nicht irgendwie durch "Magie" auf nil gesetzt, sobald ein Objekt zerstört wird. Dazu müsste das Programm jederzeit jede Kopie - egal wie diese erstellt wurde - des Pointers kennen. Und das ist so nicht möglich.

...:cat:...

jaenicke 11. Sep 2017 14:10

AW: Object (Interface) <> nil
 
Zitat:

Zitat von EWeiss (Beitrag 1380769)
Wenn ich nun ein Item des PopUpMenu klicke beende ich das Interface bsp. TSkinPopUpMenu mit Free. (In der DLL)

Zwei Grundregeln musst du bei der Arbeit mit Interfaces beachten:
  • Niemals eine Referenz auf das Objekt behalten und nutzen! Immer nur mit dem Interface arbeiten. Schon gar nicht das Objekt mit Free freigeben und damit allen Interfaces unter dem Allerwertesten wegziehen. Das gibt sehr schöne Fehler...
  • Vor der Freigabe der DLL müssen alle Interfacereferenzen auf Interfaces der DLL im Hauptprogramm auf nil gesetzt werden und umgekehrt. Dafür sollte die DLL-Schnittstelle sinnvollerweise entsprechende Mechanismen anbieten.
Hintergrund ist, dass beim Setzen des Interfaces auf nil immer dessen Methode Release aufgerufen wird. Ist das Objekt dahinter dann schon freigegeben, knallt es logischerweise.

EWeiss 11. Sep 2017 14:16

AW: Object (Interface) <> nil
 
Zitat:

musst Du zuvor auch in der Anwendung die Variable auf nil setzen.
warum zuvor und nicht nachher?

Ok ich versuche es mal auf dem weg
Delphi-Quellcode:
    WM_NCRBUTTONDOWN:
      begin
        if Assigned(PopUpMenu) then
          PopUpMenu := Nil;
        CreatePopupMenu(WinHandle);

        GetCursorPos(p);
        GetWindowRect(gPMenu.PopUpMenu, rc);
        ClientToScreen(gPMenu.PopUpMenu, p);

        MenuWahl := PopUpMenu.TrackPopupMenu(gPMenu.PopUpMenu, p.x, (p.y - rc.Bottom), rc.Right,
          rc.Bottom);

        if MenuWahl then
          SendMessage(WinHandle, WM_COMMAND, Makelong(word(MenuWahl), 0), 0);
      end;
Irgendwie widerspricht das jeglicher Logik.
Denn die Anwendung weis nicht ob das Object in der DLL frei ist oder nicht.

gruss

sakura 11. Sep 2017 14:19

AW: Object (Interface) <> nil
 
Zitat:

Zitat von EWeiss (Beitrag 1380794)
Denn die Anwendung weis nicht ob das Object in der DLL frei ist oder nicht.

Wie sollte es die Anwendung den wissen, wenn diese nicht informiert wird? :gruebel:

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 Uhr.
Seite 1 von 4  1 23     Letzte »    

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