AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Runtime Error bei PtInRegion

Ein Thema von arest · begonnen am 23. Dez 2012 · letzter Beitrag vom 23. Dez 2012
Antwort Antwort
arest

Registriert seit: 27. Sep 2005
Ort: Frankfurt
62 Beiträge
 
Delphi 6 Personal
 
#1

Runtime Error bei PtInRegion

  Alt 23. Dez 2012, 13:07
hallo allerseits,
bin gerade dabei ein dart scoring programm zu schreiben.. fand die projekte, die bisher realisiert wurden optisch nicht sonderlich ansprechend und wollte mich daher selbst mal dran setzen. prinzip soll folgendes sein: im prog ist ein bild der dartscheibe eingebunden über das man mit der maus fährt und dann klickt man auf das gewünschte feld um seine score zu klicken. um das umzusetzen habe ich mich jetzt mal mit ptinregion befasst und das in zwei ereignisse eingebunden. erstens auf den mousemove, sodass einem per textausgabe angezeigt wird, über welchem feld ich mich aktuell befinde und zweitens dann auf mousedown, um den entsprechenden bereich zu bestätigen. beim ersten wird dann zum beispiel "double20" angezeigt und beim zweiten wird dann die score "40" eingetragen. ich habe das vom ansatz jetzt wie folgt gelöst

Delphi-Quellcode:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var rgn_s1_1, rgn_s1_2, rgn_d1, rgn_t1 : HRGN;
    plist_s1_1, plist_s1_2, plist_d1, plist_t1 : array [0..4] of TPoint;
begin
  label5.Caption:='X: ' + IntToStr(X) + 'Y: ' + IntToStr(Y); //aktuell nur drin um die koordinaten zu ermitteln
  
//***************************SINGLE 1******************************
  plist_s1_1[0] := Point(282,52);
  plist_s1_1[1] := Point(340,71);
  plist_s1_1[2] := Point(310,129);
  plist_s1_1[3] := Point(271,117);
  rgn_s1_1 := CreatePolygonRgn(plist_s1_1,4,Winding);
  if PtInRegion(rgn_s1_1, x, y)
  then StaticText4.Caption := '1';
  plist_s1_2[0] := Point(270,130);
  plist_s1_2[1] := Point(304,140);
  plist_s1_2[2] := Point(259,230);
  plist_s1_2[3] := Point(254,228);
  rgn_s1_2 := CreatePolygonRgn(plist_s1_2,4,Winding);
  if PtInRegion(rgn_s1_2, x, y)
  then StaticText4.Caption := '1';
//***************************DOUBLE 1******************************
  plist_d1[0] := Point(284,41);
  plist_d1[1] := Point(344,61);
  plist_d1[2] := Point(341,68);
  plist_d1[3] := Point(283,49);
  rgn_d1 := CreatePolygonRgn(plist_d1,4,Winding);
  if PtInRegion(rgn_d1, x, y)
  then StaticText4.Caption := 'D1';
//***************************TREBLE 1******************************
  plist_t1[0] := Point(272,120);
  plist_t1[1] := Point(308,132);
  plist_t1[2] := Point(305,137);
  plist_t1[3] := Point(271,126);
  rgn_t1 := CreatePolygonRgn(plist_t1,4,Winding);
  if PtInRegion(rgn_t1, x, y)
  then StaticText4.Caption := 'T1';

leider kommt es für mich nicht wirklich logisch zu einem runtime error... läuft erstmal ganz normal und das prinzip funktioniert auch einwandfrei, allerdings stirbt mir der mist nach ner weile hin und her bewegen der maus weg?!
Zitat:
"Im Projekt Project1.exe ist eine Exception der Klasse EOutOfResources aufgetreten. Meldung: 'Fehler beim Erstellen des Fenster-Gerätekontexts'. Prozeß wurde angehalten. ..."

