Entwickler-Ecke

Sonstiges (Delphi) - auf mausklick reagieren


Gitzi15 - Fr 27.05.05 21:10
Titel: auf mausklick reagieren
Hallo, ich brauche einen ausdruck, womit ich, wenn ich mit der Maus klicke die dazugehörigen koordinaten einlesen kann, damit dies dann in einem paint - programm benutzen kann, um z.b. eine liene von einem klich zum anderen zu ziehen, ist wirklich dringend, bin für jede hilfe dankbar.


Moderiert von user profile iconChristian S.: Topic aus Programmierwerkzeuge verschoben am Fr 27.05.2005 um 22:16


retnyg - Fr 27.05.05 21:21


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var p:tpoint;
begin

  getcursorpos(p);

  showmessage(inttostr(p.x) + ' ' + inttostr(p.y));

end;


Gitzi15 - Sa 28.05.05 19:38

Danke schon mal, hat mich ein wenig weiter gebracht, jedoch habe ich jetzt das problem, dass ich nicht wirklich weiß, wie ich die prozedur anwenden soll, da ich es legendlich hinbekomme, die prozedur beim klick auf einen button, auszulösen, mein ziel ist es, die koordinaten in einen speicher, (sichtbar oder nicht ist egal)zu bekommen, um dann damit eine linie zu erzeugen, währe echt super, wenn mir da noch jemand helfen könnte.


teebee - Sa 28.05.05 21:31


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:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Start: TPoint; // Startpunkt der neu begonnenen Linie
    Last: TPoint;  // letzter gespeicherter Endpunkt
    Procedure ResetPoints;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

Procedure TForm1.ResetPoints;
Begin
  // Startpunkt und letzten Endpunkt ungültig setzen
  Last.X := -1;
  Last.Y := -1;
  Start.X := -1;
  Start.Y := -1;
End;

Procedure TForm1.Button1Click(Sender: TObject);
Begin
  // Form löschen
  Canvas.FillRect(ClientRect);
End;

Procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  // Mausknopf gedrückt -> Startpunkt merken
  Start.X := X;
  Start.Y := Y;
End;

Procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Begin
  // Mausknopf losgelassen -> Punkte ungültig setzen, letzte gezeichnete Linie bleibt
  ResetPoints;
End;

Procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Begin
  // nur wenn ein gültiger Startpunkt vorhanden, Linie zeichnen
  If (Start.X>=0Then Begin
   // wenn ein letzter Endpunkt gespeichert ist, die Linie durch nochmaliges Zeichnen löschen
    If (Last.X>=0Then Begin
      Canvas.MoveTo(Start.X,Start.Y);
      Canvas.LineTo(Last.X,Last.Y);
    End;
    // neuen Endpunkt speichern
    Last.X := X;
    Last.Y := Y;
    // und Linie erstmalig zeichnen
    Canvas.MoveTo(Start.X,Start.Y);
    Canvas.LineTo(X,Y);
  End;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
  ResetPoints;
  // Canvas vorbereiten
  Canvas.Pen.Color := clRed;
  Canvas.Pen.Mode := pmNotXor; // dieser Modus löscht eine Linie, wenn sie ein zweites Mal gezeichnet wird
  Canvas.Brush.Color := clBtnFace;
End;

end.
Einfach einen Button auf ein leeres Formular und die Ereignisse zuweisen.

Gruß, teebee


patrick - So 29.05.05 12:44

wenn du interesse hast, hier sind ein paar algemeine delphi-tutorials. damit bekommst du einiges an grundlagen mit :wink:
http://www.dsdt.info/tutorials/index.php?cat=1


Gitzi15 - So 29.05.05 12:49

Sorry, aber das funktioniert nun überhauptnicht, ich kann das zwar ein fürgen, aber wenn ich das programm starten lasse, dann malt er gar nix. ich habe delphi 7, kann das damit zu tun haben?, wäre echt dankbar, für weiter tips.


retnyg - So 29.05.05 16:01

user profile iconteebee hat folgendes geschrieben:

Einfach einen Button auf ein leeres Formular und die Ereignisse zuweisen.

um den code von teebee nutzen zu können musst du noch alle ereignise zuweisen, das wären

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);

also formular aufmachen, einen button drauftun, doppelklick auf den button (damit das onClick ereignis zugewisen wird)
danach das form1 im objektinspektor öffnen und bei ereignise jeweils bei OnCreate OnMouseDown usw einen doppelklick machen...
wenn alle ereignise zugewiesen sind, kannst du den kompletten code mit dem obigen ersetzen.


Gitzi15 - So 29.05.05 17:13

Hi super vielen dank, habe es jetzt hinbekommen zumindestens so ziemlich, jetzt habe ich nur leider das kleine problem noch, dass delphi die koordinaten falsch ließt, bei getcursorpoint, wenn mir da noch jemand helfen könnte, wäre ich rud um glücklich.


retnyg - So 29.05.05 17:31

am einfachsten nimmst du das MouseMove event der form oder deiner zeichenfläche, da sind x und y bereits relativ zur linken oberen ecke der zeichenfläche.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  var p: tpoint;
begin
 label1.Caption := inttostr(x) + '; ' + inttostr(y); // aktuelle x, y pos auf dem formular
 getcursorpos(p);
 label2.caption := inttostr(p.x) + '; ' + inttostr(p.y); // systemweite x,y pos
 label3.caption := inttostr(p.x - form1.Left) + '; ' + inttostr(p.y - form1.top);
 // 3 variante ist etwas verschoben, da die borders und die titelleiste nicht miteinbezogen werden 
end;


Gitzi15 - So 29.05.05 18:03

jo super vielen dank