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 2 von 3     12 3   
Benutzerbild von himitsu
himitsu

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

AW: GDI+ Delphi Berlin oder höher

  Alt 13. Aug 2020, 22:11
Jupp, wenn man den String richtig gefüllt hat, dann ist im Inhalt keine #0 mehr drin.


Den Compilerschalter kann es leider nicht geben.

Man könnte ja nur lokal, in seiner Unit, den Typ ändern.
Aber die Funktionen betrifft das nicht.

Vorallem in den APIs sind diese ja nicht Überladen, sondern heißen alle anders.
String, PChar und Char in deiner Unit OK,
aber CreateFile wird in einer anderen Unit auf CreateFileW umgeleitet. Und Diese ist vorkompiliert und somit quasi unveränderlich.
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
 
#12

AW: GDI+ Delphi Berlin oder höher

  Alt 13. Aug 2020, 23:47
Du kannst einen String als AnsiString deklarieren: var AnsiTxt: AnsiString;
Das sollte im Zusammenhang mit GDI+ aber gar nicht nötig sein; bei ASCII - also Property-Typ 2 - solltest du mit SetString(ZielTxt, PAnsiChar(PPropItem.value), PPropItem.length - 1)); ohne Probleme hinkommen. Mich würde ein Beispiel interessieren, sollte das doch mal nicht der Fall sein.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
2.637 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: GDI+ Delphi Berlin oder höher

  Alt 14. Aug 2020, 08:24
Ich weiß gerade nicht ob per Inception das machbar ist.
Mit Vcl's weiß ich es zu 100pro das es klappt.
Dient mir als Ersatz für "Helper" wenn ich mich immer nur an's original halten möchte.
Eine Unit erstellen wo lediglich "String" als "AnsiString" definiert wird.
Diese Unit dann als letzte in Deinem Projekt einbinden.
Schon ist wieder alles wie vor 20 Jahren, aber ob man das wirklich will ist jedem selbst überlassen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: GDI+ Delphi Berlin oder höher

  Alt 14. Aug 2020, 14:37
Wie gesagt, es ist egal, denn du kannst nur den Typ in deiner Unit mit einem anderen Typen überdecken,
aber externe Definitionen beeinflusst es nicht.

Abgesehn davon ist String schwachsinniger Weise seit Jahrzehnten immernoch ein resserviertes Wort und da geht Vieles nicht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Willie1

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

AW: GDI+ Delphi Berlin oder höher

  Alt 15. Aug 2020, 17:36
Ich habe in meiner Bibliothek alle string durch AnsiString, PChar durch PAnsiChar und alle Char durch AnsiChar ersetzt, TstringList bleibt unverändert, und der Compiler meckert bei meinem Testprogramm nicht mehr. Bei Filename habe ich string durch TFilename ersetzt. Jetzt läuft es auch mit dem GDP-Dateien von 2003. Verrenkungen bei string sind also nicht nötig. "Alte Sünden werden nicht vergessen" bei meiner Lösung crasht es bei Bildern vom IPhone, das war und ist immer noch so. Jetzt packt mich der Ehrgeiz auch das will ich lösen.
Delphi-Quellcode:
          else //alle anderen
          with PropItem^ do begin
            Move(Value^, RationalBuff, Length);
            R1:=RationalBuff[0];
            R2:=RationalBuff[1];
            s:=Format('%d/%d',[R1,R2]);
            try
            s1:=ShowID(ShowTagStr, GetMetaDataIDString(id), PropID);
            except
              Result:=s;
              Exit;
            end;
            Result:=Format('%s %s',[s1,s])
          end;