ich gehe davon aus, dass es irgendwelche komplikationen bezüglich der regionen gibt?! wenn ich jetzt zum beispiel für sich überschneidende regionen zwei unterschiedliche ereignisse erwarte, ist es ja klar, dass nicht eindeutig ist, ob er jetzt "1" oder "D1" anzeigen soll... eigentlich dürften sich die regionen aber nicht überschneiden :O jemand eine idee woran das liegen könnte?!

vielen dank schonmal
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Runtime Error bei PtInRegion

  Alt 23. Dez 2012, 13:16
Zerstörst Du die Regions denn auch wieder, wenn Du sie nicht mehr brauchst? Außerdem sollte man evtl. abprüfen, ob sie überhaupt erzeugt wurden.

[edit]
Zitat:
Return value

If the function succeeds, the return value is the handle to the region.

If the function fails, the return value is NULL.
Remarks

When you no longer need the HRGN object, call the DeleteObject function to delete it.

Region coordinates are represented as 27-bit signed integers.

Regions created by the Create<shape>Rgn methods (such as CreateRectRgn and CreatePolygonRgn) only include the interior of the shape; the shape's outline is excluded from the region. This means that any point on a line between two sequential vertices is not included in the region. If you were to call PtInRegion for such a point, it would return zero as the result.
[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
arest

Registriert seit: 27. Sep 2005
Ort: Frankfurt
62 Beiträge
 
Delphi 6 Personal
 
#3

AW: Runtime Error bei PtInRegion

  Alt 23. Dez 2012, 13:26
hast mit deiner aussage natürlich recht.. ich "zerstöre" sie nirgends wieder! wäre natürlich logisch das auch zu tun, angelegt sein müssten sie aber ja in jedem fall, da mir sonst doch auch nicht erstmal eine erfolgreiche textausgabe gelingen könnte oder?! also hat er ja schon mal festgestellt, dass der gerade aktuelle punkt in der region ist.. wie könnte denn eine solche abfrage aussehen? ich hab mich bisher wirklich noch nie mit dieser thematik beschäftigt :/
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Runtime Error bei PtInRegion

  Alt 23. Dez 2012, 13:40
Da sich die Regions im Programmverlauf wohl nicht ändern werden, würde ich sie einmalig (z.B. im OnCreate) anlegen, mir das jeweilige Handle merken und sie im OnDestroy dann wieder zerstören. Beispielhaft mit einer einzelnen Region:
Delphi-Quellcode:
type
  TDeinForm = class(TForm)
  private
    FRgnSingle: hRgn;
    ...
  end;

procedure TDeinForm.FormCreate(Sender: TObject);
begin
  FRgnSingle := CreatePolygonRgn(...);
  if FRgnSingle = 0 then
    raise SomeException;
end;

procedure TDeinFom.FormDestroy(Sender: TObject);
begin
  DeleteObject(FRgnSingle);
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
arest

Registriert seit: 27. Sep 2005
Ort: Frankfurt
62 Beiträge
 
Delphi 6 Personal
 
#5

AW: Runtime Error bei PtInRegion

  Alt 23. Dez 2012, 14:08
okay, danke für die antwort! ich werde das dann mal versuchen einzuarbeiten, auch wenn es nicht die ursache für mein problem zu sein scheint.. ich habe das jetzt nochmal ein wenig genauer "untersucht" und festgestellt, dass das prog auch abkratzt, wenn ich gar nicht in eine der regionen komme. (sprich die maus im bereich des bildes bewege, aber nicht über eine definierte rgn komme) dies geschieht allerdings erst nach einer gewissen "strecke" die ich hin und her fahre, daher also die überlegung ob ich evtl eine variable belege, die nur eine gewisse länge haben kann?! oder anders gesagt die nur eine gewisse anzahl an werten beinhalten kann...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Runtime Error bei PtInRegion

  Alt 23. Dez 2012, 14:15
Du erzeugst im MouseMove immer neue Regions, ohne sie wieder freizugeben. Das ist ja unabhängig davon, ob sich der Mauszeiger innerhalb einer davon befindet.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 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