AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Object (Interface) <> nil

Ein Thema von EWeiss · begonnen am 11. Sep 2017 · letzter Beitrag vom 13. Sep 2017
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
EWeiss
(Gast)

n/a Beiträge
 
#1

Object (Interface) <> nil

  Alt 11. Sep 2017, 12:34
Ich erstelle ein Interface.

  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
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

Geändert von EWeiss (11. Jul 2019 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#2

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 13:13
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 13:24
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
Meine Classe aber oder?
  TSkinPopUpMenu = class(TInterfacedPersistent, ISkinPopUpMenu)

gruss
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 13:44
Dzu gibtst die nstanz der Klasse frei, diese verringert den Referenzzähler des Interfaces. Ist dieser dann 0 wird dieses auch Freigeben.
Markus Kinzler
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 13:51
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 14:04
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 14:05
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.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.326 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 14:10
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 14:16
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
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Object (Interface) <> nil

  Alt 11. Sep 2017, 14:19
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?

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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