Startseite ¦  was ist neu ¦  programmier tips ¦  indy artikel ¦  intraweb artikel ¦  informationen ¦  links ¦  interviews ¦  sonstiges
kylix ¦  tutorials ¦  online shop ¦  fotos ¦  Add&Win Gewinnspiel


Willkommen Gast. Bitte einloggen oder registrieren.
21.05.2012, 11:32:27
Übersicht Hilfe Suche Einloggen Registrieren

+  SwissDelphiCenter Forum
|-+  German Forums
| |-+  WinAPI Forum
| | |-+  Problem mit CreatePolygonRgn(...
« vorheriges nächstes »
Seiten: [1] Drucken
Autor Thema: Problem mit CreatePolygonRgn(...  (Gelesen 2305 mal)
Sven
Sr. Member
****
Offline Offline

Beiträge: 330


WWW
« am: 13.03.2002, 09:03:53 »

Ich verwende CreatePolygonRgn und PtInRegion um Mausklicks in einem polygonal begrenzten Raum abfragen zu können.
Dies ist der Quelltextauszug

Code:

handle := CreatePolygonRgn(tp[0], High(tp), 1);

   if handle ] 0 then begin

     if SelectObject(BCAD.imgCAD.Canvas.Handle, handle) ] 0 then

     begin

        if PtInRegion(handle, p.x, p.y) then begin

        ...


tp ist dabei ein dynamisches Array vom Typ TPoint.
Mein Problem ist, daß der erste Aufruf noch korrekt funktioniert. Falls ich das Prog jedoch mit der Kompilereinstellung RangeCheck kompiliere, bekomme ich beim zweiten Durchlauf eine Exception. Das Handle gebe ich später mit DeleteObject(handle) wieder frei.

Wer kann helfen?

Sven

Nachtrag
Wenn ich ein statisches Array verwende habe ich dasselbe Problem.
Die Exception ist vom Typ RangeCheckError
Gespeichert



Linux: Mandrake 9.1, Kernel 2.4.21, XFree 4.3.0, KDE 3.1.4, Kylix 3 (patched)



Kylix Problem? Hier -] Deutsches Kylixforum werden Sie geholfen
Thomas Stutz
Global Moderator
Hero Member
*****
Offline Offline

Beiträge: 1784



WWW
« Antworten #1 am: 13.03.2002, 12:26:34 »

Hi,

Ich kann leider dein Problem anhand des Quelltextauszuges nicht
erkennen aber so was funktioniert bei mir:


[font size=2 face="Courier New"][font color="#000000"]procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
type
  
PPointArray = ^TPointArray;
  TPointArray = array[0..MaxInt div SizeOf(TPoint) - 1] of TPoint;
var
  
Rgn: HRGN;
  Pa: PPointArray;
begin
  
GetMem(Pa, SizeOf(TPoint) * 3);
  try
    
Pa[0] := Point(0, 0);
    Pa[1] := Point(80, 200);
    Pa[2] := Point(200, 80);
    Rgn := CreatePolygonRgn(Pa[0], 3, WINDING);
    try
      
Canvas.Brush.Color := clGreen;
      FillRgn(Canvas.Handle, Rgn, Canvas.Brush.Handle);
      if PtInRegion(Rgn, X, Y) then ShowMessage('ja');
    finally
      
DeleteObject(Rgn);
    end;
  finally
    
FreeMem(Pa);
  end;
end;
[/font][/font]
Gespeichert

(¯`·._tom_.·´¯)

Tipp: Viele Antworten auf Fragen gibt's hier:
http://www.swissdelphicenter.ch/de/tipsuchen.php
Rainer
Hero Member
*****
Offline Offline

Beiträge: 1666


WWW
« Antworten #2 am: 13.03.2002, 12:32:05 »

Was machst Du denn da wo die Punkte stehen?

Sowas funktioniert ohne Probleme:

[font size=2 face="Courier New"][font color="#000000"]var
  
points: array of TPoint;

[font color="#000080"]{$R+}

[/font]procedure TForm1.FormCreate(Sender: TObject);
begin
  
SetLength(points, 4);
  points[0].x := 1;
  points[0].y := 1;
  points[1].x := 145;
  points[1].y := 245;
  points[2].x := 245;
  points[2].y := 200;
  points[3].x := 1;
  points[3].y := 25;
  Image1.Canvas.Polygon(points);
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  
h: THandle;
begin
  
h := CreatePolygonRgn(points[0], Length(points), 1);
  try
    if 
PtInRegion(h, x, y) then
    begin
      
ShowMessage('huhu');
    end;
  finally
    
DeleteObject(h);
  end;
end;
[/font][/font]
Edit: Das nächste Mal schau ich, ob in der Zwischenzeit nicht schon wer was geschrieben hat :-)
Gespeichert

MfG Rainer

end.
Sven
Sr. Member
****
Offline Offline

Beiträge: 330


WWW
« Antworten #3 am: 13.03.2002, 13:01:07 »

Hallo Rainer,

ähnlich Deinem zweiten Beispiel ist es bei mir. Ein dyn. Array of TPoint, allerdings local definiert.
Ich habe auch schon das ...High(tp), 1); gegen Length(tp) ausgestauscht.
Keine Änderung.
Was mir aber auffällt, bei meinem Prog, daß die RangeCheckError nicht unbedingt nach dem zweiten Mal, sondern evtl auch erst nach dem vierten oder fünften Mal auftritt.
Gespeichert



Linux: Mandrake 9.1, Kernel 2.4.21, XFree 4.3.0, KDE 3.1.4, Kylix 3 (patched)



Kylix Problem? Hier -] Deutsches Kylixforum werden Sie geholfen
Seiten: [1] Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006, Simple Machines LLC Prüfe XHTML 1.0 Prüfe CSS