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 user profile iconNarses: 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 // des Formulars
  FCurrentPos: TPoint;
// in ImageXMouseDown:
  FCurrentPos := Point(X, Y);
Denn du bekommst die Koordinaten direkt übergeben, brauchst die also gar nicht erst bestimmen.

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconbfelix hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconNarses: 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;

...

// in OnMouseDown:
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

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconbfelix hat folgendes geschrieben Zum zitierten Posting springen:
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)