Autor Beitrag
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 14.05.13 15:40 
Hallo liebe Delphi-Helfer :)

ausblenden volle Höhe 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);
  // Formularwerte speichern
  if FFensterpfad <> '' then
  begin
    // Variable initialisieren
    Liste:= TStringlist.Create;
    Pfad:= FFensterpfad;
    // Ordnerstruktur erstellen
    Liste.LoadFromFile(Pfad);
    // Daten prüfen
    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;
    // Daten sammeln
    Zeile:= '';
    Zeile:= Zeile + Self.Name + DBZ;
    Zeile:= Zeile + IntToStr(Self.Height) + DBZ;
    Zeile:= Zeile + IntToStr(Self.Parent.Top) + DBZ;
//    Zeile:= Zeile + IntToStr(Parent.Left) + DBZ;
//    Zeile:= Zeile + IntToStr(Parent.Height) + DBZ;
//    Zeile:= Zeile + IntToStr(Parent.Width) + DBZ;
    // Daten speichern
    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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?