Delphi-PRAXiS
Seite 3 von 6     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Array of Integer und crash (https://www.delphipraxis.net/192085-array-integer-und-crash.html)

Zacherl 19. Mär 2017 21:08

AW: Array of Integer und crash
 
Delphi-Quellcode:
PropItem

EWeiss 19. Mär 2017 21:16

AW: Array of Integer und crash
 
Zitat:

Zitat von Zacherl (Beitrag 1364779)
Delphi-Quellcode:
PropItem

Delphi-Quellcode:
  PropertyItem = record
    id      : PROPID;
    length  : ULONG;
    type_    : TPropertyTagType;
    value   : Pointer;
  end;
  TPropertyItem = PropertyItem;
  PPropertyItem = ^TPropertyItem;

PropItem: TPropertyItem;
Was für einen buffer soll ich da allokieren ?
Die größe bzw. der Inhalt wird doch von der GdipGetPropertyItem zurück gegeben.

gruss

EWeiss 19. Mär 2017 21:27

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:
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;
kann man sehen das ich das PropItem hier deklariert habe.

Delphi-Quellcode:
PropItem: TPropertyItem;


Diese habe ich nun herausgenommen und in meine Classe gesteckt.

Delphi-Quellcode:
  TAnimateGif = class(TComponent)
  private
    FSelectedIndex: Integer;
    PropItem: TPropertyItem;
Jetzt sag mir mal jemand warum das so ein Problem verursacht hat das es nach
Delphi-Quellcode:
    if GetPropertyItem(GifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
    begin
jedes Mal gekracht hat und alle Variablen sich verändert haben.

gruss

Uwe Raabe 19. Mär 2017 21:31

AW: Array of Integer und crash
 
Zitat:

Zitat von EWeiss (Beitrag 1364781)
Was für einen buffer soll ich da allokieren ?
Die größe bzw. der Inhalt wird doch von der GdipGetPropertyItem zurück gegeben.

Schon, die Größe des Bereichs für das PropertyItem wird aber über GdipGetPropertyItemSize ermittelt.

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

EWeiss 19. Mär 2017 21:37

AW: Array of Integer und crash
 
Zitat:

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.
Möglich da ich wirklich nicht weiß warum dieser das Problem behoben hat.
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

Uwe Raabe 19. Mär 2017 21:54

AW: Array of Integer und crash
 
Zitat:

Zitat von EWeiss (Beitrag 1364785)
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.

Wohl eher: damit andere Daten überschrieben werden.

Zitat:

Zitat von EWeiss (Beitrag 1364785)
Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56

Daraus schließe ich, daß jetzt die ersten 56 Byte hinter dem PropItem Feld überschrieben werden. Deklariere dort doch zum Test mal einen entsprechend großen Bereich, initialisiere ihn (sollte sowieso alles 0 sein) und schau nach, was nach dem Aufruf drin steht. Würde mich auch nicht wundern, wenn der Value-Pointer genau auf diesen Bereich zeigt.

EWeiss 19. Mär 2017 21:58

AW: Array of Integer und crash
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1364786)
Zitat:

Zitat von EWeiss (Beitrag 1364785)
Ich denke mal das er einfach global deklariert werden muss damit die Daten nicht überschrieben werden.

Wohl eher: damit andere Daten überschrieben werden.

Zitat:

Zitat von EWeiss (Beitrag 1364785)
Ich habe das geprüft und die Daten kommen alle richtig an.

EDIT:
Propsize = 72
SizeOf = 16
PropItem.Length = 56

Daraus schließe ich, daß jetzt die ersten 56 Byte hinter dem PropItem Feld überschrieben werden. Deklariere dort doch zum Test mal einen entsprechend großen Bereich, initialisiere ihn (sollte sowieso alles 0 sein) und schau nach, was nach dem Aufruf drin steht. Würde mich auch nicht wundern, wenn der Value-Pointer genau auf diesen Bereich zeigt.

Sorry ich weis jetzt nicht was du meinst wie soll ich dem Record einen Speicher zuweisen.
Oder was meinst du genau.

Danke für deine Hilfe hab da echt ein Verständnis Problem.
gruss

Uwe Raabe 19. Mär 2017 22:09

AW: Array of Integer und crash
 
Zitat:

Zitat von EWeiss (Beitrag 1364787)
Sorry ich weis jetzt nicht was du meinst wie soll ich dem Record einen Speicher zuweisen.

Das kannst du so gar nicht. Deswegen wird in den Beispielen auch immer ein dynamischer Pointer PPropertyIem benutzt, der entsprechend PropSize alloziert wird.

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

EWeiss 19. Mär 2017 22:13

AW: Array of Integer und crash
 
Zitat:

Das kannst du so gar nicht. Deswegen wird in den Beispielen auch immer ein dynamischer Pointer PPropertyIem benutzt, der entsprechend PropSize alloziert wird.
Jo das meinte ich doch ;) Danke.

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

EWeiss 19. Mär 2017 22:30

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:
var
  p: Pointer;
//###############
// Bytearray dimensionieren
p := @PropItem;
GetMem(p, PropSize);

SetLength(Prop, (PropItem.length - 1));
CopyMemory(@Prop[0], @PropItem.value, PropItem.length);

FreeMem(p);
Hab irgendwo ein denk Fehler.
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 17:16 Uhr.
Seite 3 von 6     123 45     Letzte »    

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