Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GDI+ und DrawPolygon (https://www.delphipraxis.net/109775-gdi-und-drawpolygon.html)

daschaos 7. Mär 2008 12:13


GDI+ und DrawPolygon
 
Verzeiht mir diese Frage, aber ich bekomm es gerade nich hin, die Funktion DrawPolygon(const Pen *pen, const Point *points, INT *count) zu benutzen. Mein Problem liegt darin, dass ich nich weiß, wie ich bei GDI+ ein Array of PGPPoint anlegen kann.

Wenn ich es einfach mal mit Points: Array[0..3] of PGPPoint versuche, kann ich zwar über Points[0].X Werte zuweisen, aber sobald ich dann die DrawPolygon mit Points aufrufen möchte, schmeißt er mir folgende Fehlermeldung:

[Pascal Error] Main.pas(6513): E2250 There is no overloaded version of 'DrawPolygon' that can be called with these arguments

Code sieht folgendermaßen aus:

Delphi-Quellcode:
procedure TMainForm.Draw;
const
  ALPHA = 100;
var
  Graphics: TGPGraphics;
  GdiPen: TGPPen;
  points: Array[0..3] of PGPPoint;
  PenR, PenG, PenB: Integer;
begin
  PenR := GetRValue(clGray);
  PenG := GetGValue(clGray);
  PenB := GetBValue(clGray);

  Graphics := TGPGraphics.Create(TChart(Sender).Canvas.Handle);
  GdiPen := TGPPen.Create(MakeColor(Alpha, penR, PenG, PenB));

  points[0].X := xBegin;
  points[0].Y := y;
  points[1].X := xEnd;
  points[1].Y := y;
  points[2].X := xEnd+xDelay;
  points[2].Y := y-yDelay;
  points[3].X := xBegin+xDelay;
  points[3].Y := y-yDelay;

  Graphics.DrawPolygon(GdiPen, points, 4);
end;
Wäre toll, wenn mir mal schnell jemand auf die Sprünge helfen könnte!

Dankeschööönnn,
liebe Grüße Laura

Neutral General 7. Mär 2008 12:57

Re: GDI+ und DrawPolygon
 
Hi,

So wie ich das sehe werden jeweils Pointer als Parameter erwartet. Probier es mal so (Komplett ohne Garantie das es funktioniert!):

Delphi-Quellcode:
procedure TMainForm.Draw;
const
  ALPHA = 100;
var
  Graphics: TGPGraphics;
  GdiPen: TGPPen;
  points: Array[0..3] of PGPPoint;
  PenR, PenG, PenB: Integer;
  Count: Integer; // <---
begin
  PenR := GetRValue(clGray); // ps: bei grau ist R=G=B ;)
  PenG := GetGValue(clGray); // d.h. PenR = PenG = PenB
  PenB := GetBValue(clGray); // d.h. wenn du dir einen Wert holst reicht das ;)

  Graphics := TGPGraphics.Create(TChart(Sender).Canvas.Handle);
  GdiPen := TGPPen.Create(MakeColor(Alpha, penR, PenG, PenB));
  // GdiPen := TGPPen.Create(MakeColor(Alpha, penR, PenR, PenR));  <--- siehe oben

  points[0]^.X := xBegin; // <--- die ^ sollte man besser hinschreiben.
  points[0]^.Y := y;
  points[1]^.X := xEnd;
  points[1]^.Y := y;
  points[2]^.X := xEnd+xDelay;
  points[2]^.Y := y-yDelay;
  points[3]^.X := xBegin+xDelay;
  points[3]^.Y := y-yDelay;
 
  Count := 4;
  Graphics.DrawPolygon(@GdiPen,points[0],@Count);
end;
Könnte auch alles Schwachsinn sein. :mrgreen:

EDIT: ca. 156 mal editiert :roll: :roteyes:

Gruß
Neutral General

daschaos 7. Mär 2008 13:09

Re: GDI+ und DrawPolygon
 
Ok, mit dem Grau hast du natürlich recht *schäm* :).

Das mit der Definition Array[0..3] of PGPPoint kracht übrigens bei Ausführung, AccessViolation... funktioniert irgendwie alles nich so :(.

xaromz 7. Mär 2008 13:16

Re: GDI+ und DrawPolygon
 
Hallo,

probier's mal mit
Delphi-Quellcode:
Graphics.DrawPolygon(GdiPen, @points[0], Count);
Gruß
xaromz

daschaos 7. Mär 2008 13:23

Re: GDI+ und DrawPolygon
 
Zum DrawPolygon kommt er erst garnich, weil er mit AccessViolation abbricht bei der ersten Points[0].X Zuweisung... aber compilieren tut er jetzt, immerhin ;). Aber dann kann doch immer noch irgendetwas nich stimmen bei dem Array oder?

Neutral General 7. Mär 2008 13:31

Re: GDI+ und DrawPolygon
 
Zitat:

Zitat von daschaos
Zum DrawPolygon kommt er erst garnich, weil er mit AccessViolation abbricht bei der ersten Points[0].X Zuweisung... aber compilieren tut er jetzt, immerhin ;). Aber dann kann doch immer noch irgendetwas nich stimmen bei dem Array oder?

Ah ist klar :!: :idea:

Du musst die Punkte erzeugen!

Delphi-Quellcode:
New(Points[0]); // <---
points[0]^.X := xBegin;
points[0]^.Y := y;
New(Points[1]); // <---
points[1]^.X := xEnd;
points[1]^.Y := y;
New(Points[2]); // <---
points[2]^.X := xEnd+xDelay;
points[2]^.Y := y-yDelay;
New(Points[3]); // <---
points[3]^.X := xBegin+xDelay;
points[3]^.Y := y-yDelay;
Ach ja ich bin immernoch für:

Delphi-Quellcode:
Graphics.DrawPolygon(@GdiPen,points[0],@Count);
oder zumindest:

Delphi-Quellcode:
Graphics.DrawPolygon(GdiPen,points[0],@Count);

daschaos 7. Mär 2008 13:47

Re: GDI+ und DrawPolygon
 
Ändert leider nichts an der Zugriffsverletzung :(, jetzt verschiebt sich der Fehler einfach auf das New(Points[0])... argh.

Ach Quatsch, sorry, hatte im Code ausversehen aus Array[0..3] of PGPPoint Array of PGPPoint gemacht... sorry :). Ok, dann dankeschööön :)!

xaromz 7. Mär 2008 14:09

Re: GDI+ und DrawPolygon
 
Hallo,

ein Array of PGPPoint dürfte eigentlich nicht funktionieren. Die Funktion erwartet ja einen Pointer auf ein Array mit Punkten, nicht einen Pointer auf ein Array mit Pointern.

das einfachste ist übrigens folgendes:
Delphi-Quellcode:
procedure TMainForm.Draw;
const
  ALPHA = 100;
var
  Graphics: TGPGraphics;
  GdiPen: TGPPen;
  points: Array of TGPPoint;
  PenR, PenG, PenB: Integer;
  Count: Integer;
begin
  PenR := GetRValue(clGray);
  PenG := GetGValue(clGray);
  PenB := GetBValue(clGray);

  Graphics := TGPGraphics.Create(TChart(Sender).Canvas.Handle);
  GdiPen := TGPPen.Create(MakeColor(Alpha, penR, PenG, PenB));

  SetLength(Points, 4);
  points[0].X := xBegin;
  points[0].Y := y;
  points[1].X := xEnd;
  points[1].Y := y;
  points[2].X := xEnd+xDelay;
  points[2].Y := y-yDelay;
  points[3].X := xBegin+xDelay;
  points[3].Y := y-yDelay;
 
  Count := 4;
  Graphics.DrawPolygon(GdiPen, points, Count);
end;
Ich hab gerade kein Delphi zur Hand, um das zu überprüfen, aber da ein dynamisches Array ein Zeiger ist, müsste das gehen.

Gruß
xaromz

daschaos 7. Mär 2008 14:46

Re: GDI+ und DrawPolygon
 
Funktioniert leider nicht. Dann kommt wieder meine Fehlermeldung, dass die Funktion nicht mit den aktuellen Parametern aufgerufen werden darf. Anders funktioniert es aber auch nicht so wie es soll. Das gibts echt nich...

daschaos 7. Mär 2008 15:03

Re: GDI+ und DrawPolygon
 
Habs jetzt so gelöst, so funktioniert es endlich:

Delphi-Quellcode:
var
 Points: Array of TGPPoint;
 PPoints: PGPPoint;

SetLength(Points, 4);
Points[0].X := xBegin;
Points[0].Y := y;
Points[1].X := xEnd;
Points[1].Y := y;
Points[2].X := xEnd+xDelay;
Points[2].Y := y-yDelay;
Points[3].X := xBegin+xDelay;
Points[3].Y := y-yDelay;

PPoints := Pointer(Points);

Graphics.DrawPolygon(GdiPen, PPoints, 4);


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 Uhr.

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