![]() |
AW: Array of Integer und crash
Delphi-Quellcode:
PropItem
|
AW: Array of Integer und crash
Zitat:
Delphi-Quellcode:
Was für einen buffer soll ich da allokieren ?
PropertyItem = record
id : PROPID; length : ULONG; type_ : TPropertyTagType; value : Pointer; end; TPropertyItem = PropertyItem; PPropertyItem = ^TPropertyItem; PropItem: TPropertyItem; Die größe bzw. der Inhalt wird doch von der GdipGetPropertyItem zurück gegeben. gruss |
AW: Array of Integer und crash
Ich habe den Fehler ??? gefunden.
In wie weit das ein fehler ist könnte mir mal bitte jemand erklären. Wenn man jetzt hier schaut
Delphi-Quellcode:
kann man sehen das ich das PropItem hier deklariert habe.
procedure TAnimateGif.GetGifFrameDelays(InGifImage: Cardinal; InFrameCount: UINT;
var OutFrameDelay: TOutFrameDelay); var PROP: TProp; PropCount: integer; Size: integer; PropSize: UINT; PropItem: TPropertyItem; begin Size := 0; // Datengröße vom EXIF-Tag // "PropertyTagFrameDelay" ermitteln if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then begin // Daten auslesen if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then begin // PropertyTyp ermitteln case PropItem.type_ of PropertyTagTypeByte: Size := 1; PropertyTagTypeShort: Size := 2; PropertyTagTypeLong: Size := 4; end; // Array zur Aufnahme der // Pausenzeiten dimensionieren SetLength(OutFrameDelay, (InFrameCount - 1)); end; end; end;
Delphi-Quellcode:
PropItem: TPropertyItem;
Diese habe ich nun herausgenommen und in meine Classe gesteckt.
Delphi-Quellcode:
Jetzt sag mir mal jemand warum das so ein Problem verursacht hat das es nach
TAnimateGif = class(TComponent)
private FSelectedIndex: Integer; PropItem: TPropertyItem;
Delphi-Quellcode:
jedes Mal gekracht hat und alle Variablen sich verändert haben.
if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
begin gruss |
AW: Array of Integer und crash
Zitat:
Wenn der Speicherbereich für PropertyItem eh durch die Deklaration vorgegeben ist, warum dann die Abfrage über GDIP_GetPropertyItemSize? Kannst du mal prüfen, ob das wirklich den erwarteten Wert zurückgibt?
Delphi-Quellcode:
Was deinen Fix angeht: ich fürchte, du hast immer noch den Fehler drin, er äußert sich jetzt vermutlich nur anders weil andere Variablen überschrieben werden. Hier gilt immer noch die goldene Regel: Wenn du nicht verstehst, warum eine Änderung den Fehler behebt, dann hast du ihn wahrscheinlich auch nicht behoben.
if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then
begin if PropSize <> Sizeof(PropItem) then { hier stimmt was nicht! } // Daten auslesen if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then |
AW: Array of Integer und crash
Zitat:
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden. Ich habe das geprüft und die Daten kommen alle richtig an. EDIT: Propsize = 72 SizeOf = 16 PropItem.Length = 56 Hmmmm :wall: gruss |
AW: Array of Integer und crash
Zitat:
Zitat:
|
AW: Array of Integer und crash
Zitat:
Oder was meinst du genau. Danke für deine Hilfe hab da echt ein Verständnis Problem. gruss |
AW: Array of Integer und crash
Zitat:
Delphi-Quellcode:
PropSize: UINT;
PropItem: PPropertyItem; // dynamischer Pointer auf Record if GDIP_GetPropertyItemSize(InGifImage, PropertyTagFrameDelay, PropSize) = S_OK then begin GetMem(PropItem, PropSize); // Record in passender Größe bereitstellen // Daten auslesen if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem^) = S_OK then // Alternativ den Typ des Parameters in PPropertyItem ändern ... FreeMem(PropItem); // Delphi merkt sich die Size intern |
AW: Array of Integer und crash
Zitat:
So wie du sagst es gibt immer noch Probleme eigentlich müsste ich als Ergebnis für jedes Frame 80 MS Wartezeit haben. Die sind aber nicht richtig da die Daten durcheinander sind die Ankommen. Danke werde mal das Memory so allokieren wie du gezeigt hast. gruss |
AW: Array of Integer und crash
Es geht nicht wirklich musste es ändern da sich die Typen nicht vertragen haben.
TProp musste ich umdefinieren..
Delphi-Quellcode:
TProp = array of Byte;
Delphi-Quellcode:
Hab irgendwo ein denk Fehler.
var
p: Pointer; //############### // Bytearray dimensionieren p := @PropItem; GetMem(p, PropSize); SetLength(Prop, (PropItem.length - 1)); CopyMemory(@Prop[0], @PropItem.value, PropItem.length); FreeMem(p); Die Einträge nach meinem Verständnis müssten eigentlich so aussehen 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0 Sehen aber aus wie im Bild gezeigt. Irgendwas stimmt noch nicht. (Ein durcheinander) NA ja hab mich noch nicht wirklich mit dem GIF Kram auseinandergesetzt. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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