Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi string(Integer) (https://www.delphipraxis.net/200600-string-integer.html)

Benmik 6. Mai 2019 16:54

string(Integer)
 
Nachdem ich mit der Lösung aus diesem Thread viele Jahre ganz gut gefahren bin, habe ich dann doch mein Programm auf 64 Bit umgestellt. Zu meiner großen Verblüffung ging das vergleichsweise problemlos; da stecken eine Reihe von Komponenten drin, die doch recht betagt sind.

Dann beschwerte sich der Compiler an dieser Stelle:
Delphi-Quellcode:
procedure TPngImage.LoadFromResourceID(Instance: HInst; ResID: Integer);
begin
  LoadFromResourceName(Instance, string(ResID));
end;
string(ResID) ??! Man lernt ja nicht aus.

Nach Lektüre von
Delphi-Quellcode:
LoadFromResourceName
habe ich dann folgende Lösung gefunden:
Delphi-Quellcode:
LoadFromResourceName(Instance, '#' + IntToStr(ResID));
Ich weiß aber noch nicht mal, ob das funktioniert. Wieso geht
Delphi-Quellcode:
string(ResID)
? Warum nicht mehr unter 64 Bit? Ist meine Lösung korrekt?

hoika 6. Mai 2019 17:05

AW: string(Integer)
 
Hallo,
LoadFromResourceName war wohl unter 32Bit überladen (overload).

Update:
Bei mir ist es nicht überladen und der Typecast erzeugt einen Compiler-Fehler (ungültige Typumwandlung).

Uwe Raabe 6. Mai 2019 17:08

AW: string(Integer)
 
Wieso compilierst du überhaupt TPngImage, wo das doch in Vcl.Imaging.pngimage bereits mitgeliefert wird?

hoika 6. Mai 2019 17:13

AW: string(Integer)
 
Hallo,
Zitat:

da stecken eine Reihe von Komponenten drin
Weil er vielleicht erst mal Compilieren will und dann schrittweise Ersetzen...

Benmik 6. Mai 2019 17:29

AW: string(Integer)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1431672)
Wieso compilierst du überhaupt TPngImage, wo das doch in Vcl.Imaging.pngimage bereits mitgeliefert wird?

Die Antwort ist natürlich typisch für einen Amateur: Weil ich das Programm seit Jahren entwickle und viel herumexperimentiert habe, so dass offenbar noch irgendwelche Relikte herumliegen, die referenziert werden. Kann aber auch sein, dass ich eine Funktion aus einer Unit benutze, die TPngImage referenziert. Jedenfalls verwende ich gar keine PNG. Natürlich darf ich das nicht (man darf so vieles nicht!), aber ich vertraue darauf, dass der Compiler alles Unbenutzte wegoptimiert.

Ich bin aber recht sicher, dass du die Antworten auf meine Fragen weißt, möchtest du sie nicht geben?

hoika 6. Mai 2019 17:36

AW: string(Integer)
 
Hallo,
dann benenn doch PngImage.pas um, dann Shift+F9 und schon meldet der Compiler die "verirrte" Unit ;)

Ich dachte, Du benutzt die Unit.
Interessant ist der typecast trotzdem.
aber ich glaube, dass da was Sinnvolles rauskommt

Delphi-Quellcode:
  i:= 100;
  MessageBox(0, PChar(String(i)), '', 0);
Zugriffsverletzung innerhalb der Windows-eigenen Dlls.
Ein harter Typecast mag den Compiler zufriedenstellen, aber ob zur Laufzeit was richtiges rauskommt ...

Benmik 6. Mai 2019 17:43

AW: string(Integer)
 
Zitat:

Zitat von hoika (Beitrag 1431671)
Hallo,
LoadFromResourceName war wohl unter 32Bit überladen (overload).

Die Prozedur wird innerhalb der Unit aufgerufen:
Delphi-Quellcode:
procedure TPngImage.LoadFromResourceName(Instance: HInst; const Name: String);
var
  ResStream: TResourceStream;
begin
  try ResStream := TResourceStream.Create(Instance, Name, RT_RCDATA);
  except RaiseError(EPNGCouldNotLoadResource, EPNGCouldNotLoadResourceText);
  exit; end;
  try
    LoadFromStream(ResStream);
  finally
    ResStream.Free;
  end;
end;
Da ist nichts überladen.

hoika 6. Mai 2019 18:18

AW: string(Integer)
 
Hallo,
ja, siehe mein voriger Post.

Benmik 6. Mai 2019 20:28

AW: string(Integer)
 
Zitat:

Zitat von hoika (Beitrag 1431677)
Hallo, dann benenn doch PngImage.pas um, dann Shift+F9 und schon meldet der Compiler die "verirrte" Unit ;)

Wie gedacht, eine andere Komponente, die ich in der Tat benutze, referenziert PngImage.pas.

hoika 6. Mai 2019 20:48

AW: string(Integer)
 
Hallo,
die Unit ausklammern?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.
Seite 1 von 2  1 2      

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