![]() |
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:
daraufhin öffne ich den File mit AssignFile und lese ihn in ein DBMEmo.
MyStream := TFileStream.Create('C:\test.tmp', fmCreate or fmShareCompat);
try Mystream.WriteComponent(tmptree); finylls MyStream.free; end;
Delphi-Quellcode:
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.
AssignFile(extern, 'C:\test.tmp');
reset(extern); while not eof(extern) do begin readln(extern, tmpvar); DBMemo1.Lines.Add(tmpvar); end; 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 |
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:
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:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz