Announcement

Collapse
No announcement yet.

Dateien aneinanderhängen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Hi Tommi,<br>Habe das Sample Projekt erweitert. Lade es nochmal. Der Pfad ist allerdings auf 255 Zeichen beschränkt! Mann sollte hier auch ein anderes Format einführen wie: <LÄNGE PFAD><PFAD><br>Ansonsten würdest du auch 255 Byte verwenden, wenn das File nur "c:\Test.jpg" heisst.<br>cu Michae

    Comment


    • #17
      Hallo Michael,
      da hat sich nix verändert. ;-)

      Tomm

      Comment


      • #18
        Hi Tommi,<br>FTP hatte nicht gemacht was ich wollte ...<br>Jetzt geht's, Michae

        Comment


        • #19
          Hi, nochmal der einigermassen bereinigte Code, falls jemand ähnliche Probleme mit TMemorystream hat.<br>
          Auf der Form werden drei Button(BILD_VON_FILE_LADEN, BILD_VON_IMAGE_LADEN, VORSCHAU) benötigt, ein TImage(Image1) in Scrollbox und zwei Images(Image3, Image4 mit Bildinhalt). Ich habe in diesem Beispiel nicht alles über Exceptions abgefangen was nötig wäre! Es soll lediglich ein Working Sample sein!

          <PRE>
          unit Unit1;

          interface

          uses
          Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
          StdCtrls, ExtCtrls, jpeg;

          type
          TFileStream = class(TForm)
          BILD_VON_FILE_LADEN: TButton;
          VORSCHAU: TButton;
          ScrollBox1: TScrollBox;
          Image1: TImage;
          Image3: TImage;
          Image4: TImage;
          BILD_VON_IMAGE_LADEN: TButton;
          Label1: TLabel;
          procedure BILD_VON_FILE_LADENClick(Sender: TObject);
          procedure VORSCHAUClick(Sender: TObject);
          procedure BILD_VON_IMAGE_LADENClick(Sender: TObject);
          private
          { Private-Deklarationen }
          public
          { Public-Deklarationen }
          end;

          var
          FileStream: TFileStream;

          implementation

          {$R *.DFM}

          procedure TFileStream.BILD_VON_FILE_LADENClick(Sender: TObject);
          var
          IN_Stream : TMemorystream;
          OUT_Stream : TMemorystream;
          x : integer;
          Fileliste : TStringlist;
          Filesize_array : array[0..10] of char;
          Filepath_array : array[0..256] of char;
          Imagesize, Filesize : integer;
          begin
          Fileliste := TStringlist.Create;
          IN_Stream := TMemorystream.Create;
          OUT_Stream := TMemorystream.Create;
          fileliste.add('Bild1.jpg');
          fileliste.add('Bild2.jpg');
          OUT_Stream.clear;
          for x := 0 to fileliste.count - 1 do begin
          // IN_Stream wird durch das Laden des File in seiner Größe automatisch neu gesetzt!
          IN_Stream.loadfromfile(extractfiledir(application. exename) + '\' + fileliste[x]);
          IN_Stream.Seek(0, 0);
          // Schreibe 10 Byte Länge des folgenden Bildes
          Imagesize := IN_Stream.Size;
          fillchar(Filesize_array, sizeof(Filesize_array), '0');
          StrPCopy(Filesize_array, format('%0.10d',[Imagesize]));
          OUT_Stream.writebuffer(Filesize_array, 10);
          // Schreibe 10 Byte Länge des Pfades des folgenden Bildes
          Filesize := length(extractfiledir(application.exename) + '\' + fileliste[x]);
          fillchar(Filesize_array, sizeof(Filesize_array), '0');
          StrPCopy(Filesize_array, format('%0.10d',[Filesize]) );
          OUT_Stream.writebuffer(Filesize_array, 10);
          // Schreibe Pfad des folgenden Bildes
          fillchar(Filepath_array, sizeof(Filepath_array), ' ');
          StrPCopy(Filepath_array, (extractfiledir(application.exename) + '\' + fileliste[x]));
          OUT_Stream.writebuffer(Filepath_array, Filesize);
          // Bilddaten schreiben
          OUT_Stream.copyfrom(IN_Stream, Imagesize );
          end;
          try
          OUT_Stream.SaveToFile(extractfiledir(application.e xename) + '\AusgabeStream');
          except
          on E: Exception do Showmessage(E.Message);
          end;
          Fileliste.free;
          IN_Stream.free;
          OUT_Stream.free;
          end;

          procedure TFileStream.VORSCHAUClick(Sender: TObject);
          var
          IN_Stream : TMemorystream;
          Bild_Stream : TMemorystream;
          Image2 : TImage;
          dir : string;
          Bild : TJpegImage;
          count: integer;
          Preview_box, top, left, right, bottom : integer;
          scale : real;
          Filesize_array : array[0..9] of char;
          Filepath_array : array[0..256] of char;
          Imagesize, Filesize : string;
          begin
          Preview_box := 150; // Grösse der Bildansicht, quadratisch
          dir := extractfiledir(application.exename);
          IN_Stream := TMemorystream.Create;
          Bild_Stream := TMemorystream.Create;
          Image2 := TImage.create(self);
          image2.Stretch := false;
          image2.AutoSize := true;
          Bild := TJPegImage.Create;
          IN_Stream.LoadFromFile(dir + '\AusgabeStream');
          IN_Stream.position := 0;
          count := 0;
          image1.picture := NIL;
          image1.Canvas.Pen.Color := clBlack;
          while IN_Stream.Position < IN_Stream.Size do begin
          // *** LESEN HEADER INFO's ***
          fillchar(Filesize_array, sizeof(Filesize_array), '0');
          fillchar(Filepath_array, sizeof(Filepath_array), ' ');
          // 10 Byte Imagesize
          IN_Stream.Readbuffer(Filesize_array, 10);
          Imagesize := Filesize_array;
          // 10 Byte Pfadlänge
          IN_Stream.Readbuffer(Filesize_array, 10);
          Filesize := Filesize_array;
          // Pfad
          IN_Stream.Readbuffer(Filepath_array, strtoint(Filesize_array));
          // Bild
          Bild_Stream.Clear;
          Bild_Stream.CopyFrom(IN_Stream , strtoint(Imagesize));
          Bild_Stream.Seek(0, 0);
          Bild.LoadFromStream(Bild_Stream);
          // *** AUSGABE BILD ***
          // bild.SaveToFile('Test'+inttostr(count)+'.jpg');
          image2.picture.assign(bild);
          image1.picture.Bitmap.Height := ((count + 1) * Preview_box) + ((count + 1) * 20);
          left := 10;
          top := (count * Preview_box) + ((count + 1) * 20);
          right := Preview_box + 10;
          bottom := ((count + 1) * Preview_box) + ((count + 1) * 20);
          image1.Canvas.Rectangle(rect( left, top, right, bottom));
          image1.canvas.Font.Name := 'Arial';
          image1.canvas.Font.size := 7;
          image1.canvas.TextOut(15, (count * Preview_box) + ((count + 1) * 20) - 20,'Bildgrösse: '+ inttostr(strtoint(Imagesize)) + 'Byte');
          image1.canvas.TextOut(15, (count * Preview_box) + ((count + 1) * 20) - 11,'Bildpfad: '+ trim(Filepath_array));
          if image2.Width > image2.Height then
          scale := Preview_box /image2.Width
          else
          scale := Preview_box / image2.height;
          image1.Canvas.StretchDraw(rect( left + 2,
          top + 2,
          left + trunc(image2.Width * scale) - 4,
          top + trunc(image2.height * scale) - 4
          ),
          image2.Picture.graphic);
          inc(count,1);
          scrollbox1.VertScrollBar.Range := (count * Preview_box) + ((count + 1) * 20);
          end;
          Bild.free;
          IN_Stream.free;
          Bild_Stream.free;
          image2.free;
          end;

          procedure TFileStream.BILD_VON_IMAGE_LADENClick(Sender: TObject);
          var
          IN_Stream : TMemorystream;
          OUT_Stream : TMemorystream;
          Filesize_array : array[0..10] of char;
          Filepath_array : array[0..256] of char;
          dir : string;
          x : integer;
          Imagesize, Filesize : integer;
          Fileliste : TStringlist;
          Bild : string;
          begin
          dir := extractfiledir(application.exename);
          IN_Stream := TMemorystream.Create;
          OUT_Stream := TMemorystream.Create;
          // OUT_Stream für Daten vorbereiten
          OUT_Stream.clear;
          // Hier Images festlegen
          Fileliste := TStringlist.Create;
          Fileliste.add('Image3');
          Fileliste.add('Image4');

          for x := 0 to Fileliste.count - 1 do begin
          if Fileliste[x] <> '' then begin
          IN_Stream.Clear;
          fillchar(Filesize_array, sizeof(Filesize_array), '0');
          fillchar(Filepath_array, sizeof(Filepath_array), ' ');
          Bild := 'Intern ' + Fileliste[x];
          // x-tes Bild in Stream verfrachten
          ((findcomponent(Fileliste[x])) as TImage).Picture.Graphic.SaveToStream(IN_Stream);
          IN_Stream.Seek(0, 0);
          // Schreibe 10 Byte Länge des folgenden Bildes
          Imagesize := IN_Stream.Size;
          StrPCopy(Filesize_array, format('%0.10d',[Imagesize]));
          OUT_Stream.writebuffer(Filesize_array, 10);
          // Schreibe 10 Byte Länge des Pfades des folgenden Bildes
          Filesize := length(Bild);
          StrPCopy(Filesize_array, format('%0.10d',[Filesize]));
          OUT_Stream.writebuffer(Filesize_array, 10);
          // Schreibe 255 Byte Pfad des folgenden Bildes
          StrPCopy(Filepath_array, Bild);
          OUT_Stream.writebuffer(Filepath_array, Filesize);
          // bilddaten schreiben
          OUT_Stream.copyfrom(IN_Stream, IN_Stream.Size );
          end;
          end;
          try
          OUT_Stream.SaveToFile(dir + '\AusgabeStream');
          except
          on E: Exception do Showmessage(E.Message);
          end;
          IN_Stream.free;
          OUT_Stream.free;
          Fileliste.free;
          end;

          end.
          </PRE><br>wem's hilft ;-) Michae

          Comment

          Working...
          X