Es geht um PropertyItem^.id, der Debugger zeigt eine Cardinal-Zahl an, wenn es klappt und meldet "nicht verfügbarer Wert", wenn es crasht. Die Routine liefert ein richtiges Result und erst beim Verlassen der Funktion gibt es den Zugriffsfehler.
Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (15. Aug 2020 um 17:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: GDI+ Delphi Berlin oder höher

  Alt 15. Aug 2020, 18:44
Was ist RationalBuff?

Bei dem MOVE, könnte man z.B. an ungültige Zeiger und einen Bufferoverflow denken.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Willie1

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

AW: GDI+ Delphi Berlin oder höher

  Alt 15. Aug 2020, 19:54
RationlBuff ist ein Array[0..1] of Integer für Zähler und Nenner. Wie geht das ohne Move, ist mir klar, das das unsicher ist.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benmik

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

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 13:18
Es geht hier um den Datentyp 5. Eigentlich soll er 8 Bytes lang sein mit 4 Bytes Zähler und 4 Bytes Nenner. Laut Spezifikation ist er "unsigned", müsste also 2 x Cardinal sein, denn es gibt ihn auch noch mit Vorzeichen als Typ 10.

Es ist aber keineswegs so, dass der Typ 5 immer nur 2 x 4 = 8 Bytes hat, zum Beispiel nicht bei den GPS-Werten. Bei GPSLongitude und GPSLatitude hat er 3 x 8 = 24 Bytes (das ist auch so bei EXIFTool vermerkt). Da könnte es bei deinem iPhone haken, weil es vermutlich GPS-Daten in die JPG schreibt. Daher ist deine Lösung nicht optimal an den Typ 5 angepasst.

Ich mache das ungefähr so (ist jetzt so dahingeworfen):
Delphi-Quellcode:
var Buff:TBytes;
    Zähler,Nenner,DritterWert:Cardinal;
begin
  SetLength(Buff,Length);
  Move(Value^, Buff[0], Length);
  Zähler := PCardinal(@TB[0])^;
  Nenner := PCardinal(@TB[4])^;
  If Length >= 12
    then DritterWert := PCardinal(@TB[8])^;
end;
Der Zusammenbau von GPSLatitude etc. ist auch nicht ganz trivial. Das verdeutlich das Prinzip, vielleicht hilft dir das erstmal weiter.

Geändert von Benmik (16. Aug 2020 um 13:29 Uhr)
  Mit Zitat antworten Zitat
Willie1

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

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 16:50
Es geht hier um den Datentyp 5.

Der Zusammenbau von GPSLatitude etc. ist auch nicht ganz trivial. Das verdeutlich das Prinzip, vielleicht hilft dir das erstmal weiter.
Ja, es geht um PropertyTagTypeRational: 2 Zahlen = 4 Bytes für Zähler und Nenner. Ich hatte es mit Move gemacht, vor 15 Jahren konnte ich es nicht besser. Bennik, genau die Geo-Koordinaten haben mich auf diese Idee gebracht, es geht.
Delphi-Quellcode:
  Type
    TRationalBuff = array[0..1] of Integer;
    TPRationalBuff = ^TRationalBuff;

          else //alle anderen
          with PropItem^ do begin
// Move(Value^, RationalBuff, Length); //löst Fehler bei Apple aus
            RationalBuff := TPRationalBuff(Value)^;
            R1:=RationalBuff[0];
            R2:=RationalBuff[1];
            if R2 > 0 then
              s:=Format('%0.4f',[R1 / R2])
            else
              s:='error';
            s1:=ShowID(ShowTagStr, GetMetaDataIDString(id), PropID);
            Result:=Format('%s %s',[s1,s])
          end;
Die GDP-Dateien habe ich natürlich auch neu kompiliert, da gibt es viele string - Typen, jetzt alle als 16-Bit-String, Kann es da zu Problemen kommen? Ich weiß aus schmerzhafter Erfahrung Test- oder Demoprogramm ist das eine, der Einsatz in einem großen Programm ist das andere. Meine Motivation hatte ich oben erklärt. Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benmik

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

AW: GDI+ Delphi Berlin oder höher

  Alt 16. Aug 2020, 18:45
Der RationalBuff kann nur 8 Byte aufnehmen, bei GPS sind es aber 24. Mit ihm kommst du also nicht an bestimmte GPS-Daten ran (GPSLongitude, GPSLatitude).

Move an sich ist völlig OK; man kann es auch über eine Pointer-Variable machen, aber dann hat man nicht die Flexibilität von TBytes. Ich meine, es ist immer noch am besten, Length zu messen, TBytes entsprechend zu dimensionieren und danach zu handeln.

Bei den Stringtypen von Typ 7 ist es nicht ganz so einfach, die können laut Spezifikation auch Unicode sein, worauf du mit AnsiChar nicht weiter kommst. Das betrifft vor allem UserComment. Man kann die Strings ruhig bei Delphi-String belassen, muss sich dann aber um die Konvertierungen kümmern.

Ich muss jetzt zum Zug; später komme ich eventuell dazu, etwas zu posten.

Geändert von Benmik (16. Aug 2020 um 18:47 Uhr)
  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:41 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