![]() |
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:
Nur das ist nicht der sinn der Sache.
IDM_About:
begin PopUpMenu := nil; gruss |
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:
|
AW: Object (Interface) <> nil
Zitat:
Delphi-Quellcode:
TSkinPopUpMenu = class(TInterfacedPersistent, ISkinPopUpMenu)
gruss |
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.
|
AW: Object (Interface) <> nil
Zitat:
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 |
AW: Object (Interface) <> nil
Zitat:
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:... |
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:... |
AW: Object (Interface) <> nil
Zitat:
|
AW: Object (Interface) <> nil
Zitat:
Ok ich versuche es mal auf dem weg
Delphi-Quellcode:
Irgendwie widerspricht das jeglicher Logik.
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; Denn die Anwendung weis nicht ob das Object in der DLL frei ist oder nicht. gruss |
AW: Object (Interface) <> nil
Zitat:
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr. |
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