MouseUP und Shift

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

MouseUP und Shift

Beitrag von Mathias »

Wieso wird "WriteLn('up-shift');" nicht ausgeführt ?
Bei MouseDown geht es ohne Probleme.

Code: Alles auswählen

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
begin
  if ssLeft in Shift then begin
    WriteLn('up-shift'); // geht nicht
  end;
  WriteLn('up');
end;

procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then begin
    WriteLn('down-shift'); // geht
  end;
  WriteLn('down');
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: MouseUP und Shift

Beitrag von Winni »

Hi!

MouseDown und MouseUp haben ihre eigene Logik:

Welche Maustaste nun aktiv ist, hast Du ja bei MouseDown erfahren .
Nun muss es also diese sein, wenn MouseUp kommt.
Und in der Tat ist der Shiftstate leer, wenn die Maustaste hoch geht.
Egal ob links, mitte, rechts.

Was zu beweisen ist:

Code: Alles auswählen

procedure TForm1.Panel1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var SEnum:  TShiftStateEnum;
    se : string;
    s : string= '';
begin
for SEnum in Shift do
   begin
   writeStr(se,SEnum);
   s := s + se + ' ';
   end;
   s := 'Shift: ['+s+']' +LineEnding+'UP';
   showMessage (s);
end;
Tschüss
Winni

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

Re: MouseUP und Shift

Beitrag von Mathias »

Ich bin ein Schritt weiter gekommen, das MouseUp arbeitet korrekt. Man ist bis jetzt immer von einer gedrückten Taste ausgegangen.
Angenommen, linke und rechte Taste unten.
Man lässt die linke Taste los, dabei ist die rechte Taste immer noch unten, somit wird "Up Right" ausgegeben.

Code: Alles auswählen

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer);
begin
  if ssLeft in Shift then begin
    WriteLn('Left Down');
  end;
  if ssMiddle in Shift then begin
    WriteLn('Middle Down');
  end;
  if ssRight in Shift then begin
    WriteLn('Right Down');
  end;
end;
Zuletzt geändert von Mathias am Fr 25. Sep 2020, 16:29, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: MouseUP und Shift

Beitrag von Winni »

Mathias hat geschrieben:
Fr 25. Sep 2020, 15:18
.
Angenommen, linke und rechte Taste unten.
Man lässt die linke Taste los, dabei ist die rechte Taste immer noch unten, somit wird "Up Right" ausgegeben.

Hä???

die rechte Taste immer noch unten, somit wird "Up Right" ausgegeben.

Und was hat das mit Logik zu tun?

Ich würde ja mal sagen, Du bietest das als "Finger Yoga für Fortgeschrittene" an.
Oder Du kaufst Dir ne alte Apple-1-Tasten-Maus.

Die Logik der Maustasten hab ich oben beschrieben.

Winni

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

Re: MouseUP und Shift

Beitrag von Mathias »

die rechte Taste immer noch unten, somit wird "Up Right" ausgegeben.
Ups, habe es falsch geschrieben, sollte natürlich Down heissen, habe den Beitrag korrigierte.
Ich würde ja mal sagen, Du bietest das als "Finger Yoga für Fortgeschrittene" an.
Für eine Desktop-Anwendung kommt mir gerade auch kein Einsatz in Sinn.
Aber für ein Games sicher brauchbar.

Bei MouseMove kann man Shift auch auswerten.

Code: Alles auswählen

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then begin
    WriteLn('Left Down');
  end;
  if ssMiddle in Shift then begin
    WriteLn('Middle Down');
  end;
  if ssRight in Shift then begin
    WriteLn('Right Down');
  end;
end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: MouseUP und Shift

Beitrag von wp_xyz »

Ich finde, es wird klarer, wenn man auch den Button-Parameter mit anzeigt.

"Button" ist der Button, der seinen Zustand ändert, "Shift" enthält die (Sonder- und Maus-)Tasten, die gedrückt sind.

Wenn keine andere Maustaste gedrückt ist, wird beim Loslassen der gedrückten linken Maustaste "Button" zu "mbLeft", und "Shift" ist leer, weil beim Loslassen keine andere Taste mehr gedrückt ist.

Sind die linke und die rechte Maustaste gedrückt und die linke wird losgelassen ist "Button" = "mbLeft", und "Shift" enthält "ssRight", weil die rechte noch gedrückt ist.

Code: Alles auswählen

uses
  TypInfo;

{ TForm1 }

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Memo1.Lines.Add(Format('MOUSE UP: Button = %s, Shift = %s)', [
    GetEnumName(TypeInfo(TMouseButton), Integer(Button)),
    SetToString(PTypeInfo(TypeInfo(TShiftState)), Integer(Shift), true)
  ]));
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Memo1.Lines.Add(Format('MOUSE DOWN: Button = %s, Shift = %s)', [
    GetEnumName(TypeInfo(TMouseButton), Integer(Button)),
    SetToString(PTypeInfo(TypeInfo(TShiftState)), Integer(Shift), true)
  ]));
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Memo1.Lines.Add(Format('MOUSE MOVE: Shift = %s)', [
    SetToString(PTypeInfo(TypeInfo(TShiftState)), Integer(Shift), true)
  ]));
end;  
OnMouseMove enthält keinen Parameter "Button", weil kein Button seinen Zustand ändert.

Antworten