delphi - 同步两个列表框的滚动条

标签 delphi listbox scrollbar

我正在 Delphi 7 中制作一个小项目,并且表单上有 2 个列表框。现在我需要同步这些列表框的滚动条。列表框保证具有相同数量的项目。当用户移动滚动条之一时应进行同步。我想它应该是“执行”方法的东西,但我对它很陌生。

最佳答案

要设置列表框的顶行,请使用TopIndex

您可以创建一个 TListbox 后代来处理 WM_VSCROLL(如果需要,还可以处理 WM_HSCROLL)。然后您可以连接到此并更新第二个列表框。这是一个例子。我只以一种方式进行 Hook ,因此滚动 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;

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

procedure TListBox.ListBoxScroll(var Message: TMessage);
begin
  inherited;
  if Assigned(FOnScroll) then
    FOnScroll(Self);
end;

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

procedure TMyForm.FormCreate(Sender: TObject);
begin
  listbox1.OnScroll := DoScrollListBox1;
end;

DoScrollListBox1 的代码非常简单:

procedure TMyForm.DoScrollListBox1(Sender: TObject);
begin
  listbox2.TopIndex := listbox1.TopIndex;
end;

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

procedure TMyForm.ListBox1Click(Sender: TObject);
begin
  ...
  listbox2.TopIndex := listbox1.TopIndex;
  ...
end;

关于delphi - 同步两个列表框的滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195857/

相关文章:

Python tkinter 仅修改具有焦点的列表框

c# - 向用户控件添加滚动条

html - 当聚焦于 overflow hidden 的容器内的元素时自动滚动

sqlite - Delphi SqLite 日期加载到 TDateEdit 错误

delphi - 实现可变长度数组的最佳方法是什么?

wcf - Delphi 客户端使用的 WCF 中生成的 WSDL

vb.net - 从数据表中获取值(value)

c# - 枢轴页面部分的垂直滚动

CSS 滚动条问题

sql-server - 将参数传递给 TADOStoredProc 的更好方法 (Delphi)