Delphi-PRAXiS
Seite 5 von 7   « Erste     345 67      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Datei an Datei anhängen (https://www.delphipraxis.net/154806-datei-datei-anhaengen.html)

MiniMax 26. Sep 2010 14:26

AW: Datei an Datei anhängen
 
ok es geht! Nun das Trennen:

Delphi-Quellcode:
procedure TForm1.Trennen;
var
  lStream: TStream;
  lStartPos: Int64;
  lDataSize: Cardinal;
  TextStream, JPEGStream: TMemoryStream;
  bildchen: tjpegimage;
begin
  lStream := TFileStream.Create('meinStream.ampstr', fmOpenRead);
  try
    // Länge lesen
    lStream.Read(lDataSize, sizeOf(lDataSize));

    TextStream := TMemoryStream.Create;
    TextStream.Size := lDataSize;
    // Text auslesen
    lStream.Read(TextStream.Memory, lDataSize);
    memo2.Lines.LoadFromStream(TextStream);
    TextStream.Free;

    // Bild laden
    lStream.Position := sizeof(lDataSize) + lDataSize; // Diese Zeile sollte weggelassen werden können, da der Stream ja schon die richtige Position hat.

    // Länge lesen
    lStream.Read(lDataSize, sizeOf(lDataSize));

    JPEGStream := TMemoryStream.Create;
    JPEGStream.Size := lDataSize;
    // Text auslesen
    lStream.Read(JPEGStream.Memory, lDataSize);
    bildchen:= tjpegimage.Create;
    bildchen.LoadFromStream(JPEGStream);
    bildchen.SaveToFile('./bildnew.jpg');
    JPEGStream.Free;
    bildchen.Free;
  finally
    lStream.Free;
  end;
end;
Da kommen nen paar fehler:

bei:
Delphi-Quellcode:
lStream.Read(TextStream.Memory, lDataSize);
Delphi-Quellcode:
lStream.Read(JPEGStream.Memory, lDataSize);
kommt als Fehler

Code:
[DCC Fehler] Unit1.pas(69): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
Hat jemand eine Lösung?

xZise 26. Sep 2010 15:11

AW: Datei an Datei anhängen
 
Moin,
wenn du einen Stream von in einem anderen schreiben willst, dann nimm TStream.Delphi-Referenz durchsuchenCopyFrom().

@rollstuhlfahrer: Dann kann man immer noch meine Methode nehmen ;)

MfG
Fabian

MiniMax 26. Sep 2010 15:29

AW: Datei an Datei anhängen
 
ok er komplimiert zwar, aber es kommt zum absturz (externe eception 8000...)

Delphi-Quellcode:
procedure TForm1.Trennen;
var
  lStream: TStream;
  lStartPos: Int64;
  lDataSize: Cardinal;
  TextStream, JPEGStream: TMemoryStream;
  bildchen: tjpegimage;
begin
  lStream := TFileStream.Create('./meinStream.ampstr', fmOpenRead);
  try
    // Länge lesen
    lStream.Read(lDataSize, sizeOf(lDataSize));

    TextStream := TMemoryStream.Create;
    TextStream.Size := lDataSize;
    // Text auslesen
    lStream.copyfrom(TextStream.Memory, lDataSize);
    memo2.Lines.LoadFromStream(TextStream);
    TextStream.Free;

    // Bild laden
    lStream.Position := sizeof(lDataSize) + lDataSize; // Diese Zeile sollte weggelassen werden können, da der Stream ja schon die richtige Position hat.

    // Länge lesen
    lStream.Read(lDataSize, sizeOf(lDataSize));

    JPEGStream := TMemoryStream.Create;
    JPEGStream.Size := lDataSize;
    // Text auslesen
    lStream.copyfrom(JPEGStream.Memory, lDataSize);
    bildchen:= tjpegimage.Create;
    bildchen.LoadFromStream(JPEGStream);
    bildchen.SaveToFile('./bildnew.jpg');
    JPEGStream.Free;
    bildchen.Free;
  finally
    lStream.Free;
  end;
end;
Was is Falsch?

rollstuhlfahrer 26. Sep 2010 15:35

AW: Datei an Datei anhängen
 
Der Memorystream braucht die Daten, die aus dem Filestream kommen. Du hast das aber umgedreht. Die Exception kommt, weil du die Datei nur zum Lesen geöffnet hast, aber plötzlich schreiben willst. Es müsste heißen: TextStream.CopyFrom(lStream, lDataSize);

Bernhard

DeddyH 26. Sep 2010 15:36

AW: Datei an Datei anhängen
 
Zitat:

Delphi-Quellcode:
// Text auslesen
    lStream.copyfrom(TextStream.Memory, lDataSize);

Wer kopiert von wem? Außerdem kommt mir die Angabe des Dateinamens spanisch vor, unter Windows ist der Backslash der PathDelimiter und nicht der Slash. Abgesehen davon sollte man ohnehin immer(:!:) absolute Pfade verwenden.

MiniMax 26. Sep 2010 15:42

AW: Datei an Datei anhängen
 
