同步两个列表框的滚动条

use*_*068 3 delphi listbox scrollbar

我在Delphi 7中做了一个小项目,并且在表单上有2个列表框.现在我需要同步这些Listbox的滚动条.保证列表框具有相同数量的项目.当用户移动其中一个滚动条时,应进行同步.我想它应该是'Perform'方法,但我是新手.

Gra*_*ter 5

设置您使用的列表框的第一行TopIndex.

你可以创建一个TListbox处理WM_VSCROLL(WM_HSCROLL如果你想)的后代.然后,您可以挂钩并更新第二个列表框.这是一个例子.我只是单向做钩子所以滚动listbox2不会滚动listbox1.

在表单声明之前,您需要将此TListBox覆盖添加到您的单元:

TListBox = class(Vcl.StdCtrls.TListBox)
private
  FOnScroll: TNotifyEvent;
protected
  procedure ListBoxScroll(var Message: TMessage); message WM_VSCROLL;
public
  property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;
end;
Run Code Online (Sandbox Code Playgroud)

这会将OnScroll事件添加到列表框中.这个类的实现:

procedure TListBox.ListBoxScroll(var Message: TMessage);
begin
  inherited;
  if Assigned(FOnScroll) then
    FOnScroll(Self);
end;
Run Code Online (Sandbox Code Playgroud)

然后,您可以在代码中连接事件:

procedure TMyForm.FormCreate(Sender: TObject);
begin
  listbox1.OnScroll := DoScrollListBox1;
end;
Run Code Online (Sandbox Code Playgroud)

DoScrollListBox1的代码非常简单:

procedure TMyForm.DoScrollListBox1(Sender: TObject);
begin
  listbox2.TopIndex := listbox1.TopIndex;
end;
Run Code Online (Sandbox Code Playgroud)

这使用滚动条处理滚动.您还需要将以下行添加到列表框的OnClick中,以便键盘操作也会触发滚动.

procedure TMyForm.ListBox1Click(Sender: TObject);
begin
  ...
  listbox2.TopIndex := listbox1.TopIndex;
  ...
end;
Run Code Online (Sandbox Code Playgroud)