Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   GDI+ Delphi Berlin oder höher (https://www.delphipraxis.net/205214-gdi-delphi-berlin-oder-hoeher.html)

Willie1 12. Aug 2020 16:41

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:
  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;
Hat 12 Jahre funktioniert jetzt bei Delphi Berlin crashed es bei with PConvert()^ Ich benutze GDPAPI, GDPOBJECT und GDPUTIL.

Willie.

DeddyH 12. Aug 2020 17:02

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?

himitsu 12. Aug 2020 17:06

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:
if (Length(S) = 19 {falls ich mich nicht verzählt hab}) and TryStrToInt(....) and ...

else
  Result := 0;
Und weg mit dem Try-Except-Dreck.




StrToDateTime Delphi-Referenz durchsuchenTryStrToDateTime mit einem FormatSetting.LongDateFormat+LongTimeFormat
oder vielleicht Delphi-Referenz durchsuchenISO8601ToDate ?

Benmik 12. Aug 2020 17:14

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;

himitsu 12. Aug 2020 17:41

AW: GDI+ Delphi Berlin oder höher
 
Zitat:

Zitat von Willie1 (Beitrag 1471723)
crashed es bei with PConvert()^

Also der Compiler knallt?
Und wenn ja, warum nennt niemals irgendwer die Fehlermeldung?

Delphi-Quellcode:
PConvert(Pointer(@s[1]))^

Benmik 12. Aug 2020 17:56

AW: GDI+ Delphi Berlin oder höher
 
Zitat:

Zitat von himitsu (Beitrag 1471728)
..warum nennt niemals irgendwer die Fehlermeldung?

Und warum dem Fehler in einer nicht funktionierenden Prozedur nachjagen, wenn es eine funktionierende gibt?

Willie1 12. Aug 2020 18:13

AW: GDI+ Delphi Berlin oder höher
 
Zitat:

Zitat von himitsu (Beitrag 1471728)
Zitat:

Zitat von Willie1 (Beitrag 1471723)
crashed es bei with PConvert()^

Also der Compiler knallt?
Und wenn ja, warum nennt niemals irgendwer die Fehlermeldung?

Delphi-Quellcode:
PConvert(Pointer(@s[1]))^

EConvertError "m9" ist kein gültiger Integerwert.

Das Andere guck ich mir morgen an. Danke Freunde*innen. Willie.

Benmik 12. Aug 2020 18:26

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:
if (Length(S) = 19
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.

Willie1 13. Aug 2020 17:29

AW: GDI+ Delphi Berlin oder höher
 
Zitat:

Zitat von DeddyH (Beitrag 1471725)
Wie sieht es aus, wenn Du explizit Ansi verwendest, also den Parameter als AnsiString und die Record-Felder als AnsiChars?

Ihr habt es sofort erkannt. Natürlich AnsiChar, denn schließlich heißt es ja PropertyTagTypeASCII (!). So wird es klappen, äh noch 'ne Frage kann ich bei AnsiString das #0 am Ende weglassen? Gibt es einen Compiler-Schalter, um im Quelltext String als AnsiString zu definieren? Bennik, deinen Source werde ich ausprobieren, danke.
Ich werde mich beim Anpassen meiner ExifRead-Bibliothek sicher nochmal melden müssen. Es gibt viele Propertys mit TypeASCII, TypeRational macht keine Probleme.
Willie.

TurboMagic 13. Aug 2020 20:04

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 10:15 Uhr.
Seite 1 von 3  1 23      

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