Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Zwei Mauspositionen auf Klick speichern in Variablen
bfelix - Do 13.01.11 17:13
Titel: Zwei Mauspositionen auf Klick speichern in Variablen
Hallo Community,
ich würde gerne in einem Bild (TImage) an zwei Stellen klicken, worauf dann die Koordinaten der Mauspositionen im Bild in von mir gewählten Variablen gespeichert werden. Gibt es da einen Befehl o.ä., mit dem sowas möglich ist. Ich habe schon die Suchfunktion und Google bemüht, hier auch was gefunden aber das war relativ unverständlich für mich.
LG
Felix
Moderiert von
Narses: Topic aus Multimedia / Grafik verschoben am Do 13.01.2011 um 17:19
HenryHux - Do 13.01.11 17:17
Naja ich würde das jetzt mal so probieren, dass ich direkt nach dem Klick, die aktuelle Mausposition abfrage.
Das geht mit:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var MausPos : TPoint; begin getcursorpos(MausPos); label1.caption:=(inttostr(Mauspos.X)+' ' +inttostr(Mauspos.y)); end; |
Dann kannst du mit Ifs auf verschiedene Bereiche abfragen.
Lg
bfelix - Do 13.01.11 17:35
Hallo,
wie sähen die Ifs dann ungefähr aus?
LG
Felix
jaenicke - Do 13.01.11 17:36
Delphi-Quelltext
1: 2: 3: 4:
| private FCurrentPos: TPoint; FCurrentPos := Point(X, Y); |
Denn du bekommst die Koordinaten direkt übergeben, brauchst die also gar nicht erst bestimmen.
HenryHux hat folgendes geschrieben : |
| Naja ich würde das jetzt mal so probieren, dass ich direkt nach dem Klick, die aktuelle Mausposition abfrage. |
Wobei das die globale Position auf dem Bildschirm ist, nicht auf dem Image.
bfelix hat folgendes geschrieben : |
| wie sähen die Ifs dann ungefähr aus? |
Kommt ja darauf an was du damit machen willst. :nixweiss:
bummi - Do 13.01.11 17:41
OnMouseDown bei ersten mal X,Y in PointVar1
bei zweiten mal X,Y in PointVar2
speichern.
bfelix - Do 13.01.11 18:06
Ich will die Koordinaten in Variablen speichern, um sie dann abzurufen.
1. Klick: xm(X-Wert),ym(Y-Wert)
2. Klick: xk(X-Wert),yk(Y-Wert)
---
Moderiert von
Narses: Beiträge zusammengefasst---
Wie kann ich das in PointVar1 und 2 speichern v.a. mit dem 2-Mal
jaenicke - Do 13.01.11 18:10
Dann deklariere dir unter
private das alles und damit hast du doch schon fast alles.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| private FFirstClick: Boolean; FMValueX, ...: Integer;
...
if FFirstClick then begin FMValueX := X; FMValueY := Y; else begin FKValueX := X; ... |
bummi - Do 13.01.11 18:14
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Image1: TImage; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private FClickEven: Boolean; FClickCount: Integer; FXM, FYM, FXK, FYK: Integer; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inc(FClickCount); if NOT FClickEven then begin FXM := X; FYM := Y; end else begin FXK := X; FYK := Y; end; if (FClickCount AND 1) = 0 then Showmessage('(schon wieder) zwei ma geklickt'); FClickEven := not FClickEven; end;
end. |
bfelix - Do 13.01.11 18:17
@jaenicke: Und dann die Variable FFirstclick auf false setzen?
@bummi: Sind dann die Koordinaten in FXM, FYM bzw. FXK, FYK gespeichert?
bummi - Do 13.01.11 18:26
was davon
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if FClickEven then begin FXM := X; FYM := Y; end else begin FXK := X; FYK := Y; end; |
hast Du nicht verstanden?
bfelix - Do 13.01.11 18:34
Ich habs jetzt verstanden aber was bedeutet FClickEven?
HenryHux - Do 13.01.11 18:38
Guck mal hier rein.
Das ist die Variable, die er benutzt um zu speichern ob schonmal geklickt wurde. Nach dem ersten Klick wird die false.
Lg
bummi hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Image1: TImage; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private FClickEven: Boolean; FClickCount: Integer; FXM, FYM, FXK, FYK: Integer; public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin inc(FClickCount); if FClickEven then begin FXM := X; FYM := Y; end else begin FXK := X; FYK := Y; end; if (FClickCount AND 1) = 0 then Showmessage('(schon wieder) zwei ma geklickt'); FClickEven := not FClickEven; end;
end. | |
bummi - Do 13.01.11 18:39
Oups, da ist ein Logikdreher von mir drin
FClickEven ist als Klassenvariable initial false und wird bei jedem Klick getoggelt
true
false
true
false
allerdings hätte es entweder (not ClickEven) heißen müssen, oder
FXM := X;
FYM := Y;
und
FXK := X;
FYK := Y;
müssen ausgetauscht werden, sorry :-(
EDIT:
ich habe es im Originalpost korrigiert
bfelix - Do 13.01.11 19:49
Ich habs jetzt mal mit deinem Code probiert! Allerdings zeigt es gleich beim zweiten Klick an "Zu oft geklickt"
Was kann da des Problem sein?
jaenicke - Do 13.01.11 19:55
bfelix hat folgendes geschrieben : |
Allerdings zeigt es gleich beim zweiten Klick an "Zu oft geklickt"
Was kann da des Problem sein? |
Da in dem Code bisher diese Meldung nicht auftaucht, musst du selbst irgendetwas dazu geschrieben haben. Und was das ist, hast du nicht dazu geschrieben. Woher sollen wir das also wissen?
bfelix - Do 13.01.11 20:10
Delphi-Quelltext
1: 2:
| if (FClickCount AND 1) = 0 then Showmessage('(schon wieder) zwei ma geklickt'); |
Das mein ich: (schon wieder) zwei ma geklickt
jaenicke - Do 13.01.11 20:25
Naja, da der Wert bereits auf 1 erhöht wurde, ist klar, dass auch direkt die Meldung kommt. Lösung: Mit -1 initialisieren oder eben nur die boolsche Variable benutzen.
bfelix - Do 13.01.11 20:35
Gut danke für alle antworten! Ich habs nun geschafft!
(Die Meldung einfach in eine nächste Anweisung verwandelt)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!