![]() |
AW: Datei an Datei anhängen
ok es geht! Nun das Trennen:
Delphi-Quellcode:
Da kommen nen paar fehler:
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; bei:
Delphi-Quellcode:
lStream.Read(TextStream.Memory, lDataSize);
Delphi-Quellcode:
kommt als Fehler
lStream.Read(JPEGStream.Memory, lDataSize);
Code:
Hat jemand eine Lösung?
[DCC Fehler] Unit1.pas(69): E2197 Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
|
AW: Datei an Datei anhängen
Moin,
wenn du einen Stream von in einem anderen schreiben willst, dann nimm TStream. ![]() @rollstuhlfahrer: Dann kann man immer noch meine Methode nehmen ;) MfG Fabian |
AW: Datei an Datei anhängen
ok er komplimiert zwar, aber es kommt zum absturz (externe eception 8000...)
Delphi-Quellcode:
Was is Falsch?
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; |
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 |
AW: Datei an Datei anhängen
Zitat:
|
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. |
AW: Datei an Datei anhängen
Zitat:
MfG Fabian |
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. |
AW: Datei an Datei anhängen
sry dass ich frage und welcheposition währ dass?:oops:
|
AW: Datei an Datei anhängen
Zitat:
[edit] @TE:
Delphi-Quellcode:
[/edit]
ZielStream.CopyFrom(QuellStream, Zielgröße);
ZielStream.Position := 0; Zielobjekt.LoadFromStream(ZielStream); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 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-2025 by Thomas Breitkreuz