Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TreeView hat kein Übergeordnetes Fenster (StringToComponent) (https://www.delphipraxis.net/26394-treeview-hat-kein-uebergeordnetes-fenster-stringtocomponent.html)

Softchaos67 23. Jul 2004 09:24


TreeView hat kein Übergeordnetes Fenster (StringToComponent)
 
Hallo,
ich versuche einen TreeView als String zu speichern. Habe dazu in der Delphi Hilfe die funktionen
Code:
function ComponentToString(Component: TComponent): string;
function StringToComponent(Value: string): TComponent;
gefunden.
ComponentToString funktioniert erwartungsgemäss.
Wenn ich aber versuche den TreeView wieder zu laden bekomme ich folgende FehlerMeldung:

Element TreeView1 hat kein übergeordnetes Fenster!

Die Exception wird in der funktion StringToComponent erzeugt
Result := BinStream.ReadComponent(nil);

Woran könnte das liegen?
Hier der Source
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
   Panel1 := TPanel.Create(Self);
   If OpenDialog1.Execute then begin
      memo1.Lines.LoadFromFile(OpenDialog1.FileName);
      Panel1 := TPanel(StringToComponent(memo1.Text));
   end;
   Panel1.Parent := Form2;
   Panel1.Visible := true;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
   TreeView1 :TTreeView;
begin
  TreeView1 := TTreeView.Create(Self);
  TreeView1.Parent := Panel2;

   If OpenDialog1.Execute then begin
      memo1.Lines.LoadFromFile(OpenDialog1.FileName);
      TreeView1 := TTreeView(StringToComponent(memo1.Text));
   end;
   TreeView1.Visible := false;
   TreeView1.Parent := Panel2;
   TreeView1.Visible := true;
end;
Mit dem Panel funktioniert das tadellos#
Hier noch die funktionen:
Delphi-Quellcode:
function ComponentToString(Component: TComponent): string;

var
  BinStream:TMemoryStream;
  StrStream: TStringStream;
  s: string;
begin
  BinStream := TMemoryStream.Create;
  try
    StrStream := TStringStream.Create(s);
    try
      BinStream.WriteComponent(Component);
      BinStream.Seek(0, soFromBeginning);
      ObjectBinaryToText(BinStream, StrStream);
      StrStream.Seek(0, soFromBeginning);
      Result:= StrStream.DataString;
    finally
      StrStream.Free;

    end;
  finally
    BinStream.Free
  end;
end;
//----------------------------------------------------------------------------------------------------------------------
function StringToComponent(Value: string): TComponent;
var
  StrStream:TStringStream;
  BinStream: TMemoryStream;
begin
  StrStream := TStringStream.Create(Value);
  try
    BinStream := TMemoryStream.Create;
    try
      ObjectTextToBinary(StrStream, BinStream);
      BinStream.Seek(0, soFromBeginning);
      Result := BinStream.ReadComponent(nil);

    finally
      BinStream.Free;
    end;
  finally
    StrStream.Free;
  end;
end;
//----------------------------------------------------------------------------------------------------------------------
initialization
   RegisterClass(TPanel);
   RegisterClass(TTreeView);
end.
danke für eure Hilfe!

torud 23. Jul 2004 09:47

Re: TreeView hat kein Übergeordnetes Fenster (StringToCompon
 
Also zu Deinem Problem kann ich Dir nicht wirklich was sagen, aber ich nutze Folgende Methoden, wenn ich mal einen Treeview abspeichern und wieder laden will.

Delphi-Quellcode:
TreeView1.SaveToFile('inhalt.dat');
und zum laden

Delphi-Quellcode:
TreeView1.SaveFromFile('inhalt.dat');
Vielleicht bringt Dich das weiter!?
Tom

Softchaos67 23. Jul 2004 11:09

Re: TreeView hat kein Übergeordnetes Fenster (StringToCompon
 
Ja, das hatte ich auch schon.
Ich bräuchte halt die andere Version.
Im übrigen will ich wissen, warum das Panel funktioniert, die TreeView aber nicht.
Trotzdem Danke :P

Touchdown 23. Jul 2004 11:28

Re: TreeView hat kein Übergeordnetes Fenster (StringToCompon
 
Zu dem Fehler, falls es unklar ist. Das Treeview hat keinen Parent, das ist relativ klar, warum dies so ist, ist nicht ganz so einfach :shock:

Möglicherweise hast du zwei Zeiger von TTreeview, in Gegensatz zu Panel_Beispiel ist Treeview1 lokal deklariert. Ich denke es gibt zweimal Treeview1.

Softchaos67 26. Jul 2004 07:08

Re: TreeView hat kein Übergeordnetes Fenster (StringToCompon
 
wenn ich keine lokale TreeView Variable deklariere oder den Create weglasse habe ich die selbe Fehlermeldung. Was die Meldung bedeutet ist mir auch klar., Der TV braucht einen Parent um sich zu visualisieren. Nur, an welcher stelle des ladens kann/muss ich ihm den Parent zuweisen???
Danke für eure Beiträge!

Softchaos67 26. Jul 2004 07:10

Re: TreeView hat kein Übergeordnetes Fenster (StringToCompon
 
Ach so, moment. Der Parent ist zugewiesen. Der Fehler kein übergeordnetes Fenster könnte wohl doch auch was anderes bedeuten oder?

Softchaos67 28. Jul 2004 10:41

Re: TreeView hat kein Übergeordnetes Fenster (StringToCompon
 
gibts noch ideen?

v2afrank 21. Sep 2020 14:11

AW: TreeView hat kein Übergeordnetes Fenster (StringToComponent)
 
Neuer Rekord ? Über 16 Jahre her.
Aber ich habe jetzt genau das gleiche Problem Ich kann aber auch ein Ergänzung geben. Als value bekommt die funktion folgenden String übergeben
Delphi-Quellcode:
object ListView1: TListView
  Left = 24
  Top = 40
  Width = 385
  Height = 150
  Columns = <
    item
      Width = 75
    end
    item
      Width = 75
    end
    item
      Width = 75
    end>
  Items.ItemData = {
    01AC0000000200000000000000FFFFFFFFFFFFFFFF0200000000000000094500
    69006E007400720061006700200031000A450069006E00740072006100670020
    00310031000A450069006E00740072006100670020003100320000000000FFFF
    FFFFFFFFFFFF020000000000000009450069006E007400720061006700200032
    000A450069006E0074007200610067002000320031000A450069006E00740072
    0061006700200032003200FFFFFFFFFFFFFFFF}
  TabOrder = 0
  ViewStyle = vsReport
end
Wenn jetzt der Teil mit Items.Itemdata weggelassen wird also dieser string übergeben wird funktioniert es
object ListView1: TListView
  Left = 24
  Top = 40
  Width = 385
  Height = 150
  Columns = <
    item
      Width = 75
    end
    item
      Width = 75
    end
    item
      Width = 75
    end>
  TabOrder = 0
  ViewStyle = vsReport
end
Die genaue Fehlermeldung lautet 'Fehler beim Lesen von ListView1.Items.ItemData: Element 'ListView1' hat kein übergeordnetes Fenster'. hat einer eine Idee woran es liegen kann ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 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