AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia GDI+ Delphi Berlin oder höher

GDI+ Delphi Berlin oder höher

Ein Thema von Willie1 · begonnen am 12. Aug 2020 · letzter Beitrag vom 18. Aug 2020
Antwort Antwort
Seite 1 von 3  1 23   
Willie1

Registriert seit: 28. Mai 2008
469 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 17:41
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (12. Aug 2020 um 17:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.092 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 18:02
Wie sieht es aus, wenn Du explizit Ansi verwendest, also den Parameter als AnsiString und die Record-Felder als AnsiChars?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.990 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 18:06
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 ?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (12. Aug 2020 um 18:45 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
421 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 18:14
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;

Geändert von Benmik (12. Aug 2020 um 18:36 Uhr) Grund: uses ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
36.990 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 18:41
crashed es bei with PConvert()^
Also der Compiler knallt?
Und wenn ja, warum nennt niemals irgendwer die Fehlermeldung?

PConvert(Pointer(@s[1]))^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
421 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 18:56
..warum nennt niemals irgendwer die Fehlermeldung?
Und warum dem Fehler in einer nicht funktionierenden Prozedur nachjagen, wenn es eine funktionierende gibt?
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
469 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 19:13
crashed es bei with PConvert()^
Also der Compiler knallt?
Und wenn ja, warum nennt niemals irgendwer die Fehlermeldung?

PConvert(Pointer(@s[1]))^
EConvertError "m9" ist kein gültiger Integerwert.

Das Andere guck ich mir morgen an. Danke Freunde*innen. Willie.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
421 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: GDI+ Delphi Berlin oder höher

  Alt 12. Aug 2020, 19:26
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: 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.

Geändert von Benmik (12. Aug 2020 um 20:25 Uhr)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
469 Beiträge
 
Delphi 10.1 Berlin Starter
 
#9

AW: GDI+ Delphi Berlin oder höher

  Alt 13. Aug 2020, 18:29
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.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.060 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: GDI+ Delphi Berlin oder höher

  Alt 13. Aug 2020, 21:04
Es gibt keinen Stringtyp Compilerschalter.

Delphi hängt automatisch #0 an Strings an um diese leichter
an WinApi Aufrufe übergeben zu können.
  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 12:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf