![]() |
Runtime Error bei PtInRegion
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:
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 :) |
AW: Runtime Error bei PtInRegion
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:
|
AW: Runtime Error bei PtInRegion
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 :/
|
AW: Runtime Error bei PtInRegion
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; |
AW: Runtime Error bei PtInRegion
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...
|
AW: Runtime Error bei PtInRegion
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 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