Niechciany pasek scroll u dołu Listview

0

Mam taki problem, że jeśli dodam więcej danych niż jest w stanie pomieścić Listview podczas wyświetlania to pojawiają się paski scroll. Wszystko było by dobrze gdyby pojawił się tylko z prawej strony ale pojawia się także na samym dole pomimo tego że dane mieszczą się i nie ma potrzeby wyświetlać tego scrolla. Problemem jest to to że nowy scroll z prawej strony zabiera trochę miejsca listview przez co pojawia się niechciany scroll na dole.
Może znajdzie się ktoś kto zna rozwiązanie problemu.

Pozdrawiam i dziękuję za odpowiedź

2

Powiększ szerokość listview

2

Zamiast ListView, użyj VirtualTreeView, bardziej funkcjonalny i rozbudowany.

3

lub nadpisz windowproc dla ListView

 
  TTaskSwitch = class(TForm)
    Tasks: TcxListView;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  public
    TaskWndProc: TWndMethod;
    procedure TaskWindowProc(var Msg: TMessage);
  end;

procedure TTaskSwitch.FormCreate(Sender: TObject);
begin
  try
    TaskWndProc := Tasks.InnerListView.WindowProc;
    Tasks.InnerListView.WindowProc := TaskWindowProc;
  except
    on E: Exception do raise Exception.Create(
      'TTaskSwitch.FormCreate' + sLineBreak + E.Message);
  end;
end;

procedure TTaskSwitch.FormDestroy(Sender: TObject);
begin
  try
    Tasks.InnerListView.WindowProc := TaskWndProc;
    TaskWndProc := nil;
  except
    on E: Exception do raise Exception.Create(
      'TTaskSwitch.FormDestroy' + sLineBreak + E.Message);
  end;
end;

procedure TTaskSwitch.TaskWindowProc(var Msg: TMessage);
begin
  try
    TaskWndProc(Msg);
    try
      ShowScrollBar(Tasks.InnerListView.Handle, SB_HORZ, False);
      ShowScrollBar(Tasks.InnerListView.Handle, SB_VERT, False);
    except
    end;
  except
    on E: Exception do raise Exception.Create(
      'TTaskSwitch.TaskWindowProc' + sLineBreak + E.Message);
  end;
0

powiększenie listview nic nie daje. Nie mogę już zmienić na VirtualTreeView ale dzięki za radę przyda się na przyszłość. A 3 rozwiązanie nie jest jeszcze na moim poziomie wiedzy ale dzięki ;d

0

@VESPERUS - a myśląc o najprostszym - nie myślałeś o ustawieniu maksymalnych (ew. i minimalnych) długości poszczególnych kolumn? Dzięki temu użytkownik nie będzie miał możliwości ich tak porozciągać, żeby się nie mieściły w widocznych obszarze komponentu;

Plusem jest to, że nie będziesz musiał nic programować (wystarczą ustawienia w Object Inspector), ale minusem będzie oraniczenie możliwości rozciągania kolumn, bo każda z nich będzie musiała mieć określony maksymalny rozmiar; Może i takie rozwiązanie przypadku Ci do gustu.

2

Ponieważ zaproponowane przez @crowa rozwiązanie nie dotyczy standardowego TListView (trzeba trochę pozmieniać i z tym @VESPERUS sobie nie radzi) pozwolę sobie zaproponować nieco inne (także polegające na podmianie domyślnej procedury obsługi komunikatów TListView czyli subclassingu ale trochę inaczej inaczej):

type
  TListView = class(ComCtrls.TListView)
  public
    procedure WndProc(var Message: TMessage); override;
  end;
//-----
implementation

{$R *.dfm}

procedure TListView.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_SIZE then
    ShowScrollBar(Handle, SB_HORZ, False);
  inherited;
end;

Jak widać kodu trochę mniej i bez szalonego rozwiązania z ukrywaniem ScrollBara przy KAŻDYM komunikacie.

PS: Rozwiązanie będzie dobre jeżeli jest tylko jeden komponent TListView (lub wszystkie mają zachowywać się tak samo) ponieważ zastosowałem najprostszy sposób podmiany WndProc kontrolki ale w razie czego można w inny sposób podmienić procedurę tylko dla danego ListView i będzie działać.

EDIT: Jak coś to nic się nie zmieniło z wyjątkiem poprawy błędów w treści posta (nie w kodzie) było kilka literówek i 2 razy powtarzających się słów.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.