![]() |
Picture aus String laden
Guten Tag allerseits
Von der seriellen Schnittstelle bekomme ich von einem Controller ein Bild im Jpeg Format zugesendet. Im 1. Schritte habe ich diese Daten in eine Datei 'bild.jpg' geschrieben und dann mit
Delphi-Quellcode:
in der Form angezeigt.
Form1.Image1.Picture.LoadFromFile('bild.jpg');
Um dann nicht den Umweg über die Disk zu nehmen, habe ich es über String geladen. Nur: obwohl es einwandfrei funktioniert, habe ich keine Ahnung, ob ich alles richtig gemacht habe. Denn das meiste habe ich mehr intuitiv denn diskursiv gemacht. Darf ich Euch bitten, die folgenden Zeilen zu kritisieren. Danke für eure Mithilfe.
Delphi-Quellcode:
//==============================
// ListView1 Click //============================== procedure TForm1.ListView1Click(Sender: TObject); var nPictNr : Integer; cBild : String; TmpJpg : TJPEGImage; memStream : TMemoryStream; begin nPictNr := StrToInt(ListView1.Items[ListView1.ItemIndex].Caption); cBild := MyComPort.SendPicture(nPictNr); if cBild <> '' then begin memStream := TMemoryStream.Create(); memStream.WriteBuffer(cBild[1], Length(cBild)); memStream.Position := 0; TmpJpg := TJPEGImage.Create; TmpJpg.LoadFromStream(memStream); Form1.Image1.Picture.Assign(TmpJpg); end; end; |
Re: Picture aus String laden
Mit einem TStringStream wird die Sache noch eleganter:
Delphi-Quellcode:
cBild := MyComPort.SendPicture(nPictNr);
if cBild <> '' then begin strStream := TStringStream.Create(cBild); TmpJpg := TJPEGImage.Create; TmpJpg.LoadFromStream(memStream); Image1.Picture.Assign(TmpJpg); // unbedingt Form1. weglassen !!! TmpJpg.Free; // nicht vergessen !! end; |
Re: Picture aus String laden
wie bereits angemerkt hast du vergessen das jpg frei zu geben.
Zudem wäre es empfehlenswert da mit try-finally zu arbeiten damit es nicht zu unvorhergesehenen Dingen kommt falls mal kein Bild an der seriellen Schnittstelle empfangen wird oder ein Bild welches im falschen Format ist. |
Re: Picture aus String laden
Ich habe TStringStream und try-finally in mein Programm eingebaut. Danke für die Anmerkungen.
|
Re: Picture aus String laden
ich habe gerade noch etwas gesehen. Neben dem Jpeg gibst du auch den Stream nicht frei.
Kannst du nochmal den aktuellen Quelltext posten? |
Re: Picture aus String laden
Zitat:
Delphi-Quellcode:
Noch eine Frage: warum muss ich TmpJpg.free schreiben? Ist TmpJpg nicht eine locale Variable?
//==============================
// ListView1 Click //============================== procedure TForm1.ListView1Click(Sender: TObject); var nPictNr : Integer; cBild : String; TmpJpg : TJPEGImage; strStream : TStringStream; begin nPictNr := StrToInt(ListView1.Items[ListView1.ItemIndex].Caption); // ListView.Items[ListView1.ItemIndex].SubItems[0] waere 2. Spalte cBild := MyComPort.SendPicture(nPictNr, ProgressBar1); if cBild <> '' then begin strStream := TStringStream.Create(cBild); TmpJpg := TJPEGImage.Create; TmpJpg.LoadFromStream(strStream); Form1.Image1.Picture.Assign(TmpJpg); TmpJpg.Free; end; end; Edit: Try-Finaly herauskommentiert, weil noch fehlerhaft. |
Re: Picture aus String laden
Vergiss meine Frage :)
TmpJpg und strStream sind ja nur Pointer, die mit Create erschaffen werden; und deshalb mit free auch wieder aus der Memory entfernt werden müssen. |
Re: Picture aus String laden
Der Code in seiner ganzen strahlenden Schönheit:
Delphi-Quellcode:
//==============================
// ListView1 Click //============================== procedure TForm1.ListView1Click(Sender: TObject); var nPictNr : Integer; cBild : String; TmpJpg : TJPEGImage; strStream : TStringStream; begin nPictNr := StrToInt(ListView1.Items[ListView1.ItemIndex].Caption); // ListView.Items[ListView1.ItemIndex].SubItems[0] waere 2. Spalte cBild := MyComPort.SendPicture(nPictNr, ProgressBar1); if cBild <> '' then begin try strStream := TStringStream.Create(cBild); TmpJpg := TJPEGImage.Create; TmpJpg.LoadFromStream(strStream); Form1.Image1.Picture.Assign(TmpJpg); finally TmpJpg.Free; strStream.Free; end; end; end; |
Re: Picture aus String laden
Die beiden Creates gehören vor das try ;-). Wenn im Konstruktor ein Fehler auftritt, räumt Delphi das selber wieder auf.
|
Re: Picture aus String laden
Delphi-Quellcode:
//==============================
// ListView1 Click //============================== procedure TForm1.ListView1Click(Sender: TObject); var nPictNr : Integer; cBild : String; TmpJpg : TJPEGImage; strStream : TStringStream; begin nPictNr := StrToInt(ListView1.Items[ListView1.ItemIndex].Caption); // ListView.Items[ListView1.ItemIndex].SubItems[0] waere 2. Spalte cBild := MyComPort.SendPicture(nPictNr, ProgressBar1); if cBild <> '' then begin strStream := TStringStream.Create(cBild); Try TmpJpg := TJPEGImage.Create; Try TmpJpg.LoadFromStream(strStream); Form1.Image1.Picture.Assign(TmpJpg); Finally TmpJpg.Free; End; Finally strStream.Free; End; end; end; Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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 by Thomas Breitkreuz