| Autor |
Beitrag |
Martello
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Mo 23.03.09 15:47
Hallo,
ich berechne die x-Position eines Maus-Kursors in meiner Paintbox unter Berücksichtigung von Form1.left und Paintbox.left. Wenn ich aber mit dem Cross-cursor eine vertikale Linie erzeugen lasse, dann liegt diese Linie immer knapp daneben. Woran könnte das liegen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var a,b: integer; poi: TPoint;
begin paintbox1.cursor:=crCross; GetCursorPos(poi); a:=poi.x-form1.left-paintbox1.left;
if cursor=1 then begin
PaintBox1.Canvas.moveTo(a,0); PaintBox1.Canvas.LineTo(a,Paintbox1.height); edit2.text:=inttostr(a); end; |
Mo.
|
|
GTA-Place
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: Mo 23.03.09 16:18
Zwei Möglichkeiten:
1.) Du nimmst in der Funktion den schon vorhandenen Parameter X, der dir immer den genauen X-Wert der Mausposition gibt.
2.) Du verwendest ScreenToClient, damit werden die Koordinaten auf deine Form angepasst:
Delphi-Quelltext 1: 2: 3:
| GetCursorPos(Poi); Poi := ScreenToClient(Poi); A := Poi.X - PaintBox1.Left; |
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 23.03.09 16:18
Warum nutzt du nicht die bereits vom onMouseDown-Ereignis übergebenen und auf die Paintbox zugeschnittenen Werte X und Y? 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Mo 23.03.09 18:51
GTA-Place hat folgendes geschrieben : | Zwei Möglichkeiten:
1.) Du nimmst in der Funktion den schon vorhandenen Parameter X, der dir immer den genauen X-Wert der Mausposition gibt.
2.) Du verwendest ScreenToClient, damit werden die Koordinaten auf deine Form angepasst:
Delphi-Quelltext 1: 2: 3:
| GetCursorPos(Poi); Poi := ScreenToClient(Poi); A := Poi.X - PaintBox1.Left; | |
ScreenToClient kannte ich noch nicht
Die Verschiebung habe ich durch eine Subtraktion einer Kostante korrigiert.
--- Moderiert von Narses: Beiträge zusammengefasst---
JayEff hat folgendes geschrieben : | Warum nutzt du nicht die bereits vom onMouseDown-Ereignis übergebenen und auf die Paintbox zugeschnittenen Werte X und Y?  |
Ich kannte bisher nur die Procedure GetCursorPos, und die gibt ja die Absolut-Koordinaten der Maus auf dem Bildschirm wieder.
Aber schön zu lernen, daß man offenbar immer mehrere Möglichkeiten hat, ein Problemchen zu lösen.
Mo.
|
|
Martello 
      
Beiträge: 131
WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
|
Verfasst: Mo 23.03.09 22:54
JayEff hat folgendes geschrieben : | Warum nutzt du nicht die bereits vom onMouseDown-Ereignis übergebenen und auf die Paintbox zugeschnittenen Werte X und Y?  |
Mittlerweile nutze ich das onMouseDown-Ereignis - Danke für den Tip  - um ein Grafikobjekt an der Klickstelle zu erzeugen. Mit'm Maus-Doppelklick würde ich es wieder gerne entfernen. Aber die Ereignisroutine hierfür heißt "PaintBox1DblClick" und der Code liefert keine x und y-Position der Maus wie beim onMouseDown-Ereignis:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.PaintBox1DblClick(Sender: TObject);
begin end; |
Wie würdest Du das lösen?
Mo.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 23.03.09 23:31
Moin!
Im OnClick die Position speichern (tritt auf jeden Fall vor einem Doppelklick ein) und dann im OnDblClick verwenden.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 24.03.09 00:02
Narses hat folgendes geschrieben : | | Im OnClick die Position speichern |
Im OnMouseDown, denn OnClick hat auch keine Koordinaten als Parameter.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 24.03.09 08:39
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|