AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Überprüfen ob Mausklick in bestimmten bereich war
Thema durchsuchen
Ansicht
Themen-Optionen

Überprüfen ob Mausklick in bestimmten bereich war

Ein Thema von xZise · begonnen am 30. Jul 2006 · letzter Beitrag vom 26. Mär 2012
Antwort Antwort
Seite 2 von 2     12   
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#1

Re: Überprüfen ob Mausklick in bestimmten bereich war

  Alt 30. Jul 2006, 11:17
Und noch ein Ansatz:

Delphi-Quellcode:
type
  TRects = array of TRect;

var
  rects: TRects;

function InRect(rects: TRects; pt: TPoint): Boolean;
var
  i: Integer;
begin
  Result := True;
  for i := Low(rects) to High(rects) do
    if PtInRect(rects[i], pt) then
      Exit;
  Result := False;
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Überprüfen ob Mausklick in bestimmten bereich war

  Alt 30. Jul 2006, 11:20
Igels Version dürfte die schnellste sein, da sie keine Branches enthält...

Allerdings dürften die Unterschiede minimal sein, kann sogar sein, dass der Compiler sowieso das so stark optimiert, dass es gar nicht mehr auffällt.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Überprüfen ob Mausklick in bestimmten bereich war

  Alt 30. Jul 2006, 11:29
Ich denke mal, das ganze bezieht sich auf dieses DonD-Spiel. Ich denke, du hast da alle 26 in einem Image oder dergleichen.
Wäre es nicht besser, bei einem Klick die Koordinaten zu nehmen und berechnen zu lassen, auf welchen Koffer man gedrückt hat?
Die Koffer sind ja immer gleich groß. Sagen wir mal 50 Pixel breit. Wenn du dann als X-Wert sowas wie 384 bekommst weißt du, dass 384 / 50 = 7 (Rest 34) ist, also der 7. Koffer in der Reihe gedrückt wurde.
Jetzt musst du nur noch den Rand "ausmessen", bei dem links jeweils der erste Koffer beginnt.
grrr... ich bin gerade erst aufgestanden und kann noch keine Texte schreiben, ich hoffe es ist klar, was ich meine.
Ich denke, diese Art wäre schneller, als alle 26 mal inRect auszuführen.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Überprüfen ob Mausklick in bestimmten bereich war

  Alt 30. Jul 2006, 11:33
Okay die Funktion könnte ich mir selber schreiebn (), was mich am ersten asnatz gestört hat ist die "komplexibilität"...

Da bilckt man nicht so einfach durch... Da ist die "InRect" Methode besser.

Okay... Dann mache ich's so


[roter Kasten]
o.O
Öhm ja, so könnte man es machen

Problem ist nur, dass sie nach unten hin versetzt sind... Also könnte ich die Reihe bestimmen und müsste an noch ein bisschen mehr rand dazuaddieren.

(PS: richtig geschlussfolgert )[/roter Kasten]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Überprüfen ob Mausklick in bestimmten bereich war

  Alt 30. Jul 2006, 11:35
bei seinem Dond sind die Koffer aber nicht schön wie auf einem Schachbrett angeordnet, sondern die zweite Reihe beginnt eine halbe Kofferbreite weiter rechts als die erste. Um das auch noch zu berücksichtigen müsste man auch noch ein paar Abfragen schreiben.
Da die Koffersuche aber nur alle paar minuten mal ausgeführt werden muss, ist es hier wichtiger einen gut verständlichen Code zu schreiben, als einen schnellen.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Überprüfen ob Mausklick in bestimmten bereich war

  Alt 30. Jul 2006, 11:37
Zitat von xZise:
[roter Kasten]
o.O
Öhm ja, so könnte man es machen

Problem ist nur, dass sie nach unten hin versetzt sind... Also könnte ich die Reihe bestimmen und müsste an noch ein bisschen mehr rand dazuaddieren.

(PS: richtig geschlussfolgert )[/roter Kasten]
Na ja, der Rand verhält sich proportional zur Reihe. In der ersten ist er sagen wir mal nur 10, in der zweiten dann 35, dann 60. Es kommt immer ein halber Koffer hinzu.
Also 10 + 25*(Spaltennummer - 1) oder so in der Art. Je nachdem, wie groß die Zahlen wirklich sind.

Probier das mal aus, ich finde, dass dieser Weg der schönste wäre. Vor allem, weil du kein Array[1..26] of Trect brauchst, die du manuell füllen musst.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Überprüfen ob Mausklick in bestimmten bereich war

  Alt 30. Jul 2006, 11:58
(Das TRect könnte ich in der Zeichenrutine unterbringen )

Aber hier ist jetzt die Lösung des Problems!
Es funktioniert eigentlich genz gut!
Was noch fehlt, ist, dass man nicht rechts neben den Koffern klicken kann!

Delphi-Quellcode:
procedure TForm1.SpielfeldMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var row, side, col, KofferNum,prefrows : Integer;
begin
  // Zeile heruasfinden (0-3)
  row := Floor(Y / 70);
  // Rand herausfinden (5 mindestens und pro Zeile (row = 1 oder 3) sind es 32 px mehr ansonsten sind es 65 px)
  side := Floor(5 + row * 32.5);
  // Spalte herausfinden
  col := Floor((x - side) / 70);
  // dareingehen, wenn man mindestens über den linksten Koffer ist
  if col > 0 then begin
    // Vorhergende Koffer dazuaddieren
    prefrows := 0;
    if row >= 1 then
      inc(prefrows, 8); // 1. sind 8 K. +
    if row >= 2 then
      inc(prefrows, 7); // 2. sind 7 K. +
    if row >= 3 then
      inc(prefrows, 6); // 3. sind nochmal 6 K. +
    // Koffernummer (plus eins, weil der erste ohne dem plus eins 0 ist)
    KofferNum := col + prefrows + 1;
    // zu testzwecken einfach mal anzeigen !
    Label2.Caption := IntToStr(row) + ' :: ' + IntToStr(col) + ' == ' + IntToStr(KofferNum);
  end else
    Label2.Caption := IntToStr(row) + ' :: ' + IntToStr(col) + ' == ';
end;
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
30. Jul 2006, 12:08
Dieses Thema wurde von "Phoenix" von "Object-Pascal / Delphi-Language" nach "VCL / WinForms / Controls" verschoben.
Hat eher was mit den Klassen der VLC zu tun
Antwort Antwort
Seite 2 von 2     12   


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 07:35 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