So mit dem geänderten code geht es jetzt aber es kommt kein bild raus und kein Text (beides leere Datein)??
Und wieder die Frage was mach ich falsch (ich wwiß ich nerv aber heflt ihr mir nochma bitte?)
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Image1: TImage;
    Memo2: TMemo;
    Image2: TImage;
    Button2: TButton;
    Button3: TButton;
  procedure Zusammenfügen();
  procedure Trennen ();
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

{ TForm1 }

procedure TForm1.Button2Click(Sender: TObject);
begin
zusammenfügen();
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
trennen();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.picture.loadfromfile('./bild.jpg');
end;

procedure TForm1.Trennen;
var
  lStream: TStream;
  lStartPos: Int64;
  lDataSize: Cardinal;
  TextStream, JPEGStream: TMemoryStream;
  bildchen: tjpegimage;
begin
  lStream := TFileStream.Create('./meinStream.ampstr', fmOpenRead);
  try
    // Länge lesen
    lStream.Read(lDataSize, sizeOf(lDataSize));

    TextStream := TMemoryStream.Create;
    TextStream.Size := lDataSize;
    // Text auslesen
    TextStream.copyfrom(lStream, lDataSize);
    memo2.Lines.LoadFromStream(TextStream);
    TextStream.Free;

    // Bild laden
    lStream.Position := sizeof(lDataSize) + lDataSize; // Diese Zeile sollte weggelassen werden können, da der Stream ja schon die richtige Position hat.

    // Länge lesen
    lStream.Read(lDataSize, sizeOf(lDataSize));

    JPEGStream := TMemoryStream.Create;
    JPEGStream.Size := lDataSize;
    // Text auslesen
    JPEGStream.copyfrom(lStream, lDataSize);
    bildchen:= tjpegimage.Create;
    bildchen.LoadFromStream(JPEGStream);
    bildchen.SaveToFile('./bildnew.jpg');
    JPEGStream.Free;
    bildchen.Free;
  finally
    lStream.Free;
  end;
end;

procedure TForm1.Zusammenfügen;
var
  lStream: TStream;
  lStartPos: Int64;
  lDataSize: Cardinal;
  bildchen:tjpegimage;
begin
  lStream := TFileStream.Create('./meinStream.ampstr', fmCreate);
  try
    // Memo speichern
    lStartPos := 0;
    lStream.Position := lStream.Position + sizeof(lDataSize);
    memo1.Lines.SaveToStream(lStream);
    lDataSize := lStream.Position - lStartPos - sizeof(lDataSize);
    lStream.Position := lStartPos;
    lStream.Write(lDataSize, sizeof(lDataSize));
    // JPG speichern
    lStartPos := lStream.Size;
    lStream.Position := lStream.Position + sizeof(lDataSize);
    bildchen:= tjpegimage.Create;
    bildchen.LoadFromFile('./bild.jpg');
    bildchen.SaveToStream(lstream);
    lDataSize := lStream.Position - lStartPos - sizeof(lDataSize);
    lStream.Position := lStartPos;
    lStream.Write(lDataSize, sizeof(lDataSize));
  finally
    lStream.Free;
    bildchen.Free;
  end;
end;

end.

xZise 26. Sep 2010 15:44

AW: Datei an Datei anhängen
 
Zitat:

Zitat von DeddyH (Beitrag 1052169)
[...]unter Windows ist der Backslash der PathDelimiter und nicht der Slash.[...]

Soweit ich informiert bin, gibt es diesen Unterschied nicht (mehr). Zumindest Vista und 7 akzeptieren den Slash.

MfG
Fabian

SirThornberry 26. Sep 2010 15:45

AW: Datei an Datei anhängen
 
Ich denke das Problem ist ganz leicht zu lösen.
Wenn man in einen Stream rein schreibt oder daraus liest wandert die Position. Schreibst du zum Beispiel in einen String 5 Bytes hinein wandert die Position um 5 Weiter. Wenn du dann mit LoadFromStream etwas lädst wird ab der aktuellen Position des Streams gelesen (also ab Position 5). Und da steht natürlich nichts mehr. Du musst also die Position an die Stelle setzen von wo aus du lesen willst.

MiniMax 26. Sep 2010 15:46

AW: Datei an Datei anhängen
 
sry dass ich frage und welcheposition währ dass?:oops:

DeddyH 26. Sep 2010 15:47

AW: Datei an Datei anhängen
 
Zitat:

Zitat von xZise (Beitrag 1052176)
Zitat:

Zitat von DeddyH (Beitrag 1052169)
[...]unter Windows ist der Backslash der PathDelimiter und nicht der Slash.[...]

Soweit ich informiert bin, gibt es diesen Unterschied nicht (mehr). Zumindest Vista und 7 akzeptieren den Slash.

MfG
Fabian

Trotzdem sind es weiterhin relative Pfade.

[edit] @TE:
Delphi-Quellcode:
ZielStream.CopyFrom(QuellStream, Zielgröße);
ZielStream.Position := 0;
Zielobjekt.LoadFromStream(ZielStream);
[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.
Seite 5 von 7   « Erste     345 67      

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