AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Picture aus String laden

Ein Thema von mkmk · begonnen am 8. Dez 2008 · letzter Beitrag vom 8. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
mkmk

Registriert seit: 2. Dez 2008
Ort: Zürich
42 Beiträge
 
#1

Picture aus String laden

  Alt 8. Dez 2008, 16:27
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
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;
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:01
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:08
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mkmk

Registriert seit: 2. Dez 2008
Ort: Zürich
42 Beiträge
 
#4

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:23
Ich habe TStringStream und try-finally in mein Programm eingebaut. Danke für die Anmerkungen.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:29
ich habe gerade noch etwas gesehen. Neben dem Jpeg gibst du auch den Stream nicht frei.
Kannst du nochmal den aktuellen Quelltext posten?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mkmk

Registriert seit: 2. Dez 2008
Ort: Zürich
42 Beiträge
 
#6

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:44
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.
  Mit Zitat antworten Zitat
mkmk

Registriert seit: 2. Dez 2008
Ort: Zürich
42 Beiträge
 
#7

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:51
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.
  Mit Zitat antworten Zitat
mkmk

Registriert seit: 2. Dez 2008
Ort: Zürich
42 Beiträge
 
#8

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:52
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;
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:58
Die beiden Creates gehören vor das try . Wenn im Konstruktor ein Fehler auftritt, räumt Delphi das selber wieder auf.
Sebastian Jänicke
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Picture aus String laden

  Alt 8. Dez 2008, 19:59
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 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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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