![]() |
[VST] Bei SaveNode mit TBitmap eine AV
Hallo,
bei der VST-Komponente (jetzt Version 4.8.5) ist es ja möglich über das Event OnSaveNode / OnLoadNode die einem Node mitgegebenen Daten mitzuspeichern wenn man den VST speichert. für einen Integer in meinem Datenrecord schreibe ich dann so etwas:
Delphi-Quellcode:
Das funktioniert auch.
procedure TForm1.VSTLoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream); var Data: PTreeData; begin Data := VST.GetNodeData(Node); Stream.read(Data.Parts, SizeOf(Data.Parts)); end; procedure TForm1.VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Data: PTreeData; begin Data := VST.GetNodeData(Node); Stream.write(Data.Parts, SizeOf(Data.Parts)); end; jetzt habe ich das Problem das in meinem Datenrecord sich auch ein TBitmap befindet, dieses speichere/lade ich jetzt so:
Delphi-Quellcode:
Jedoch sobald ich dann auf das Bitmap zugreifen wie ( wie hier: ) gibt es eine AV
procedure TForm1.VSTSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream); var Data: PTreeData; Len: integer; begin Data := VST.GetNodeData(Node); Len := SizeOf(Data.Image); Stream.write(Len, Sizeof(Len)); Stream.write(Data.Cover, SizeOf(Data.Image)); end; procedure TForm1.VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Data: PTreeData; Len: integer; begin Data := VST_Movies.GetNodeData(Node); Data.Cover := TBitmap.Create; Len := Stream.Read(Len, SizeOf(Len)); Stream.read(Data.Image, Len); end;
Delphi-Quellcode:
Schonmnal im vorraus Danke für jede Hilfe
procedure TForm1.VSTClick(Sender: TObject);
var Node: PVirtualNode; Data: PTreeData; begin Node:=VST.FocusedNode; if not Assigned(Node) then Exit; Data := vst.GetNodeData(Node); Image1.Picture.Bitmap := Data^.Image; end; ... Mike |
AW: [VST] Bei SaveNode mit TBitmap eine AV
Was ich jetzt gerade noch herausgefunden habe ist der seltsame Effekt, dass ich auch bei
Delphi-Quellcode:
eine AV bekomme. obwohl ich das Bitmap ja eigentlich korrekt erzeuge.
Data.Cover.free
Ich bin mit meinem Latein gerade ziemlich am Ende :cry: |
AW: [VST] Bei SaveNode mit TBitmap eine AV
Ein TBitmap hat doch ein SaveToStream? Nehm das doch anstelle dir den Krams da selber reinzuschreiben. Denn Length(TBitmap) bringt dir hier gar nichts. Du kannst keine Klassen in einen Memorystream schreiben. Daher mein rat nutzte Bitmap.SaveToStream
|
AW: [VST] Bei SaveNode mit TBitmap eine AV
Was mir auffällt, ist, dass du Data^.Cover zwar erzeugst, aber danach nichts mehr damit machst. Stattdessen lädst du die Bilddaten in Data^.Image. Ich weiß aber im Moment weder, was TTreeData.Cover ist, noch was TTreeData.Image ist, weil du leider die Definition nicht verraten hast. Es wäre hilfreich, wenn du die noch nachliefern würdest. Mir scheint aber, als würdest du die beiden Felder an einigen Stellen vermischen, was vermutlich zu dem Fehler führt.
Erwarten würde ich sowas:
Delphi-Quellcode:
[edit]
procedure TForm1.VSTSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream); var Data: PTreeData; begin Data := VST.GetNodeData(Node); Data^.Cover.SaveToStream(Stream); end; procedure TForm1.VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode; Stream: TStream); var Data: PTreeData; Len: integer; begin Data := VST_Movies.GetNodeData(Node); Data^.Cover := TBitmap.Create; Data^.Cover.LoadFromStream(Stream); end; Da kam kein roter Kasten [/edit] [edit2] Wieso nutzt du eigentlich nicht die objektorientierte Variante? Mach es dir doch leichter und kapsel solche Angelegenheiten wie Erzeugen, Speichern und Laden. [/edit2] |
AW: [VST] Bei SaveNode mit TBitmap eine AV
Danke daywalker9,
es funktioniert :love: , wirklich vielen, vielen Dank :-D . |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 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