Niechciany pasek scroll u dołu Listview

Niechciany pasek scroll u dołu Listview
VE
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:11
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ź

babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Łódź
  • Postów:648
2

Powiększ szerokość listview

Młody
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 10 lat
  • Postów:418
2

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

crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
3

lub nadpisz windowproc dla ListView

Kopiuj
 
  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;

Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
flowCRANE
Brzmi nietypowo i najlepiej odpowiada na pytanie - +1
VE
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:11
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

flowCRANE
Ale trzecie rozwiązanie masz gotowe - wystarczy przepisać do swojej aplikacji i tyle :)
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12171
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.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:2 minuty
  • Lokalizacja:Gorlice
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):

Kopiuj
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.


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 2x, ostatnio: olesio
olesio
Poprawiłem jeszcze double "przy", ale rozwązanie dobre. I chyba jednocześnie najlepsze oraz najprostsze.
flowCRANE
No i robi to, co trzeba; Wyłącza pasek przesuwu bez przestawiania innych rzeczy, tak że najlepsze rozwiązanie; Nie ma to jak stary dobry subclassing :)

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.