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!
irgendwie gehts.....