AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Array of Integer und crash

Ein Thema von EWeiss · begonnen am 19. Mär 2017 · letzter Beitrag vom 27. Sep 2018
 
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: Array of Integer und crash

  Alt 19. Mär 2017, 18:47
Warum werden die Wert verändert.
Das lässt sich anhand dieser kurzen Code-Fragmente nicht erkennen.
Ok dann fange ich mal an.

Delphi-Quellcode:
type
  PropertyTagType = (
    PropertyTagTypeByte = 1,
    PropertyTagTypeASCII = 2,
    PropertyTagTypeShort = 3,
    PropertyTagTypeLong = 4,
    PropertyTagTypeRational = 5,
    PropertyTagTypeUndefined = 7,
    PropertyTagTypeSLong = 9,
    PropertyTagTypeSRational = 10
  );
  TPropertyTagType = PropertyTagType;

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

const
  PropertyTagFrameDelay: ULONG = $5100;
  FrameDimensionTime: TGUID = '{6aedbd6d-3fb5-418a-83a6-7f45229dc872}';

// Start!
//#######################################
AnimateGif := TAnimateGif.Create(nil);

constructor TAnimateGif.Create(AOwner: TComponent);
begin

  LoadGif;
end;

procedure TAnimateGif.LoadGif;
var
  FrameCount: UINT;
  FrameDelay: TOutFrameDelay;
begin

  FrameCount := 0;

  if GetGifFrameCount(gp.GifImage, FrameCount) = S_OK then
  begin
    If (FrameCount - 1) = 0 then
    begin
      SetLength(FrameDelay, 0);
    end
    else
    begin
      GetGifFrameDelays(gp.GifImage, FrameCount, FrameDelay);
    end;
  end;
end;

function TAnimateGif.GetGifFrameCount(GifImage: Cardinal; var OutFrameCount: UINT): integer;
begin

  Result := GDIP_ImageGetFrameCount(GifImage, @FrameDimensionTime, OutFrameCount);
end;

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;

function TAnimateGif.GetPropertyItem(InGifImage: Cardinal; PropertyID: ULONG;
  PropertyItemSize: UINT; var PropertyItemData: TPropertyItem): integer;
begin

  // Daten auslesen
  Result := GDIP_GetPropertyItem(InGifImage, PropertyID, PropertyItemSize, @PropertyItemData);
end;

// API
//#######################################
function GDIP_GetPropertyItem(image: Cardinal; propId: PROPID; propSize: UINT;
  buffer: PPROPERTYITEM): integer; stdcall; external dllfile;


function GDIP_GetPropertyItem(Img: Cardinal; propId: PROPID; propSize: UINT;
  var buffer: PPROPERTYITEM): GPSTATUS; stdcall;
begin

  result := GdipGetPropertyItem(Img, propId, propSize, buffer);
end;

function GdipGetPropertyItem(
  image: Cardinal;
  propId: PROPID;
  propSize: UINT;
  var buffer: PPROPERTYITEM
): GPSTATUS; stdcall; external LibGdiPlus;
So das war's.
nachdem die Rückgabe erfolgt ist, in
TAnimateGif.GetGifFrameDelays nach begin

Delphi-Quellcode:
if GetPropertyItem(InGifImage, PropertyTagFrameDelay, PropSize, PropItem) = S_OK then
begin
Verändert sich der wert von InGifImage und PropSize beide haben dann den Wert 8.

Hier kracht es dann
SetLength(OutFrameDelay, (InFrameCount - 1));

gruss
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:49 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