Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi [VST] Bei SaveNode mit TBitmap eine AV (https://www.delphipraxis.net/153327-%5Bvst%5D-bei-savenode-mit-tbitmap-eine-av.html)

Mikescher 29. Jul 2010 11:44

[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:
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;
Das funktioniert auch.

jetzt habe ich das Problem das in meinem Datenrecord sich auch ein TBitmap befindet, dieses speichere/lade ich jetzt so:
Delphi-Quellcode:
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;
Jedoch sobald ich dann auf das Bitmap zugreifen wie ( wie hier: ) gibt es eine AV
Delphi-Quellcode:
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;
Schonmnal im vorraus Danke für jede Hilfe
... Mike

Mikescher 29. Jul 2010 20:12

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:
Data.Cover.free
eine AV bekomme. obwohl ich das Bitmap ja eigentlich korrekt erzeuge.
Ich bin mit meinem Latein gerade ziemlich am Ende :cry:

daywalker9 29. Jul 2010 20:42

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

Namenloser 29. Jul 2010 20:49

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:
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;
[edit]
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]

Mikescher 29. Jul 2010 20:52

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 19:35 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