OnMouseUp unter Windows und Linux

Rund um die LCL und andere Komponenten
Antworten
MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

OnMouseUp unter Windows und Linux

Beitrag von MmVisual »

Lazarus ist nicht gleich Lazarus, so durfte ich feststellen. Unter Linux werden die Events anders aufgerufen als unter Windows.

Das betrifft das Mouse-Event
OnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Unter Windows ist bei Klick mit der rechten Maustaste das:
Button = mbRight
Shift = []

Unter Linux ist bei Klick mit der rechten Maustaste das:
Button = mbRight
Shift = [ssRight]

Wiso erhalte ich unter Linux was anderes als unter Windows?

Gruß Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: OnMouseUp unter Windows und Linux

Beitrag von corpsman »

Da ich kein Windows habe kann ich es nicht testen...

Aber sollte dem wirklich so sein, würde ich dieses Verhalten als Bug einstufen, da könntest du einen entsprechenden Report schreiben.
--
Just try it

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6837
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: OnMouseUp unter Windows und Linux

Beitrag von af0815 »

Hast du ein kleines Beispielprogramm ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OnMouseUp unter Windows und Linux

Beitrag von carli »

MmVisual hat geschrieben: Das betrifft das Mouse-Event
OnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

Unter Windows ist bei Klick mit der rechten Maustaste das:
Button = mbRight
Shift = []

Unter Linux ist bei Klick mit der rechten Maustaste das:
Button = mbRight
Shift = [ssRight]

Wiso erhalte ich unter Linux was anderes als unter Windows?

Gruß Markus
Aus dem Grund sollte man [ssShift, ssCtrl, ssAlt]*Shift gegen [] prüfen und nicht Shift.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: OnMouseUp unter Windows und Linux

Beitrag von MmVisual »

Hier ein Beispiel, mein gesamter Code hat etwa 20000 Zeilen.

Code: Alles auswählen

procedure TfrmMain.grdMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var i: Integer;
  it: TMenuItem;
  q: TDataSet;
  p: TPoint;
begin
  stBar.Panels[1].Text := 'grdMouseUp'; // Debug-Ausgabe damit ich wusste warum/wann der unter Linux ein Exit macht
  If Not (Sender Is TDBGrid) Then Exit;
  stBar.Panels[1].Text := 'grdMouseUp1';
  If Not (Button = mbRight) Then Exit;
  stBar.Panels[1].Text := 'grdMouseUp2';
  If (Not (Shift = [])) And (Not (Shift = [ssRight])) Then Exit; // Doppelte Shift-Abfrage wegen Linux/Windows
  stBar.Panels[1].Text := 'grdMouseUp3';
  If Not Assigned(TDBGrid(Sender).DataSource) Then Exit;
  stBar.Panels[1].Text := 'grdMouseUp4';
  q := TDBGrid(Sender).DataSource.DataSet;
  If Not Assigned(q) Then Exit;
  stBar.Panels[1].Text := 'grdMouseUp5';
  If Not q.Active Then Exit;
  stBar.Panels[1].Text := 'grdMouseUp6';
  If q.Fields.Count <= 0 Then Exit;
  stBar.Panels[1].Text := 'grdMouseUp7';
  If Not (grdBauteil.MouseToGridZone(X, Y) = gzFixedCols) Then Exit;
  stBar.Panels[1].Text := 'grdMouseUp8';
  ErrMessagesAdd('grdMouseUp');
  // Rechtsklick auf Titelleiste
  popTbl.Items.Clear;
  For i := 0 To q.Fields.Count - 1 Do
  Begin
    it := TMenuItem.Create(Self);
    it.Caption := q.Fields[i].DisplayLabel;
    it.Checked := q.Fields[i].Visible;
    it.Tag := Integer(q.Fields[i]);
    it.OnClick := @mnTbl;
    popTbl.Items.Add(it);
  end;
  p.x := X;
  p.Y := Y;
  p := TDBGrid(Sender).ClientToScreen(p);
  popTbl.PopUp(p.x, p.y);
  ErrMessagesRemove();
end;
(Bei einem TSpeedButton ist es das gleiche.)

>> Aus dem Grund sollte man [ssShift, ssCtrl, ssAlt]*Shift gegen [] prüfen und nicht Shift.
Wiso soll ich etwas multiplizieren?
EleLa - Elektronik Lagerverwaltung - www.elela.de

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: OnMouseUp unter Windows und Linux

Beitrag von Socke »

MmVisual hat geschrieben:>> Aus dem Grund sollte man [ssShift, ssCtrl, ssAlt]*Shift gegen [] prüfen und nicht Shift.
Wiso soll ich etwas multiplizieren?
Hast du schon einmal Zeichenketten addiert? Man kann sie aneinanderhängen, daher ist 'a'+'b' auch ein anderer Operator als 1+2.
http://www.freepascal.org/docs-html/ref ... 180009.8.5
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: OnMouseUp unter Windows und Linux

Beitrag von MmVisual »

Wieder was gelernt :wink:

Dann könnte ich es so machen:

Code: Alles auswählen

If Not ((Shift >< [ssRight]) = []) Then Exit;
EleLa - Elektronik Lagerverwaltung - www.elela.de

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OnMouseUp unter Windows und Linux

Beitrag von carli »

MmVisual hat geschrieben:Wieder was gelernt :wink:

Dann könnte ich es so machen:

Code: Alles auswählen

If Not ((Shift >< [ssRight]) = []) Then Exit;
Solange keine weiteren Modifier dazukommen (num lock wird z.B. auch betrachtet)

das mit dem * ist schon die genauere Version, da du damit den Zustand von allen Modifiern vergleichst, die du betrachtest

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: OnMouseUp unter Windows und Linux

Beitrag von MmVisual »

Ja, stimmt. Mein Vorschlag geht nicht, denn wenn in Shift kein ssRight drin ist, dann wird da eines rein gemacht.

Es muss so aussehen:

Code: Alles auswählen

If Not ((Shift - [ssRight]) = []) Then Exit;
ssNum und ssCaps sind nicht in Shift enthalten, auch nicht wenn diese gedrückt sind.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten