Maus Cursor setzen!?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
tempuss
Beiträge: 5
Registriert: Mo 27. Jan 2014, 19:34

Maus Cursor setzen!?

Beitrag von tempuss »

Hallo Pascal-Freunde!

Seit Tagen versuche ich, den Mauscursor an bestimmte Stellen zu setzen- ohne Erfolg.

Tagelanges Googlen hat mir nicht helfen können.

Habe ein Punktraster auf der Form erstellt, Abstand der Punkte 50 Pixel.
Für ein Grafikprogramm möchte ich, dass der Mauscursor beim hinüberfahren von einem Punkt zum anderen springt,
da nur an diesen Stellen gezeichnet werden soll.

Den unten stehenden code habe ich aus einem Delphi-Forum, er klappt insofern,
das der Mauszeiger in die linke obere Ecke gesetzt wird, sobald die if-Bedingung erfüllt ist.
Und dort ist er dann auch nicht mehr wegzukriegen.

Wollte diesen code modifizieren und für mich verwenden.
Dazu komentiere ich das SetCursorPos(Pt.X, Pt.Y) raus und nehme mein verändertes darunter.
Doch dann reagiert die Maus ganz normal und wird durch meinen code garnicht beeinflusst!!??

Die mit // auskomentierten Zeilen sind von mir.

uses .., LclIntf, ... // Diese unit muss eingebunden werden(durch googlen erfahren).

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
Var Pt: TPoint;
// xx,yy: Integer;

Begin
Pt := Form1.ScreenToClient(Mouse.CursorPos);
{}Pt.X := X; // wozu Mouse.CursorPos abfragen,
{}Pt.Y := Y; // obwohl man die Werte doch schon in X und Y hat?

Caption := Format('%d:%d', [Pt.X, Pt.Y]); // Zeigt nur die x/y-Coordinaten

If (Pt.X in [100..200]) and (Pt.Y in [50..150]) Then
begin Label1.Caption:='FormMouseMove';
Pt.X := 100 + (200 - 100) div 2; // 150
Pt.Y := 50 + (150 - 50) div 2; // 100
Pt.X := 50;
Pt.Y := 50;
// xx := trunc(PT.x/100);
// yy := trunc(PT.y/100);
Pt := Form1.ClientToScreen(Pt);
SetCursorPos(Pt.X, Pt.Y);
// SetCursorPos(xx,yy);
end;

Es wäre total toll, wenn jemand hier in diesem code das Problem finden könnte! :idea: :roll:

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Maus Cursor setzen!?

Beitrag von Michl »

Das ist mMn schon so ziemlich das unschönste, was man einem Nutzer antun kann. Ich würde denken, das Programm hätte einen Fehler.

Wie auch immer, programmieren kann man sowas schon (zumindest unter Windows funktioniert das mir, unter Linux nicht):

Code: Alles auswählen

uses ..., LCLIntf;
...
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  private
    FVirtualMousePoint: TPoint;
    FLastMousePoint: TPoint;
  end;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  FVirtualMousePoint.x := 0;
  FVirtualMousePoint.y := 0;
  FLastMousePoint.x := -1;
  FLastMousePoint.y := -1;
end;
 
procedure TForm1.FormMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var
  P: TPoint;
begin
  if (X = FLastMousePoint.x) and (Y = FLastMousePoint.y) then Exit;
 
  if FLastMousePoint.x < 0 then
  begin
    FLastMousePoint.x := X;
    FLastMousePoint.y := Y;
    FVirtualMousePoint.x := X;
    FVirtualMousePoint.y := Y;
    Exit;
  end;
 
  FVirtualMousePoint.x := FVirtualMousePoint.x - FLastMousePoint.x + X;
  FVirtualMousePoint.y := FVirtualMousePoint.y - FLastMousePoint.y + Y;
  P := FVirtualMousePoint;
  P.x := (P.x div 50) * 50;
  P.y := (P.y div 50) * 50;
  FLastMousePoint.x := P.x;
  FLastMousePoint.y := P.y;
  P := ClientToScreen(P);
  SetCursorPos(P.x, P.y);
end;
Zuletzt geändert von Michl am Do 30. Jun 2016, 14:28, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Maus Cursor setzen!?

Beitrag von Michl »

Vielleicht noch als Ergänzung, wie ich sowas eher umsetzen würde (weiß aber nicht, ob du das so willst).

Ich würde, sobald man in die Nähe von einem Punkt kommt, einfach den Cursor ändern (so, wie das viele Programme machen z.B. beim Objekt fangen etc.):

Code: Alles auswählen

uses ..., math;
...
procedure TForm1.FormMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var
  aDist: Integer;
begin
  aDist := Max( Min(X mod 50, 50 - X mod 50), Min(Y mod 50, 50 - Y mod 50));
  if aDist < 8 then
    Cursor := crCross
  else
    Cursor := crDefault;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

tempuss
Beiträge: 5
Registriert: Mo 27. Jan 2014, 19:34

Re: Maus Cursor setzen!?

Beitrag von tempuss »

Zunächst: DANKE DIR Michl!!!

Das ist für mich schon ein gr. Schritt nach vorne!

Leider nimmt Delphi den Befehl MAX nicht an(bin gerade auf Delphi 3 angewiesen- der Befehl MaX wird erst den späteren Versionen bekannt sein.)
8) Aber da geh ich zufuß durch, wird schon klappen. DANKEDANKE

tempuss
Beiträge: 5
Registriert: Mo 27. Jan 2014, 19:34

Re: Maus Cursor setzen!?

Beitrag von tempuss »

Hab mich eben von Lazarus distanziert. Es macht doch einige Probleme- bei mir jedenfalls.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Maus Cursor setzen!?

Beitrag von Mathias »

Leider nimmt Delphi den Befehl MAX nicht an(bin gerade auf Delphi 3 angewiesen- der Befehl MaX wird erst den späteren Versionen bekannt sein.)

Wen es nur wegen dem ist, Max ist nichts besonderes.

Code: Alles auswählen

function Max(a, b: Extended): Extended;inline;
begin
  if a > b then
    Result := a
  else
    Result := b;
end;


Hab mich eben von Lazarus distanziert. Es macht doch einige Probleme- bei mir jedenfalls.

Bei mir ist es umgekehrt, ich bin froh, das ich Delphi nicht mehr brauche.
Bis jetzt konnte ich alle meine Programme, welche ich noch brauche auf Lazarus portieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten