Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Komponentenprogrammierung, Fehlermeldung mit Parent
Jakane - Di 14.05.13 15:40
Titel: Komponentenprogrammierung, Fehlermeldung mit Parent
Hallo liebe Delphi-Helfer :)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| destructor TJPanel.Destroy; var Pfad, Zeile : String; f, c : Integer; Liste : TStringlist; begin DBZ:= Chr(134); if FFensterpfad <> '' then begin Liste:= TStringlist.Create; Pfad:= FFensterpfad; Liste.LoadFromFile(Pfad); c:= -1; For f:= 0 to Liste.Count - 1 do begin Zeile:= Liste.Strings[f]; if Zeile = Self.Name then begin c:= f; end; end; Zeile:= ''; Zeile:= Zeile + Self.Name + DBZ; Zeile:= Zeile + IntToStr(Self.Height) + DBZ; Zeile:= Zeile + IntToStr(Self.Parent.Top) + DBZ; if c = -1 then Liste.Add(Zeile); if c > -1 then begin Liste.Delete(c); Liste.Add(Zeile); end; Liste.SaveToFile(Pfad); end; inherited Destroy; end; |
Wenn ein Formular, auf dem mein Panel liegt, geschlossen wird, wird Destroy ausgelöst.
Wenn das passiert, möchte ich die Position des Parents (meistens ein Formular) auslesen und in eine Datei schreiben.
Das schreiben und speichern der Datei funktioniert Problemlos.
Nur wenn ich das Parent.Top mit abspeichern will, bekomm ich eine Adressen-Fehlermeldung.
Owner hat nicht die Werte die ich brauche.
Gibt es eine Möglichkeit dennoch an diese Werte ranzukommen?
jaenicke - Di 14.05.13 16:35
Wenn die Komponente schon zerstört wird, hat sie vermutlich schlicht keinen Parent mehr.
Bleibt also nur SetParent zu überschreiben um mitzubekommen, wenn deine Komponente zerstört wird...
Wenn du in SetParent ankommst und csDestroying in ComponentState dabei ist, wird deine Komponente gerade zerstört (und der neue Wert für Parent ist auch nil). Dann kannst du den letzten Wert von Parent nehmen (das ist ja in dem Moment noch der aktuelle Wert von Parent) und damit arbeiten, sofern diese Komponente noch existiert.
WasWeißDennIch - Di 14.05.13 16:59
Vielleicht könnte man es auch in der Destroying-Methode abarbeiten (ungetestet). Da diese aber nicht virtuell ist, kann man sie nur verdecken, aber nicht überschreiben.
Jakane - Mi 15.05.13 12:03
jänicke hat recht, mein parent ist nil *hätte selbst drauf kommen können*
Hab nun FParent: TWinControl und initialisiere es beim Loaded und schon keine Fehlermeldung mehr, danke :D
jaenicke - Mi 15.05.13 12:47
Wenn das allgemein funktionieren soll, kannst du aber nicht davon ausgehen, dass der Parent in Loaded schon gesetzt ist. Was, wenn die Komponente z.B. dynamisch erstellt wird?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!