ListView MousUp

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

ListView MousUp

Beitrag von Mathias »

Ich habe folgenden Code:

Code: Alles auswählen

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: integer);
begin
  if Button = mbRight then begin
    Writeln('ListView');
  end;
end;
 
procedure TForm1.TreeView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: integer);
begin
  if Button = mbRight then begin
    Writeln('TreeView');
  end;
end;
 
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: integer);
begin
  if Button = mbRight then begin
    Writeln('Form');
  end;
end;


Bei Form und TreeView wird Writeln nur aufgerufen, wen man die Maustaste loslässt, dies währe richtig.
Aber bei ListView wird Writeln auch beim drücken der Maustaste aufgerufen.

Ist nachvollziehbar bei Version 1.2RC2 und 1.3, beide Windows

Unter Linux funktionieren alle 3 richtig.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView MousUp

Beitrag von theo »

Wenn es so ist wie du sagst (ich bin auf Linux) dann ist es wahrscheinlich ein Bug.

Aber mich stört etwas anderes: Die Verben "sein" und "haben" sind wichtigsten Verben in der deutschen Sprache.
"wäre" ist der Konjunktiv II von sein.
Warum wird dieses Wort dauernd mit "h" geschrieben?
Das ist wirklich schwach. Ist doch kein Fremdwort und wir sind doch nicht in Analphabeten Forum.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: ListView MousUp

Beitrag von Komoluna »

da hast du recht theo,
es währe ^^ wirklich besser, wenn man das nicht überall mit h lesen tun gehabt haben würde und sich das dann falsch angewöhnen tut...

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView MousUp

Beitrag von theo »

Komoluna hat geschrieben:da hast du recht theo,
es währe ^^ wirklich besser, wenn man das nicht überall mit h lesen tun gehabt haben würde und sich das dann falsch angewöhnen tut...


Danke Komoluna, so ist es. :wink:

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

Re: ListView MousUp

Beitrag von Mathias »

Wenn es so ist wie du sagst (ich bin auf Linux) dann ist es wahrscheinlich ein Bug.

Ich habe es noch rasch unter Delphi getestet, dort funktioniert auch.

Aber mich stört etwas anderes: Die Verben "sein" und "haben" sind wichtigsten Verben in der deutschen Sprache.
"wäre" ist der Konjunktiv II von sein.

Wen deine Muttersprache nicht Hochdeutsch wäre, hättest du vielleicht auch Mühe. ;)
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView MousUp

Beitrag von theo »

Mathias hat geschrieben:Wen deine Muttersprache nicht Hochdeutsch wäre, hättest du vielleicht auch Mühe. ;)


Was ist denn deine Muttersprache?

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

Re: ListView MousUp

Beitrag von Mathias »

Schweizerdeutsch
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView MousUp

Beitrag von theo »

Mathias hat geschrieben:Schweizerdeutsch


Na und? Meine auch. Aber wir lernen ja nicht schweizerdeutsch schreiben in der Schule.
Hast du keine bessere Ausrede? :wink:

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

Re: ListView MousUp

Beitrag von Michl »

So wie ich das lesen konnte, ist das unter Windows kein Bug sondern ein Feature:

Code: Alles auswählen

Win32WSCustomListView.inc
...
function ListViewParentMsgHandler(const AWinControl: TWinControl; Window: HWnd;
      Msg: UInt; WParam: Windows.WParam; LParam: Windows.LParam;
      var MsgResult: Windows.LResult; var WinProcess: Boolean): Boolean;
...
        NM_CLICK, NM_RCLICK:
        begin
          // A listview doesn't get a WM_LBUTTONUP, WM_RBUTTONUP message,
          // because it keeps the message in its own event loop,
          // see msdn article about "Default List-View Message Processing"
          // therefore we take this notification and create a
          // LM_LBUTTONUP, LM_RBUTTONUP message out of it
          WinProcess := False;
          if PNMHdr(LParam)^.code = NM_CLICK then
            Msg := LM_LBUTTONUP
          else
            Msg := LM_RBUTTONUP;
...

Edit: Wobei, wenn ich den besagten Teil auskommentiere, funktioniert es scheinbar wie gewünscht :?: :!: :

Code: Alles auswählen

function ListViewParentMsgHandler(const AWinControl: TWinControl; Window: HWnd;
      Msg: UInt; WParam: Windows.WParam; LParam: Windows.LParam;
      var MsgResult: Windows.LResult; var WinProcess: Boolean): Boolean;
 
...
 
var
  Pos: TSmallPoint;
begin
  Result := False;
  case Msg of
    WM_NOTIFY:
    begin
      case PNMHdr(LParam)^.code of
{        NM_CLICK, NM_RCLICK:
        begin
          // A listview doesn't get a WM_LBUTTONUP, WM_RBUTTONUP message,
          // because it keeps the message in its own event loop,
          // see msdn article about "Default List-View Message Processing"
          // therefore we take this notification and create a
          // LM_LBUTTONUP, LM_RBUTTONUP message out of it
          WinProcess := False;
          if PNMHdr(LParam)^.code = NM_CLICK then
            Msg := LM_LBUTTONUP
          else
            Msg := LM_RBUTTONUP;
          Pos := GetClientCursorPos(PNMHdr(LParam)^.hwndFrom);
          // to make correct event sequence in LCL we should postpone this message
          // since we are here after call of CallDefaultWindowProc
 
          // TODO: prevent getting more than one Up, Down message by LCL
          PostMessage(PNMHdr(LParam)^.hwndFrom, Msg, 0, MakeLParam(Pos.x, Pos.y));
          Result := True;
        end;}

        LVN_GETDISPINFOA, LVN_GETDISPINFOW:
          HandleListViewOwnerData(TCustomListViewAccess(AWinControl));
        NM_CUSTOMDRAW:
          HandleListViewCustomDraw(TCustomListViewAccess(AWinControl));
      end;
    end;
  end;
end;
Könntest ja mal testen, ob die ListView ohne dies trotzdem ihre Arbeit tut. Ich habe aktuell kein Projekt hier, um das ausgiebig zu testen...
Zuletzt geändert von Michl am Do 18. Dez 2014, 22:59, insgesamt 1-mal geändert.

Code: Alles auswählen

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

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

Re: ListView MousUp

Beitrag von Mathias »

So wie ich das lesen konnte, ist das unter Windows kein Bug sondern ein Feature:

Und für was sollte das Feature gut sein ?
Für etwas hat man das MouseDown Ereigniss.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: ListView MousUp

Beitrag von Michl »

Hast Du mal http://msdn.microsoft.com/en-us/library/windows/desktop/bb774734%28v=vs.85%29.aspx gelesen? Dort wird kein MouseUp-Event (WM_RBUTTONUP / WM_LBUTTONUP) bereitgestellt. K.A. von welcher Windows-Version dieser Eintrag stammt (habe aber jetzt auch nicht weiter recherchiert). Scheinbar wird WM_RBUTTONUP zumindest unter Win7 (bei mir und Dir) gefeuert. Könnte mir vorstellen, dass dieser Workaround aufgrund einer älteren Windows-Linux-Kompatibilät oder noch nicht verknüpfter Windows-Messages eingefügt wurde. Evtl. könnte dies entfernt werden, zumindest jedoch per IFDEF ausgeklammert. Du könntest dazu ja einen Bugeintrag/Patch machen, wenn Du nicht willst/kannst, kann ich das auch machen.

Code: Alles auswählen

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

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

Re: ListView MousUp

Beitrag von Mathias »

wenn Du nicht willst/kannst, kann ich das auch machen.

Da wäre ich froh.
Das Problem, ich kann sehr schlecht englisch, ich müsste alles mit Google übersetzen.
Zuletzt geändert von Mathias am Fr 19. Dez 2014, 17:41, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: ListView MousUp

Beitrag von theo »

Mathias hat geschrieben:Da währe ich froh.

Machst du das jetzt absichtlich? :wink:

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

Re: ListView MousUp

Beitrag von Mathias »

Ich habe mir das Programm nochmal angeguckt.

Wen ich die Exe des Project unter Linux mit Wine starte, dann läuft es wie gewünscht.
Starte ich aber die Exe unter WinXP, läuft in der VirtualBox, dann ist der Fehler immer noch feststellbar.
So wie es aussieht, ist das kein Problem von Lazarus, sondern von Windows.

Ich habe das Programm mit Lazarus 1.6, FPC 3.0 frisch kompiliert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: ListView MousUp

Beitrag von Michl »

Mathias hat geschrieben:So wie es aussieht, ist das kein Problem von Lazarus, sondern von Windows.
IMHO, ist das nur unzureichend implementiert. Dazu habe ich noch ein Bugreport offen, habe aber im Moment leider überhaupt nicht die Zeit dem im Detail auf den Grund zu gehen (steht aber noch auf der Todo).

Wenn du Resourcen hast, schau doch mal nach, Juha wartet noch auf einen gültigen Patch (das Klicken auf ein Item ist anders, als in einen freien Bereich).

Code: Alles auswählen

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

Antworten