Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Picture aus String laden (https://www.delphipraxis.net/125562-picture-aus-string-laden.html)

mkmk 8. Dez 2008 15:27


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:
Form1.Image1.Picture.LoadFromFile('bild.jpg');
in der Form angezeigt.

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;

shmia 8. Dez 2008 18:01

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;

SirThornberry 8. Dez 2008 18:08

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.

mkmk 8. Dez 2008 18:23

Re: Picture aus String laden
 
Ich habe TStringStream und try-finally in mein Programm eingebaut. Danke für die Anmerkungen.

SirThornberry 8. Dez 2008 18:29

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?

mkmk 8. Dez 2008 18:44

Re: Picture aus String laden
 
Zitat:

Zitat von SirThornberry
ich habe gerade noch etwas gesehen. Neben dem Jpeg gibst du auch den Stream nicht frei.
Kannst du nochmal den aktuellen Quelltext posten?

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);
    TmpJpg := TJPEGImage.Create;
    TmpJpg.LoadFromStream(strStream);
    Form1.Image1.Picture.Assign(TmpJpg);
    TmpJpg.Free;
  end;
end;
Noch eine Frage: warum muss ich TmpJpg.free schreiben? Ist TmpJpg nicht eine locale Variable?

Edit: Try-Finaly herauskommentiert, weil noch fehlerhaft.

mkmk 8. Dez 2008 18:51

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.

mkmk 8. Dez 2008 18:52

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;

jaenicke 8. Dez 2008 18:58

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.

alzaimar 8. Dez 2008 18:59

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:

Zitat von mkmk
Noch eine Frage: warum muss ich TmpJpg.free schreiben? Ist TmpJpg nicht eine lokale Variable?

Das stimmt, aber es handelt sich um einen Zeiger auf einen alloziierten Speicherbereich. Delphi räumt hier nicht automatisch auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 Uhr.
Seite 1 von 2  1 2      

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