Autor Beitrag
Martello
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: 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?


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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? :nixweiss:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Martello Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Mo 23.03.09 18:51 
user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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 user profile iconNarses: Beiträge zusammengefasst---

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Warum nutzt du nicht die bereits vom onMouseDown-Ereignis übergebenen und auf die Paintbox zugeschnittenen Werte X und Y? :nixweiss:


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 131

WIN 2000
TP, C, Delphi 1.0, Turbo Delphi 2006, Delphi 7
BeitragVerfasst: Mo 23.03.09 22:54 
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
Warum nutzt du nicht die bereits vom onMouseDown-Ereignis übergebenen und auf die Paintbox zugeschnittenen Werte X und Y? :nixweiss:


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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.PaintBox1DblClick(Sender: TObject);

begin
end;


Wie würdest Du das lösen?

Mo.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 24.03.09 00:02 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Im OnClick die Position speichern
Im OnMouseDown, denn OnClick hat auch keine Koordinaten als Parameter.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 24.03.09 08:39 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Im OnClick die Position speichern
Im OnMouseDown, denn OnClick hat auch keine Koordinaten als Parameter.
Meinte ich natürlich :angel:

_________________
There are 10 types of people - those who understand binary and those who don´t.