AGB  ·  Datenschutz  ·  Impressum  







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

Datei an Datei anhängen

Ein Thema von MiniMax · begonnen am 26. Sep 2010 · letzter Beitrag vom 27. Sep 2010
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#51

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 16:48
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?)
Nicht verzagen, den Debugger fragen. Der wird es dir sagen können. Du kannst dir nach dem Speichern auch mal die Ergebnisdatei anschauen, ob da der richtige Inhalt drin steht.

Bernhard

PS: Das JPEG erkennst du daran, dass es mit "JFIF" anfängt.

PPS: Da fehlt ein JPEGStream.Position := 0;
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#52

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 16:50
Moin,
@Bernhard: Und dann will er png Grafiken abspeichern und findet das JFIF nicht mehr

@DeddyH:
[...]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.
Weshalb ich das nicht mit zitiert habe. Ich bezog mich darauf das "C:/Windows/" äquivalent zu "C:\Windows\" ist.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#53

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 16:51
Kann sein, hab ich noch nie versucht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
MiniMax

Registriert seit: 15. Dez 2009
Ort: Bremen
193 Beiträge
 
Delphi 2009 Architect
 
#54

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 17:06
alsomit dem JPEGStream.Position := 0; geht es jetzt, aber es kommt beim laden ein JPEG Fehler #53
und in der Memo steht Statt Hallölle --> HallÿØÿà ??? Ich weiß net was da schief läüft!

Habe mal die Datei angehängt
Miniaturansicht angehängter Grafiken
bild.jpg  
Angehängte Dateien
Dateityp: zip meinStream.zip (22,9 KB, 2x aufgerufen)
Gruß
MiniMax

Geändert von MiniMax (26. Sep 2010 um 17:30 Uhr) Grund: Bild hochgeladen
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#55

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 17:29
Ich habe da so meine Bedenken wegen Unicode. Erstmal scheint alles zu stimmen (wenn der Text Ansi ist). Die ersten 4 Byte enthalten die Zahl 8. Dann folgen 8 Zeichen und dann folgen wieder 4 Byte und in denen steht auch die Länge des Rests.

Könntest du vielleicht die JPG noch mit hochladen?

[edit]Nachdem das Bild hochgeladen ist: Er scheint 8 Bytes zu früh anfangen zu schreiben. Deshalb überleben nur 4 Zeichen von deinem Satz. Und dann setzte noch ein drauf und setzt dann nach 4 Byte von JPG noch deine 4 Byte für die Länge.[/edit]

[edit]In dieser Zeile lStream.Position := lStream.Position + sizeof(lDataSize); hauts in aus den Socken! Das zweite lStream.Position muss lStartPos sein! Weil die Position ist nach dem setzen der Länge des Textes 4 (weil er 4 Bytes am Anfang der Datei geschrieben hat). Dann addierst du noch die Länge von der Größe dazu (auch 4 Byte). Stattdessen musst du aber am Ende der Datei springen und dann noch 4 Byte weiter (um Platz für die Größe zu lassen).

Übrigens könnte man da auch zwei Methoden daraus machen:
Delphi-Quellcode:
function WriteStream(Source, Dest : TStream; Offset : Integer) : Integer;
var
  lDataSize : Cardinal;
begin
  Dest.Position := Offset + SizeOf(lDataSize);
  Dest.CopyFrom(Source);
  Result := Dest.Position;
  Dest.Position := Offset;
  lDataSize := Sourc....;
  Dest.Write(lDataSize, SizeOf(lDataSize));
end;
[/edit]

MfG
Fabian

PS: Von JFIF scheint es nur das IF überlebt zu haben?!
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise (26. Sep 2010 um 17:43 Uhr)
  Mit Zitat antworten Zitat
MiniMax

Registriert seit: 15. Dez 2009
Ort: Bremen
193 Beiträge
 
Delphi 2009 Architect
 
#56

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 17:40
und was is nun die Lösung?
Gruß
MiniMax
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#57

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 17:44
Wir sind auch keine Roboter oder deine Arbeiter. Hättest auch mal selber beide Dateien im Hex Editor angucken können. Dann wäre dir es vielleicht auch aufgefallen.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
MiniMax

Registriert seit: 15. Dez 2009
Ort: Bremen
193 Beiträge
 
Delphi 2009 Architect
 
#58

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 17:46
ja aber ich weiß nun echt keiine Lösung?
Gruß
MiniMax
  Mit Zitat antworten Zitat
MiniMax

Registriert seit: 15. Dez 2009
Ort: Bremen
193 Beiträge
 
Delphi 2009 Architect
 
#59

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 18:00
Ich danke euch es geht!!! den edit habe ich eben übersehen

Hier der Fertige funktionierende Code:
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);
    TextStream.Position := 0;
    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;
    // bild auslesen
    JPEGStream.copyfrom(lStream, lDataSize);
    JPEGStream.Position := 0;
    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 := lStartPos + 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 := lStartPos + 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.
Gruß
MiniMax
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#60

AW: Datei an Datei anhängen

  Alt 26. Sep 2010, 18:12
Auch wenn es funktioniert möchte ich noch ein Kommentar abgeben:
ja aber ich weiß nun echt keiine Lösung?
Naja ein bisschen "analytisch" denken, was denn schief gehen kann. Erstmal scheint es ja ein Problem beim schrieben zu geben, da die Daten ja schon beim schreiben murks sind. Dann ist auffällig, das die korrekte Länge weiterhin drin steht. Allerdings überschreibt diese korrekte Länge das jpg an der Stelle.

Jetzt noch kurz vor Augen führen was der Code da macht:
  • Er lässt Platz für die Länge.
  • Er schreibt die Daten.
  • Er springt wieder nach vorne und schreibt die Länge.
Das heißt irgendwie ist er zu kurz zurückgesprungen, oder er schreibt schon zu früh los. Zu kurz ist er nach den Code nicht gesprungen, das heißt er schreibt zu früh. Was da natürlich sein könnte, dass er nicht weiter sondern zurückspringt (er ist ja 4 Byte gesprungen). Aber das lässt sich im Code widerlegen.

Naja und der Rest war dann nur den Code im Kopf durchzugehen. So bin ich zumindest den Fehler auf die schliche gekommen. Übrigens hätte ich nach der interessanten Symptomatik noch ein zweiten Test angelegt, wo der Text nicht ein vielfaches von 4 ist. So wäre dann aufgefallen, dass er immer ab den 9. Byte schreibt.

Das soll kein Vorwurf sein, aber wenn ich hier so den Thread verfolge, dann befürchte ich du verstehst den Code nicht. Und wenn das der Fall ist kommt man natürlich nicht so schnell so "weit".

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


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:00 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