Zitat von
Neutral General:
Ich habe schon tausendmal drübergeguckt, aber ich konnte keinen Fehler entdecken
Meine Informationen habe ich aus
Wikipedia:
Delphi-Quellcode:
// Read First Footer
AStream.Position := AStream.Size - 26;
AStream.Read(TGAInfo.Footer.MetaOffset, SizeOf(Longword));
AStream.Read(TGAInfo.Footer.DevOffset, SizeOf(Longword));
for i:= 0 to 17 do
AStream.Read(TGAInfo.Footer.Signature[i], SizeOf(Char));
{
!!!!!!! ------------- !!!!!!! <-- ab hier läuft was schief :|
}
// Dev Area
AStream.Position := TGAInfo.Footer.DevOffset;
Hi, ich zitiere mal aus deiner Quelle:
Zitat von
http://de.wikipedia.org/wiki/Targa_Image_File:
(4) optional ab Version 2.0 (wenn vorhanden, dann immer die letzten 26 Bytes)
(Anm. des Autors : Bezieht sich auf Footer in TGA-Dateien)
Die letzten 26 Byte sind bei einem Nullbasierten Index natürlich AStream.Size - 27 (1tes Byte = AStream.Postion = 0), du liest hier also einen vollkommen falschen Footer ein, darin liegen sicher die Probleme.
Zitat von
Neutral General:
Kann sich vielleicht einer die Mühe machen und mal gucken ob er einen Fehler findet ?
Also ich finde nichts...
Du hast doch eigentlich schon oft genug gepostet um zu wissen, dass sich die Leute hier gerne die Mühe machen, du es ihnen aber auch leichter machen kannst, indem du zum Beispiel mal das Projekt anhängen würdest! Dann guckt sich vielleicht auch jmd. die anderen Probleme an.
Sorry falls ich hier oder im anderen Beitrag den Anhang übersehen haben sollte! Wenn du aber wirklich nur das Stück Code hier gepostet hast, dann die Bitte beim nächsten mal dran denken, macht vieles einfacher! (zusätzlich zu dem geposteten Code)
Gruß Der Unwissende
[EDIT]
Mal nach einem zweiten Blick auf deinen Source, möchte ich hier noch ein paar Dinge ergänzen. Die Betreffen auch direkt deine noch anstehenden Probleme.
Du verarbeitest die Datei etwas zu blauäugig. Nicht jedes File dass mit einem Programm geöffnet wird hält sich immer an die Spezifikation. Dies kann an einer falschen Implementierung des Erstellers liegen, die dann auch mutwillig sein kann. Bevor du in einem Stream einen Wert ausliest (oder auch nur die Position wechselst) solltest du unbedingt validieren, ob es ein gültiger Zugriff ist. Beim Stream heißt das, dass du gucken solltest ob die Position Offset + sizeOf(Datum) < Stream.Size ist. Nur wenn dies der Fall ist, liegt das Datum in der Datei. Alles andere kann ein Versehen sein oder nicht und würde nur im besten Fall zu einer Fehlermeldung führen. Schlechter ist es, wenn du hier in einem fremden Speicherbereich landest, besonders wenn es hier zum Schreiben kommen würde...
Jedenfalls kannst du das leicht in eine Methode auslagern, die du dann zum Lesen verwendest.
An sich solltest du schon hier weniger in einer Methode machen. Lies lieber die einzelnen Teile in einzelnen Methoden aus, sollte es mal eine Version 2.x oder 3.0 geben, kannst du hier leichter Teile wiederverwenden und austauschen.
[/EDIT]