AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Classe/Interface aus WinProc aufrufen
Thema durchsuchen
Ansicht
Themen-Optionen

Classe/Interface aus WinProc aufrufen

Ein Thema von EWeiss · begonnen am 14. Sep 2017 · letzter Beitrag vom 14. Sep 2017
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 18:09
Zitat:
Auf DLL-Seite ist das Problem, dass "SkinPopUpMenu" nicht Nil ist?
richtig deshalb kann ich auch kein Callback schicken.
Das macht nur sinn wenn in der DLL das Interface Nil ist vorher kann ich das in der Anwendung nicht löschen.

Zitat:
Wird vielleicht SkinPopUpMenu erst mal auf Nil gesetzt und dann nochmal neu durch irgendeine unbeabsichtigte Reaktion wieder zugewiesen?
Nein denn _Release wird nicht aufgerufen.

Zitat:
Der Callback wird aber auf Anwendungsseite ausgeführt?
Nein kann ich nicht schicken.. ansonsten ja wenn das Interface in der DLL Nil ist funktioniert das Callback.

Aus der DLL heraus wenn SkinPopUpMenu Nil ist

gruss

Geändert von EWeiss (14. Sep 2017 um 18:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 19:10
Ok.
Delphi-Quellcode:
  if not Assigned(SkinPopUpMenu) then
      PopUpCallback(OnPopupDestroyed);
wird nicht ausgeführt, weil SkinPopupMenu immer zugewiesen ist (lassen wir mal die doppelte Verneinung weg).

Ich habe hier den Thread durchsucht nach "SkinPopUpMenu :=". Zumindest hier kann ich nichts finden, das SkinPopupMenu Nil zuweist.

Dort, wo das passiert (oder erfolgt dies vielleicht gar nicht?), sollte SkinPopupMenu danach ja auch Nil sein (andernfalls verwendest Du vielleicht eine lokale Variable gleichen Namens).

Wenn das so ist,
- kommt das Programm danach nie mehr zur obigen Prüfung
oder
- SkinPopupMenu wird wieder ein InterfaceObject zugewiesen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 19:26
Zitat:
Zumindest hier kann ich nichts finden, das SkinPopupMenu Nil zuweist.
Den Status Nil erhält das SkinPopupMenu wenn der Reverenz Zähler auf 0 ist.

Nur das wird er nie.
Das ist doch mein Problem das ich dir über Mail mitgeteilt habe.
Deshalb wollte ich alle Variablen des SkinPopupMenu mit FillChar auf 0 setzen um den Status bzw. den Reverenz Zähler auf 0 zu bekommen.
Du sagtest das soll ich nicht tun.

Im Netzt ist leider nichts zu finden ohne das man sich ein Buch dafür zulegen muss.

Der eine sagt man darf ein Interface selber nicht auf NIL setzen.
Der andere sagt doch ist kein Problem
Der nächste sehe zu das der Reverenz Zähler auf 0 geht dann ist SkinPopupMenu automatisch Nil.

Langsam blicke ich da selbst nicht mehr durch da jeder etwas anderes sagt.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 19:40
Den Referenzzähler verwaltet Delphi für Dich.
Und zwar wird er erhöht, wenn Du einer Interfacevariable Dein InterfaceObject zuweist und verringert, wenn Du Nil zuweist.

Intf1 := TInterfacedObject.Create; // RefCount = 1
Intf2 := Intf1; // RefCount = 2
Intf1 := Nil; // RefCount = 1
Intf2 := Nil; // RefCount = 0 --> InterfaceObject.Free wird "von Delphi" ausgeführt.

In dem anderen Thread hatte ich Dir das erklärt.


Zitat:
Den Status Nil erhält das SkinPopupMenu wenn der Reverenz Zähler auf 0 ist.
kann also nicht funktionieren, da der Referenzzähler erst auf 0 fällt, wenn alle Referenzvariablen Nil sind.


Also setze SkinPopupMenu auf Nil, wenn das Ding nicht mehr gebraucht wird.
Dann wird der Callback ausgeführt und auch im Hauptprogramm die Referenzvariable auf Nil gesetzt und das Objekt freigeben.


Du musst den Interfacevariablen Nil zuweisen. Den Rest macht Delphi für Dich.

In dem anderen Projekt scheint das ja auch zu klappen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (14. Sep 2017 um 19:42 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 19:42
Ich habe versucht jetzt durchzusteigen wo das Problem ist.
Zitat:
Den Status Nil erhält das SkinPopupMenu wenn der Reverenz Zähler auf 0 ist.
das widerspricht allem was mit Interfaces zu tun hat.

Andersherum wird ein Schuh daraus:
Wenn alle!!! Referenzen auf das Interface nil sind geht der Referenz Zähler auf 0 und das darunter liegende Objekt wird freigegeben.

Du weist wie Du mich erreichen kannst......
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 19:48
Wenn alle!!! Referenzen auf das Interface nil sind geht der Referenz Zähler auf 0 und das darunter liegende Objekt wird freigegeben.
Noch genauer wäre: "... wenn alle Referenzen auf das InterfaceObject Nil sind ..."

Das ist zum Verständnis vielleicht wichtig, da wir hier schon so lange um den Brei herum reden.
Wenn ein Objekt 5 Interfaces unterstützt und 3 Interfaces je einer Interfacevariablen zugewiesen sind, ist der RefCounter des Objektes = 3.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 19:51
Noch genauer wäre: "... wenn alle Referenzen auf das InterfaceObject Nil sind ..."
Oder so
Fritz Westermann
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 20:06
Zitat:
das widerspricht allem was mit Interfaces zu tun hat.
Aber das ist was man mir hier verklickert.

Ich suche das jetzt raus.
Zitat:
•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...
Free ist für mich das gleiche wie als wenn ich das Interface auf NIL setze. Darf man aber anscheinend nicht.

Dann tue ich folgendes..
Delphi-Quellcode:
  // TODO
FillChar(SkinPopUpMenu, SizeOf(SkinPopUpMenu), 0);

  if not Assigned(SkinPopUpMenu) then
    PopUpCallback(OnPopupDestroyed);
Hier setze ich alle variablen auf 0, NIL oder wie auch immer danach ist mein Interface NIL (Da keine Variable mehr in gebrauch ist.)
Darf man aber anscheinend auch nicht.

Und ja ich weis das man eine Variable direkt auf Nil setzen kann wäre es nicht so dann sollte man es direkt lassen.
Aber da hat man mir dann wieder zwischen gepfuscht mit der Meldung nein man darf kein Interface selbst auf NIL setzen.
SkinPopUpMenu := Nil;
Ehrlich keine Ahnung was das noch soll.
Wie man es macht, macht man es falsch.

Hätte man mich nicht so irritiert mit den Referenz Zähler dann hätte ich schon lange einfach vor

PopUpCallback(OnPopupDestroyed);

Einfach

SkinPopUpMenu := Nil;

gesetzt und fertig.
Wäre ja nicht das erste mal das ich eine Variable auf NIL setze LOL.

Zitat:
Noch genauer wäre: "... wenn alle Referenzen auf das InterfaceObject Nil sind ..."
Sorry! Das ist genau mein Problem jeder sagt was anderes...
Mich interessiert das überhaupt nicht ob der Zähler 0 oder auf 3 steht.

Mich interessiert nur eins kann ich mein Interface selbst auf NIL setzen oder nicht.

Dann wäre meine Lösung diese
Delphi-Quellcode:
  SkinPopUpMenu := nil;
  PopUpCallback(OnPopupDestroyed);
und fertig .. alles so wie gehabt. (Bei normalen Classen)


gruss

Geändert von EWeiss (14. Sep 2017 um 20:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.358 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 20:11
Genau so ist es korrekt. Berichte mal, ob dann alles funktioniert.

Wenn Du mit Interfaces incl. Referenzzählung arbeitest, dann nie bei dem Objekt hinter dem Interface Free aufrufen!
Immer nur Interfacevariablen Nil zuweisen.
Bei der letzten Nil-Zuweisung wird Free automatisch ausgeführt. Dafür ist die Referenzzählung da.

Wie schon mal gesagt: "InterfaceObject.Free" ist etwas völlig anderes als "MyInterfaceVariable := Nil"
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Classe/Interface aus WinProc aufrufen

  Alt 14. Sep 2017, 20:14
Genau so ist es korrekt. Berichte mal, ob dann alles funktioniert.

Wenn Du mit Interfaces incl. Referenzzählung arbeitest, dann nie bei dem Objekt hinter dem Interface Free aufrufen!
Immer nur Interfacevariablen Nil zuweisen.
Bei der letzten Nil-Zuweisung wird Free automatisch ausgeführt. Dafür ist die Referenzzählung da.

Wie schon mal gesagt: "InterfaceObject.Free" ist etwas völlig anderes als "MyInterfaceVariable := Nil"
Da muss ich nichts berichten das funktioniert hat immer schon.
Warum auch nicht.
Ich habe mich hier einfach nur verrückt machen lassen weil entschuldige kein Angriff gegen irgend jemanden jeder etwas anderes gesagt hat.

Zitat:
Wie schon mal gesagt: "InterfaceObject.Free" ist etwas völlig anderes als "MyInterfaceVariable := Nil"
Ok das war wohl das Missverständnis warum das jetzt so ausgeartet ist.


gruss
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:56 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