-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Also die Optik entschädigt jede Mühe. Das hast Du echt drauf. :thumb:
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Wir helfen uns ja hier gegenseitig und freiwillig.
Persönliche Angriffe gibt es ja hier zum Glück so gut wie nicht - ist ja leider selten im Netz, dass es so freundlich zugeht.
Insofern muss man nur versuchen, nicht aneinander vorbei zu reden.
An Dich der Tipp: Es wäre vielleicht etwas geordneter zugegangen, wenn Du die Probleme und Fragen präziser formuliert hättest.
Wobei mir auch klar...
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Du hast das m.E. nur falsch verstanden. Ist auch kein Vorwurf. :-)
Ich habe auch Interfaces schon eine Weile genutzt, bis ich die Zusammenhänge wirklich verstanden habe.
Jetzt ist mir gar nicht klar, was daran so schwierig war.
Auch durch so eine Diskussion hier festigt man die eigenen Kenntnisse.
Insofern profitieren hier alle. :thumb:
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
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...
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
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.
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
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...
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Ok.
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?),...
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Schwierig nachzuvollziehen, finde ich.
Auf DLL-Seite ist das Problem, dass "SkinPopUpMenu" nicht Nil ist?
if not Assigned(SkinPopUpMenu) then
PopUpCallback(OnPopupDestroyed);
Der Callback wird aber auf Anwendungsseite ausgeführt?
Dann muss die obige Anweisung ja ausgeführt worden sein.
Wenn SkinPopUpMenu nicht Nil ist, müsstest Du Nil zuweisen - das kann nicht das Problem sein.
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Das sollte doch in der Callback-Methode gemacht werden - oder?
Wird die ausgeführt?
Wenn ja, müsste später ja SkinPopUpMenu wieder etwas zugewiesen werden.
Wenn nein, dann musst Du prüfen, warum nicht.
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Oha, vielen Dank! Wichtiger Hinweis!
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Ich hätte das auch schon vorgeschlagen, dachte aber, das ginge nicht, weil _AddRef ja nicht virtuell ist und somit nicht überschrieben werden kann...
Gibt es (zum Verständnis) eine Erklärung, warum das so funktioniert?
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Habe das gerade korrigiert.
Ich schreibe hier schnell mal parallel während der Arbeit. Da bin ich manchmal nicht konzentriert genug. :-(
Dann musst Du mal schauen, wo da noch eine Referenz gehalten wird.
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Ah, ok.
Dann tippe ich wirklich auf gegenseitige Referenzierung.
Wenn das Submenu sein Hauptmenu kennt (also ein einem Property oder ein einer Liste speichert) und auch das Hauptmenu sein Submenü verwaltet (was ja zu vermuten ist ;-) ) dann wird genau dieses Problem vorliegen.
Quatsch. In der Eile hatte ich das falsch gelesen.
Also dann wir es im OTTB noch irgendeine Referenz geben, der...
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Sorry, ich kann Deine Fragen nicht ausreichend nachvollziehen.
Sind das zwei Threads zu zwei verschiedenen Projekten?
Existiert das Problem der Nicht-Freigabe im anderen Thread noch - und wenn, dann in dem anderen Projekt oder nur in diesem hier?
Wenn die Fragestellung nicht eindeutig klar ist, kann man darauf natürlich auch nicht hilfreich antworten.
Aber ich orakle mal etwas...
...
-
Forum: Programmieren allgemein
Delphi
by stahli,
14. Sep 2017
Ist das hier die Fortsetzung von dem: http://www.delphipraxis.net/193802-object-interface-nil.html#post1381069 ?
Du hast m.E. im Projekt als auch hier in Deinen Fragen zu wenig Ordnung bzw. Übersicht.
Wenn Du mit Interfaces arbeitest und die Referenzzählung nutzen willst, musst Du halt den Ablauf soweit überschauen, dass Du weißt wo Referenzen zugewiesen und ob die wieder aufgelöst werden....