Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Mouseclick simulieren


Taladan - Mi 06.08.03 16:26
Titel: Mouseclick simulieren
Wie kann ich in einen Element den Click einer Maus simulieren. Wenn ich z. B. die Coordinaten x,y habe, soll die ein klick genau auf diese coordinaten ausgeführt werden.

Also ungefähr so

Delphi-Quelltext
1:
2:
3:
4:
5:
var x,y : integer
begin
   mouseclick?(x,y);
   mach irgendwas....
end;


Gausi - Mi 06.08.03 21:49

Hmm..Ehrlich gesagt, verstehe ich nicht ganz genau, was du meinst.

Willst du, dass abhängig von den Mauskoordinaten was verschiedenes ausgeführt wird? Dann würd ich mir mal die Ereignisse onMouseDown bzw onMouseUp anstelle von OnClick anschauen. Da werden die Koordinaten nämlich mitübergeben...


Raphael O. - Mi 06.08.03 21:56

wenn du auf diese Art und Weise auf einen Button deiner Form klicken willst, dann kannst du acuh die Entsprechende Prozedur direkt aufrufen:

Delphi-Quelltext
1:
 button1click(sender);                    


btw: ich weiß, das das evtl. gar nicht das ist, was du willst, da du aber keinen näheren Verwendungszweck angegeben hast lag es für mich nahe ;)


Andreas_Sans - Mi 06.08.03 23:13

ich glaube er meint, dass man einen Mausclick z.B. auf ein label simuliert indem man die Koordinaten des labels angibt auf die man klicken soll


OlliH - Mi 06.08.03 23:30

Easy Delphi Helper 2000 - EDH online
Mausclick simulieren
Hits: 593
Modul für den EDH: modul8.edu Download
Eingesendet von: Sven Schneider Mail

Zitat:
Mausclick simulieren

Die folgende Procedure simuliert einen Linksclick an den angegebenen Koordinaten (X=100, Y=200). Es werden damit dann auch das entsprechende OnClick-Ereignis der Komponente ausgeführt.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Timer1Timer(Sender: TObject);
var 
  x,y: integer;
begin
  x:=100;
  y:=200;
  mouse_event(MOUSEEVENTF_leftDOWN,x,y,0,0);
  mouse_event(MOUSEEVENTF_leftUP,x,y,0,0);
end;

Für die rechte Maustaste gilt entsprechend:

MOUSEEVENTF_RIGHTDOWN
MOUSEEVENTF_RIGHTUP
Und das gleiche gibt es auch noch für die mittlere Maustaste:

MOUSEEVENTF_MIDDLEDOWN
MOUSEEVENTF_MIDDLEUP

Moderiert von user profile iconTino: Quote- & Delphi-Tags hinzugefügt.


Andreas_Sans - Do 07.08.03 01:45

ich hab einfach Mousedown auf dem Formblatt benutzt und den Bereich eingegrenzt in dem man clicken kann um ein Ereignis auszulösen :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var i : integer;
begin
if (x >= 100and (x<= 200and (y >= 100and (y <= 200then begin
//dein eigener programmtext
                                                            end;
end;


hier kann mal also in den Bereich von 100-200 auf der x-Achse und 100-200 auf der y-Achse klicken. Die Koordinaten bilden also ein Rechteck


Taladan - Do 07.08.03 10:41

Also. Mein Problem ist es, das ich ein DBGrid (MouseDown-Event habe ich hinzugefügt) habe, wo ich per Drag & Drop bestimmte Daten von einen anderen DBGrid bzw Listbox ziehen möchte.
Alles so weit in ordnung, doch leider erhalte ich bei den gelieferten coordinaten von Delphi enteweder die Mousecoordianten oder die coordinaten der Zelle, bei momentaner ansicht. Also nicht der Reelle 79 Datensatz, sondern nur der fünfte der momentanen Ansicht. Also ist eine Bewegung zu diesen Datensatz schwer, da mir mir ja zum einen der ausgangsdatensatz, wo der zeiger steht, gar nicht in der momentanen anzeige zu sehen sein muss (überlange Tabelle). Zum anderen kann er vor beziehungsweise hinter den Datensatz geklickt worden sein, aber ich erhalte immer als anzeige den 7 Datensatz. Also mus ich irgendwie diesen datensatz mit vorhanden mitteln ansteuern.

Nach langer überlegung, dacht ich mir, ich kann dies über einen simulierten Mouseclick tun. Oder kennt jemand eine bessere Möglichkeit?
Leider gibt es ja beim DBGrid nicht die Funktion MouseToCell, was das ganze erheblich vereinfachen würde.


Taladan - Do 07.08.03 11:27

Ich habe den kode jetzt folgendermaßen aufgebaut.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure THauptform.DBGrid2DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var Cell: TGridCoord;
    a : integer;
    hiddendata : THidden;
begin
     try
          mouse_event(MOUSEEVENTF_leftDOWN,x,y,0,0);
          mouse_event(MOUSEEVENTF_leftUP,x,y,0,0);
     finally
           if (source = listbox1) then
           begin
           a:= (source as TListBox).itemindex;
           hiddendata := ((Source as Tlistbox).Items.Objects[a] as THidden);
           table2.Edit;
           table2verteiler.value := hiddendata.id;
           table2.Post;
           Table2.refresh;
           end;
     end;
end;


Warum führt das Program erst den kompletten code aus und wechselt dann in die entsprechende zeile?