![]() |
GDI+ Delphi Berlin oder höher
Hallo Leute,
ich hatte ein altes Programm von mir noch etwas verbessert. War hier lange Thema. Das läuft jetzt alles gut aber noch mit Delphi 2005 auf einem alten Notebook compiliert. (Kann ich sehr schlecht sehen) Deshalb will ich es auf das neue Delphi portieren (PC mit großem Display) und da prasseln die Fehlermeldungen. Einige habe ich lösen können, das hier nicht. PropertyTagDateTime liefert laut Microsoft-Doku Rückgabe: PropertTagTypeASCII, Count 20. Aber wie das gespeichert ist, wird nicht verraten. Damals habe ich Folgendes gefunden:
Delphi-Quellcode:
Hat 12 Jahre funktioniert jetzt bei Delphi Berlin crashed es bei with PConvert()^ Ich benutze GDPAPI, GDPOBJECT und GDPUTIL.
function TGDIExifRead.ExifDateToDateTime(s: string):TDateTime;
type TConvert = packed record // Idee von Gerry McGuire year: array [1..4] of char; f1:char; mon: array [1..2] of Char; f2:char; day: array [1..2] of Char; f3:char; hr: array [1..2] of Char; f4:char; min: array [1..2] of Char; f5:char; sec: array [1..2] of Char; end; PConvert = ^TConvert; begin s:=Trim(s); if s = '' then Result:=-1 //kein Datum vorhanden! else try with PConvert( @s[1] )^ do Result:=EncodeDate( StrToInt( year ), StrToInt( mon ), StrToInt( day )) + EncodeTime( StrToInt( hr ), StrToInt( min ), StrToInt( sec ), 0); except Result:=0; //ungültiges Datum end; end; Willie. |
AW: GDI+ Delphi Berlin oder höher
Wie sieht es aus, wenn Du explizit Ansi verwendest, also den Parameter als AnsiString und die Record-Felder als AnsiChars?
|
AW: GDI+ Delphi Berlin oder höher
Joar, das beliebte Char statt AnsiChar,
da sich die Daten bestimmt nicht ändern, nur weil der Compiler plötlich WideChar (Unicode) verwendet. Allerdings passt es hier eigentlich, denn String geht rein und Char's werden drüber gelegt. Und ja, AnsiString und AnsiChar würden auch zusammenpassen. Auch das PACKED ist drin, damit sich nicht plötzlich die Speicherausrichtung ändern könnte. Jetzt ungeprüft auf einen unbekannt "langen" String loszugehen und das mit einem blinden Try-Except abzufangen ist nicht die feine englische Art, aber da hier nur gelesen wird und über StrToInt eine gewisse Prüfung enthalten ist, würde ich das mal durchgehen lassen. Ganz im Ernst, das hier ist ein perfektes Beispiel, um den Debugger zu benutzen. Schauen was rein geht und wo es knallt, bzw. was nicht stimmt. Von den Typen her sehe ich jedenfalls kein Problem, also kann es nur an den Daten liegen. Würde ich diese Programm aber debuggen müssen und es knallt dann ständig, würde ich den Erfinder dieser Funktion garantiert erschlagen.
Delphi-Quellcode:
Und weg mit dem Try-Except-Dreck.
if (Length(S) = 19 {falls ich mich nicht verzählt hab}) and TryStrToInt(....) and ...
else Result := 0; StrToDateTime ![]() oder vielleicht ![]() |
AW: GDI+ Delphi Berlin oder höher
Delphi-Quellcode:
uses ... , System.SysUtils, System.IOUtils,System.Types,System.StrUtils, GDIPAPI, GDIPOBJ,GDIPUTIL;
... procedure DatumMitGDIPlus; Var i:integer; DatListe:TStringDynArray; GPImage: TGPImage; PPropItem: PPropertyItem; BufferSize: Cardinal; TxtDatum:string; Datum:TDateTime; begin DatListe := TDirectory.GetFiles(Verz,'*.jpg'); For i := 0 to High(Datliste) do begin GPImage := TGPImage.Create(DatListe[i]); BufferSize := GPImage.GetPropertyItemSize(PropertyTagDateTime); If BufferSize > 0 then begin GetMem(PPropItem, BufferSize); Try GPImage.GetPropertyItem(PropertyTagDateTime, BufferSize, PPropItem); SetString(TxtDatum, PAnsiChar(PPropItem.value), PPropItem.length - 1); Datum := EncodeDate(StrToInt(Copy(TxtDatum, 1, 4)),StrToInt(Copy(TxtDatum, 6, 2)),StrToInt(Copy(TxtDatum, 9, 2))) + EncodeTime(StrToInt(Copy(TxtDatum, 12, 2)),StrToInt(Copy(TxtDatum, 15, 2)),StrToInt(Copy(TxtDatum, 18, 2)), 0); Finally FreeMem(PPropItem); end; end; end; end; |
AW: GDI+ Delphi Berlin oder höher
Zitat:
Und wenn ja, warum nennt niemals irgendwer die Fehlermeldung?
Delphi-Quellcode:
PConvert(Pointer(@s[1]))^
|
AW: GDI+ Delphi Berlin oder höher
Zitat:
|
AW: GDI+ Delphi Berlin oder höher
Zitat:
Das Andere guck ich mir morgen an. Danke Freunde*innen. Willie. |
AW: GDI+ Delphi Berlin oder höher
Das Format ist "yyyy:mm:dd hh:mm:ss". Ein "m9" kann darin nicht vorkommen. Nicht diese Routine, sondern das Auslesen des Strings ist falsch. Hast du dir den String denn mal angesehen?
EDIT: Nur für den Fall der Fälle:
Delphi-Quellcode:
würde eventuell nach hinten losgehen, da die Puffergröße und damit die Länge des Strings immer 20 Zeichen beträgt, da der String nullterminiert ist.
if (Length(S) = 19
|
AW: GDI+ Delphi Berlin oder höher
Zitat:
Ich werde mich beim Anpassen meiner ExifRead-Bibliothek sicher nochmal melden müssen. Es gibt viele Propertys mit TypeASCII, TypeRational macht keine Probleme. Willie. |
AW: GDI+ Delphi Berlin oder höher
Es gibt keinen Stringtyp Compilerschalter.
Delphi hängt automatisch #0 an Strings an um diese leichter an WinApi Aufrufe übergeben zu können. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 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