Also ich habe herausgefunden woran es liegt, weiss aber nicht wie bzw. wo ich das verhindern kann.
Ich habe mal eine Datei ohne Kompression bzw. Verschlüsselung gespeichert.
Einmal mit der originalen Demo und einmal wurde die Demo mit Delphi 2010 von mir kompiliert.
Um kurz zu erklären wie es funktioniert.
Die Komponente speichert einen Header, in welchem die Info ist, ob verschlüsselt bzw. komprimiert wurde und dann die einzelnen Streams mit Namen und deren Inhalt.
In folgendem Beispiel heißen die Streams MEMO1, MEMO2 und MEMO3.
Anhand der Namen werden diese wieder gelesen.
Hier der Inhalt der Datei, die mit dem Original gespeichert wurde:
Zitat:
MEMO1
Anfange-Ende1 MEMO2
Anfange-Ende2 MEMO3
Anfange-Ende3
Und hier der Inhalt der Datei, die mit Delphi 2010 kompliliert wurde:
Zitat:
M E M Anfang-Ende1 M E M Anfang-Ende2 M E M Anfang-Ende3
Er speichert den Namen der Streams falsch. Und kann diese auch nicht laden. Wobei beim Ladevorgang auch ein Fehler sein muss, denn die neu kompilierte Demo kann auch keine Dateien öffnen, welche mit der Originalen gespeichert wurde.
Ich hoffe jetzt kann mir jemand helfen!
EDIT:
Nochwas aufgefallen.
Beim ersten Laden, schafft er es Stream 1 korrekt zu laden den Rest gar nicht, danach lädt er nichts mehr.
Habe die Funktionen gefunden, die dafür verantwortlich sind!
Diese beiden hier:
Delphi-Quellcode:
function THKStreams.ReadStr(Stream: TStream): String;
var
I: Word;
S: String;
begin
Stream.Read(I, SizeOf(I));
SetLength(S, I);
Stream.Read(PChar(S)^, I);
Result := S;
end;
procedure THKStreams.WriteStr(S: String; Stream: TStream);
var
I: Word;
begin
I := Length(S);
Stream.Write(I, SizeOf(I));
Stream.Write(PChar(S)^, I));
end;
Es wird nach jedem Zeichen ein Leerzeichen eingefügt, weshalb der komplette String nicht aufgenommen werden kann.
Habe es jetzt damit gelöst:
Delphi-Quellcode:
function THKStreams.ReadStr(Stream: TStream): String;
var
I: Word;
S: String;
begin
Stream.ReadBuffer(I, SizeOf(I));
SetLength(S, I);
Stream.ReadBuffer(PChar(S)^, I * SizeOf(S[1]));
Result := S;
end;
procedure THKStreams.WriteStr(S: String; Stream: TStream);
var
I: Word;
begin
I := Length(S);
Stream.WriteBuffer(I, SizeOf(I));
Stream.WriteBuffer(PChar(S)^, I * SizeOf(S[1]));
end;
Aber warum macht er mit Delphi 2010 Leerzeichen rein und mit Delphi 7 nicht?
Das muss doch einen Grund haben oder?
Frage auch selber beantwortet!
Früher wars
Ansi (1 Byte/Zeichen) jetzt
Unicode (2 Byte/Zeichen).
Das könnte ich jetzt umsetzen indem ich den
Unicode-String zum
Ansi-String umwandle und ausgebe.
Aber sinvoller wäre es doch, sie
Unicode zu lassen oder? Ich meiner das wurde ja nicht umsonst eingeführt?
Ansonsten danke liebes Forum für die Hilfe