![]() |
NativeInt to string
Kann ich NativeInt wie bisher mit IntToStr zu String konvertieren? Oder geht dabei was verloren..
|
AW: NativeInt to string
Kannst du. Unter 64-Bit wird dann die Int64-Variante von IntToStr verwendet.
|
AW: NativeInt to string
Zitat:
|
AW: NativeInt to string
Es stimmt was nicht mehr.
Delphi-Quellcode:
ImgBack: LONG_PTR;
Das ImgBack wird geladen .
Delphi-Quellcode:
ImgBack := SkinEngine.skCreateImageFromFile(SelectedImg);
Delphi-Quellcode:
und in eine TStringList gepackt.
function TSkinEngine.skCreateImageFromFile(FileName: WideString): LONG_PTR;
var Img: LONG_PTR; begin Img := 0; if not FileExists(FileName) then begin Result := 0; Exit; end; //Image laden try GdipCheck(GdipLoadImageFromFile(PWideChar(FileName), Img)); finally Result := Img; end; end;
Delphi-Quellcode:
SetProperty(Handle, PROP_IMAGE_SELECTED, ImgBack);
Delphi-Quellcode:
procedure TSkinListBox.SetProperty(WinHandle: hWnd; Item: Integer; V: LONG_PTR);
begin if (Item > 0) and (WinHandle <> 0) then PropList.Add(IntToStr(WinHandle) + ',' + IntToStr(Item) + ',' + IntToStr(V)); end;
Delphi-Quellcode:
Später lese ich das ImgBack aus den Propertys zurück.
function TSkinListBox.GetProperty(WinHandle: hWnd; Item: Integer): LONG_PTR;
var SplitProperty: TSplitStrArray; IntI: Integer; begin Result := 0; if (Item > 0) and (WinHandle <> 0) then begin for IntI := 0 to PropList.Count - 1 do begin SplitProperty := Split(PropList.Strings[IntI], ','); if SplitProperty[0] = IntToStr(WinHandle) then begin Result := LONG_PTR(SplitProperty[2]); exit; end; end; end; end;
Delphi-Quellcode:
ImgBack := GetProperty(WinHandle, PROP_IMAGE_SELECTED);
Zeichne ich jetzt den Button
Delphi-Quellcode:
und hole mir die Image Größe dann krachts.
SkinEngine.PaintButton(Graphics, 4, ImgBack, Rect.Left,
Rect.Top - (ListItemHeight - 16) div 2, UInt(Rect.Right - FLeft), UInt(ListItemHeight), BS_PUSHBUTTON)
Delphi-Quellcode:
if ImgBack <> 0 then
begin GetImageSize(ImgBack, BackW, BackH);
Delphi-Quellcode:
Die Probleme habe ich nur unter 64Bit und D11.2 vorher unter D11 funktioniert noch alles.
procedure TSkinEngine.GetImageSize(Img: LONG_PTR; var imgW, imgH: UINT);
begin if img <> 0 then begin GdipCheck(GdipGetImageWidth(Img, imgW)); GdipCheck(GdipGetImageHeight(Img, imgH)); end; end; |
AW: NativeInt to string
TSplitStrArray sind Strings.
Zitat:
Fazit: Zuerst der String zu Integer NativeInt (weil sonst knallt es mal im 64 Bit) und das dann zum Pointer. Ja, IntToStr gibt es in zwei Varianten, wie dir das CodeInsight und die Hilfe sagen wird. Nur anderstum, muß man es manuell machen, also StrToInt64, weil der Parameter "String" ja identisch wäre. |
AW: NativeInt to string
Zitat:
Delphi-Quellcode:
{$EXTERNALSYM UINT_PTR}
LONG_PTR = NativeInt; |
AW: NativeInt to string
Zitat:
Das wird der Zeiger auf den String, in dem die "Zahl" als Text drin steht, oder nicht? |
AW: NativeInt to string
Zitat:
So funktioniert es nun bis das nächste Problem auftaucht. :)
Delphi-Quellcode:
Danke
function TSkinListBox.GetProperty(WinHandle: hWnd; Item: Integer): LONG_PTR;
var SplitProperty: TSplitStrArray; IntI: Integer; begin Result := 0; if (Item > 0) and (WinHandle <> 0) then begin for IntI := 0 to PropList.Count - 1 do begin SplitProperty := Split(PropList.Strings[IntI], ','); if SplitProperty[0] = IntToStr(WinHandle) then begin Result := LONG_PTR(StrToInt64(SplitProperty[2])); exit; end; end; end; end; |
AW: NativeInt to string
Egal was es für ein Typ ist.
Der "Wert" ist/war die Adresse (Zeiger) des Strings. |
AW: NativeInt to string
Zitat:
Ohne deine Hilfe hätte ich das Problem nicht so schnell gefunden. |
AW: NativeInt to string
Das ist wie der Unterschid bei
Delphi-Quellcode:
Oder String-Resourcen.
var
S: string; P: Pointer; P := @S[1]; P := @S[Low(string)]; // weil im Mobilen waren die Strings mal 0-basiert, also S[0] war das erste Zeichen wenn für iOS kompiliert P := @S; // Zeiger auf die Variable, nicht auf den String P := PChar(S); // Zeiger auf den String (erstes Zeichen), aber wenn '', dann Ersatzweise ein Zeiger auf die Konstante EmptyString mit #0#0 P := Pointer(S); // bei '' ist das hier NIL (wichtig, wenn man z.B. mit Leerstrings in der WinAPI arbeitet) In dem PChar werden "Werte" bis #$0000FFFF als Index für die PE-Ressourcen benutzt, und darüber sind es Zeiger auf Strings. Ich kenn Leute, die schreiben auch
Delphi-Quellcode:
anstatt
S := EmptyString;
Delphi-Quellcode:
, was per se nicht falsch ist, aber
S := '';
ich hatte mal mit EmptyString eine böse Erfahrung. Und auch wenn der "Code" so selbstsprechend ist, empfinde ich "Namen" als Konstante/Variable auf "etwas" und nicht als "Nichts" ... kann so den Code schlechter lesen. Durch einen schiefen Pointer wurde dort etwas in EmptyString reingeschrieben, denn "typisierte String-Konstanten" sind in Wirklichkeit "schreibgeschützte Variablen", aber sie lassen sich dennoch beschreiben. Mit dem Ergebnis, dass wir eine halbe Woche danach suchten, warum alle DevExpress-Grids im Programm in "leeren" Zellen plötzlich "etwas" anzeigten, denn sie nutzen auch EmptyString zu Initialisierung. |
AW: NativeInt to string
Deine Ausführung ist Interessant!
Danke nochmals. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 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