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 Komponente per WriteComponent in Datenbank speichern (https://www.delphipraxis.net/19390-komponente-per-writecomponent-datenbank-speichern.html)

BenjaminHelbig 2. Apr 2004 09:19


Komponente per WriteComponent in Datenbank speichern
 
Hi DP'ler

ich habe folgendes Problem. Ich möchte eine TreeView in einer MySQL Datenbank speichern. DA ich aus der TreeView alle Formatierungen übernehmen möchte speichere ich die TreeView zuerst als Datei:

Delphi-Quellcode:
MyStream := TFileStream.Create('C:\test.tmp', fmCreate or fmShareCompat);
try Mystream.WriteComponent(tmptree);
finylls MyStream.free;
end;
daraufhin öffne ich den File mit AssignFile und lese ihn in ein DBMEmo.

Delphi-Quellcode:
AssignFile(extern, 'C:\test.tmp');
reset(extern);
while not eof(extern) do
 begin
   readln(extern, tmpvar);
   DBMemo1.Lines.Add(tmpvar);
 end;
Das Problem bei der Sache ist das beim Rückschreiben der Komponente fehler auftreten wie Stream Error usw. Wenn ich aber über WriteComponent nur in den File schreiben lasse und von dort wieder zurücklese funzt es einwandfrei.

Habt ihr eine Idee? Ich vermute mal das es daran liegt, dass er mir beim schreiben in das DBMEmo die Binärstruktur zerstört.

Grüße Benjamin

maximov 2. Apr 2004 09:31

Re: Komponente per WriteComponent in Datenbank speichern
 
Moin.

Ich sehe da uzwei möglichkeiten:

1. Du versuchst die kompo direkt in ein binäres DB feld zu streamen, einen Blob oder so. Bin da kein spezialist...ist aber IMO die beste und schnellste lösung!

2. Du konvertierst den binären stream in ein text-dfm. -> ObjectBinaryToText -> ObjectTextToBinary

So hab ich es gelöst:
Delphi-Quellcode:
function SaveCompoToFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean;
var Stream1:TMemoryStream;
    Stream2:TMemoryStream;
      format : TStreamOriginalFormat;
begin
  result := false;
   format := sofText;
   Stream1 := TMemoryStream.Create;
  Stream2 := TMemoryStream.Create;
   try
      Stream1.WriteComponent(aCompo);
    Stream1.Position := 0;
    if not asBinary then
    begin
      format := sofText;
      ObjectBinaryToText(Stream1,Stream2,format);
    end else Stream1.SaveToStream(Stream2);
    Stream2.SaveToFile(FileName);
    result := true;
   finally
      Stream1.Free;
      Stream2.Free;
   end;
end;


function LoadCompoFromFile(aCompo : TComponent; FileName: string; asBinary: Boolean = false): boolean;
var FileStream:TFileStream;
    MemoryStream:TMemoryStream;
    format:TStreamOriginalFormat;
begin
  result := false;
  if not FileExists(fileName) then exit;
  MemoryStream := TMemoryStream.Create;
  FileStream := TFileStream.Create(FileName,fmOpenRead);
  try
    if not asBinary then
    begin
      format := sofBinary;
      ObjectTextToBinary(FileStream,MemoryStream,format);
    end else MemoryStream.LoadFromStream(FileStream);
    MemoryStream.Position := 0;    
    MemoryStream.ReadComponent(aCompo);
    result := true;
  finally
    FileStream.Free;
    MemoryStream.Free;
  end;
end;
Denke das hilft dir erstmal weiter. Aber in eine datei schreiben dann in ein memo laden, um es dann in die DB zu streamen hört sich nicht gerade effizient an :wink:


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