Announcement

Collapse
No announcement yet.

TListView Win7 Scrollbar defekt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TListView Win7 Scrollbar defekt

    Hallo

    unter Windows 7 kann die Scrollbar bei einem TListView nur bedingt mittels Maus bedient werden (siehe auch beigefügte Grafik).

    Die Einstellungen des TListview sind

    Code:
      //Mehrspaltige Liste
      ViewStyle := vsReport;
      //Gitterlinien anzeigen
      GridLines := True;
      //Tabelle kann vom Anwender nicht über direkte Eingabe geändert werden
      ReadOnly  := True;
      //Es werden komplette Zeilen markiert.
      RowSelect := True;
    Das gleiche Programm unter XP funktioniert. Ich programmier mit Delphi 2010.

    Hat jemand einen Workaround parat. Über eine Antwort würde ich mich sehr freuen.

    Danke Uwe
    Attached Files

  • #2
    Kannst du das nochmal näher erklären? Dein Bild hilft zumindest mir nicht das Problem jetzt genau zu verstehen. In Windows7 ist es normal das die Scrollbar Buttons deaktiviert aussehen. Die werden erst aktiv gezeichnet wenn man über der Scrollbar hovert. Und mehr als diesen ~normal~ Zustand kann ich dem Bild nicht entnehmen.

    Comment


    • #3
      Click auf "Dreieck-Icon der Scollbar"

      Hallo Ralf,

      beim Click auf das "Dreieck-Icon" der Scrollbar sollte sich die Scrollbar-Balken bewegen - macht er aber nicht. Der direkte zugriff auf den Scrollbar-Balken mittels Maus funktioniert, er kann mit der Maus bewegt werden.

      Gruß Uwe

      Comment


      • #4
        Scrollbar ausgeblendet

        Hallo,

        haben nun den Fehler gefunden und behoben. Die horizontale Scrollbar war wie im Beitrag: Gast vom 18.07.2001, 09:50 beschreiben ausgeblendet. Siehe dortigen Quelltext in Methode:

        Code:
        procedure WMNCCalcSize(Var msg : TMessage); message WM_NCCALCSIZE;
        Seit Vista klickt der Anwender nun auf die ausgeblendete Scrollbar, daher reagiert die unvollständige, vertikale Scrollbar nicht.

        Eine Lösung habe ich über das Internet auf Seite
        http://www.experts-exchange.com/Prog..._20133835.html
        gefunden.

        Hier die Anpassung meiner Komponente zum Ausblenden der Scrollbar:

        Code:
        interface
        
        uses
          Classes, Controls, Messages, ComCtrls, Windows;
        
        type
          TMeinTabelle=class(TListView)
          public
            constructor Create(AOwner: TComponent); override;
            destructor  Destroy; override;
          private
            FbVertScroll,
            FbHorzScroll: boolean;
            FWndProcOrg : TWndMethod;
            procedure WndProcNeu(var Msg: TMessage);
            procedure ScrollBarAktualisierung;
            procedure SetbHorzScroll(const Value: boolean);
            procedure SetbVertScroll(const Value: boolean);
          protected
            procedure CreateParams(var Params: TCreateParams); override;
          published
            property bVerScroll: boolean  read FbVertScroll write SetbVertScroll;
            property bHorzScroll: boolean read FbHorzScroll write SetbHorzScroll;
          end;
        
        
        implementation
        
        { TMeinTabelle }
        
        constructor TMeinTabelle.Create(AOwner: TComponent);
        begin
          inherited;
        
          FbVertScroll  := True;
          FbHorzScroll  := False;
        
          //Mehrspaltige Liste
          ViewStyle := vsReport;
          //Gitterlinien anzeigen
          GridLines := True;
          //Tabelle kann vom Anwender nicht über direkte Eingabe geändert werden
          ReadOnly  := True;
          //Es werden komplette Zeilen markiert.
          RowSelect := True;
        end;
        
        procedure TMeinTabelle.CreateParams(var Params: TCreateParams);
        begin
          inherited;
        
          if not Assigned(FWndProcOrg) then
          begin
            FWndProcOrg := WindowProc;  //Sichere Original-WindowProc
            WindowProc  := WndProcNeu;  //Zuweisung der neuen Procedur
          end;
        end;
        
        destructor TMeinTabelle.Destroy;
        begin
          if Assigned(FWndProcOrg) then
            WindowProc  := FWndProcOrg; // Zuweisung der Original-WindowProc
          FWndProcOrg := Nil;
        
          inherited;
        end;
        
        procedure TMeinTabelle.ScrollBarAktualisierung;
        var
          LiStyle: LongInt;
        begin
          if not (csReading in ComponentState) then
          begin
            LiStyle := GetWindowLong(handle, GWL_STYLE);
        
            if bHorzScroll <> (LiStyle and WS_HSCROLL = WS_HSCROLL) then
               ShowScrollBar(Handle, SB_HORZ, bHorzScroll);
        
            if bVerScroll <> (LiStyle and WS_VSCROLL = WS_VSCROLL) then
              ShowScrollBar(Handle, SB_VERT, bHorzScroll);
          end;
        end;
        
        procedure TMeinTabelle.SetbHorzScroll(const Value: boolean);
        begin
          FbHorzScroll := Value;
          ScrollBarAktualisierung;
        end;
        
        procedure TMeinTabelle.SetbVertScroll(const Value: boolean);
        begin
          FbVertScroll := Value;
          ScrollBarAktualisierung;
        end;
        
        procedure TMeinTabelle.WndProcNeu(var Msg: TMessage);
        begin
          ScrollBarAktualisierung;
          FWndProcOrg(Msg); // Orignal aufrufen
        end;

        Comment

        Working...
        X