ListView MousUp

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.

ListView MousUp

Beitragvon Mathias » 18. Dez 2014, 18:22 ListView MousUp

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 18. Dez 2014, 19:07 Re: ListView MousUp

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.
theo
 
Beiträge: 8196
Registriert: 11. Sep 2006, 18:01

Beitragvon Komoluna » 18. Dez 2014, 19:28 Re: ListView MousUp

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.
Komoluna
 
Beiträge: 565
Registriert: 26. Aug 2012, 08:03
OS, Lazarus, FPC: Windows(10), Linux(Arch) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 18. Dez 2014, 19:39 Re: ListView MousUp

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:
theo
 
Beiträge: 8196
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 18. Dez 2014, 19:47 Re: ListView MousUp

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 18. Dez 2014, 20:15 Re: ListView MousUp

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


Was ist denn deine Muttersprache?
theo
 
Beiträge: 8196
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 18. Dez 2014, 20:23 Re: ListView MousUp

Schweizerdeutsch
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 18. Dez 2014, 20:36 Re: ListView MousUp

Mathias hat geschrieben:Schweizerdeutsch


Na und? Meine auch. Aber wir lernen ja nicht schweizerdeutsch schreiben in der Schule.
Hast du keine bessere Ausrede? :wink:
theo
 
Beiträge: 8196
Registriert: 11. Sep 2006, 18:01

Beitragvon Michl » 18. Dez 2014, 22:10 Re: ListView MousUp

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 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; 
Michl
 
Beiträge: 2325
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Mathias » 18. Dez 2014, 22:28 Re: ListView MousUp

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 18. Dez 2014, 22:44 Re: ListView MousUp

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; 
Michl
 
Beiträge: 2325
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

Beitragvon Mathias » 18. Dez 2014, 23:14 Re: ListView MousUp

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 19. Dez 2014, 17:41, insgesamt 1-mal geändert.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon theo » 19. Dez 2014, 12:49 Re: ListView MousUp

Mathias hat geschrieben:Da währe ich froh.

Machst du das jetzt absichtlich? :wink:
theo
 
Beiträge: 8196
Registriert: 11. Sep 2006, 18:01

Beitragvon Mathias » 22. Jan 2016, 20:05 Re: ListView MousUp

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Michl » 22. Jan 2016, 23:02 Re: ListView MousUp

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; 
Michl
 
Beiträge: 2325
Registriert: 19. Jun 2012, 11:54
OS, Lazarus, FPC: Win7 Laz 1.7 Trunk FPC 3.1.1 Trunk | 
CPU-Target: 32Bit/64bit
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Lazarus - Bugs



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried