![]() |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Delphi-Quellcode:
xy[0].x := 80 + 110; xy[0].y := 135 + 50;
xy[1].x := 140 + 110; xy[1].y := 130 + 50; xy[2].x := 160 + 110; xy[2].y := 80 + 50; xy[3].x := 180 + 110; xy[3].y := 130 + 50; xy[4].X := 240 + 110; xy[4].y := 135 + 50; xy[5].X := 192 + 110; xy[5].y := 165 + 50; xy[6].X := 210 + 110; xy[6].y := 220 + 50; xy[7].X := 160 + 110; xy[7].y := 190 + 50; xy[8].X := 110 + 110; xy[8].y := 220 + 50; xy[9].X := 128 + 110; xy[9].y := 165 + 50;
Delphi-Quellcode:
Siehe @xy[0]..
gSprCtrl.GD_DrawPolyLineToCtrl(HSprCtrl, @xy[0], 10,
gSprCtrl.GD_ColorARGB(255,RGB(100, 250, 150)), 5, ID_POLYLINE, GS_VISIBLE or GS_DRAFT, GD_DRAW_OUTLINE, 0); gSprCtrl.GD_SetObjectImageLabel(ID_ELLIPSE, 'Polyline');
Delphi-Quellcode:
und..
function TSkinSpriteContainer.GD_DrawPolyLineToCtrl(WinHandle: HWND; pXY: PPoint;
ArraySize: Integer; ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL; begin Result := False; if (IsWindow(WinHandle)) then Result := gDrawPointsObject(OBJECT_POLYLINE, WinHandle, pXY, ArraySize, ColrARGB, BorderSize, ObjID, GS_STYLE, GD_STYLE, Use3D); end;
Delphi-Quellcode:
aber wie schon gesagt es geht in D2010 aber nicht mit Tokyo
function TSkinSpriteContainer.gDrawPointsObject(ObjectType: Integer; WinHandle: HWND; pXY: PPoint;
ArraySize: Integer; ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL; var ExistItem, Item: Integer; x1, y1, x2, y2: Integer; Border, K, C: Integer; meta: TArray<Integer>; pData: Short; begin //... meta := Pointer(pXY); // funktioniert mit D2010 x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; y2 := meta[(ArraySize * 2) - 1]; end; Ich lasse es erst mal mit der 64Bit Version.. das ist mir echt suspekt das ganze. Danke.. gruss |
AW: inkompatibel TArray<Integer> Pointer
Nur mal aus Interesse: Wenn es so in D2010 mit der Pointer-Zuweisung funktioniert, was gibt dann Length(meta) zurück?
Gibt es Fälle, wo der Aufruf mit @xy[<Wert größer 0>] erfolgt? Anhand der Übergabeparameter im ersten Code-Block und der Aussage, daß es funktioniert, schließe ich, daß xy ein TArray<TPoint> ist mit einer Länge von 10 (ArraySize). Das sollte dann auch der oben genannte Wert von Length(meta) sein. Wenn dem so ist, funktioniert dein Code auch noch, wenn du Range-Checking bei der X/Y-Zuweisung im letzten Code-Block einschaltest?
Delphi-Quellcode:
Gibt es einen Grund, warum meta nicht auch als TArray<TPoint> deklariert ist?
{$R+}
x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; y2 := meta[(ArraySize * 2) - 1]; |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Nein.
Delphi-Quellcode:
Siehe edit.. im vorherigen Beitrag.
xy: array [0..9] of TPoint;
Zitat:
EDIT: Ja funktioniert. gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Delphi-Quellcode:
procedure Main;
var ArraySize: Integer; xy: TArray<TPoint>; meta: TArray<Integer>; pXY: PPoint; x1: Integer; x2: Integer; y1: Integer; y2: Integer; begin SetLength(xy, 10); xy[0].x := 80 + 110; xy[0].y := 135 + 50; xy[1].x := 140 + 110; xy[1].y := 130 + 50; xy[2].x := 160 + 110; xy[2].y := 80 + 50; xy[3].x := 180 + 110; xy[3].y := 130 + 50; xy[4].X := 240 + 110; xy[4].y := 135 + 50; xy[5].X := 192 + 110; xy[5].y := 165 + 50; xy[6].X := 210 + 110; xy[6].y := 220 + 50; xy[7].X := 160 + 110; xy[7].y := 190 + 50; xy[8].X := 110 + 110; xy[8].y := 220 + 50; xy[9].X := 128 + 110; xy[9].y := 165 + 50; ArraySize := 10; pXY := @xy[0]; meta := Pointer(pXY); {$R+} x1 := meta[0]; y1 := meta[1]; x2 := meta[(ArraySize * 2) - 2]; // <== ERangeError y2 := meta[(ArraySize * 2) - 1]; Writeln(x1, y1, x2, y2); end; |
AW: inkompatibel TArray<Integer> Pointer
Ich bekomme keinen ERangeError mit {$R+}
Kann dir nur mitteilen was hier abgeht. Siehe Range.png der Breakpoint steht auf C.. also hinter deinem ERangeError. Und die Anwendung funktioniert kannst mir glauben ;) Ich zeichne den Stern damit.
Delphi-Quellcode:
ist falsch muss
xy: TArray<TPoint>;
Delphi-Quellcode:
sein.
xy: array [0..9] of TPoint;
Aber wie du sehen kannst scheint
Delphi-Quellcode:
bei dir auch zu funktionieren nur halt in Tokjo nicht.
meta := Pointer(pXY);
Nun! Was ist nun falsch Tokjo oder D2010 Ich kann unter Tokjo diese Zeile nicht Kompilieren wegen besagten Fehler.. und die kommt öfters vor. gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
|
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Zitat:
TArray<TPoint> ? Nur dann denke ich bekomme ich ebenfalls den Range Error. Kann ich ändern sollte kein Problem sein.
Delphi-Quellcode:
Das
GD_DrawPolyLineToCtrl(WinHandle: HWND; pXY: TArray[TPoint>;
ArraySize: Integer; ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL;
Delphi-Quellcode:
werde das nochmal testen.. Danke.
x2 := meta[(ArraySize * 2) - 2];
//zu x2 := meta[ArraySize - 2]; gruss |
AW: inkompatibel TArray<Integer> Pointer
Ich würde einen Open Array Parameter verwenden. Das ArraySize kannst du dir dann auch sparen und mit Length(arrXY) ersetzen.
Delphi-Quellcode:
GD_DrawPolyLineToCtrl(WinHandle: HWND; const arrXY: array of TPoint;
ColrARGB: Colorref; BorderSize, ObjID, GS_STYLE, GD_STYLE: DWORD; Use3D: Short): BOOL; |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
gruss |
AW: inkompatibel TArray<Integer> Pointer
Zitat:
Aus folgenden Grund. x und y haben jeweils 10 einträge..
Delphi-Quellcode:
diese werden in der DLL auf diese weise ausgewertet.
var
xy: array of TPoint; begin SetLength(xy, 20); xy[0].x := 190; xy[0].y := 185; xy[1].x := 250; xy[1].y := 180; xy[2].x := 270; xy[2].y := 130; xy[3].x := 290; xy[3].y := 180; xy[4].X := 350; xy[4].y := 185; xy[5].X := 302; xy[5].y := 215; xy[6].X := 320; xy[6].y := 270; xy[7].X := 270; xy[7].y := 240; xy[8].X := 220; xy[8].y := 270; xy[9].X := 238; xy[9].y := 210; gSprCtrl.GD_DrawPolyLineToCtrl(HSprCtrl, xy[0], 10, gSprCtrl.GD_ColorARGB(255,RGB(100, 250, 150)), 5, ID_POLYLINE, GS_VISIBLE or GS_DRAFT, GD_DRAW_OUTLINE, 0); gSprCtrl.GD_SetObjectImageLabel(ID_ELLIPSE, 'Polyline'); end;
Delphi-Quellcode:
Somit muss die länge von ArraySize die hälfte sein.
C := 0;
for K := 0 to (ArraySize - 1) do begin x1 := min(x1, meta[C]); x2 := max(x2, meta[C]); inc(C); y1 := min(y1, meta[C]); y2 := max(y2, meta[C]); inc(C); end; Meta wird dann so zugewiesen.
Delphi-Quellcode:
meta := @pXY;
Ob das jetzt mit 64Bit kompatibel ist muss ich erst noch testen, glaube aber nicht! Meine Frage ist also immer noch nicht beantwortet trotz der fixes ;) Danke nochmal für die Infos. D2010 funktioniert. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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