将 5 个 ListBoxes 同步在一起
Synchronize 5 ListBoxes together
我现在正在做一个小项目,我想同步一起滚动的 5 个列表框。列表框的名称是:
KidList
PointList
NoteList
CommentList
CommentListKid
我该怎么做?
您可以尝试以下技巧。
首先,添加一个私有字段
private
SyncBoxes: TArray<TListBox>;
到您的表单并在创建表单时对其进行初始化:
procedure TForm1.FormCreate(Sender: TObject);
begin
SyncBoxes := [ListBox1, ListBox2, ListBox3, ListBox4];
end;
然后定义如下插入器class:
type
TListBox = class(Vcl.StdCtrls.TListBox)
strict private
procedure Sync;
protected
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
end;
实现为
procedure TListBox.CNCommand(var Message: TWMCommand);
begin
inherited;
if Message.NotifyCode = LBN_SELCHANGE then
Sync;
end;
procedure TListBox.Sync;
var
LB: TListBox;
begin
for LB in Form1.SyncBoxes do
if LB <> Self then
LB.TopIndex := Self.TopIndex;
end;
procedure TListBox.WMMouseWheel(var Message: TWMMouseWheel);
begin
inherited;
Sync;
end;
procedure TListBox.WMVScroll(var Message: TWMVScroll);
begin
inherited;
Sync;
end;
当然,在真正的应用程序中,您会对此进行重构。
结果可能还不错:
然而,列表框的滚动动画使同步有点延迟。
我现在正在做一个小项目,我想同步一起滚动的 5 个列表框。列表框的名称是:
KidList
PointList
NoteList
CommentList
CommentListKid
我该怎么做?
您可以尝试以下技巧。
首先,添加一个私有字段
private
SyncBoxes: TArray<TListBox>;
到您的表单并在创建表单时对其进行初始化:
procedure TForm1.FormCreate(Sender: TObject);
begin
SyncBoxes := [ListBox1, ListBox2, ListBox3, ListBox4];
end;
然后定义如下插入器class:
type
TListBox = class(Vcl.StdCtrls.TListBox)
strict private
procedure Sync;
protected
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
end;
实现为
procedure TListBox.CNCommand(var Message: TWMCommand);
begin
inherited;
if Message.NotifyCode = LBN_SELCHANGE then
Sync;
end;
procedure TListBox.Sync;
var
LB: TListBox;
begin
for LB in Form1.SyncBoxes do
if LB <> Self then
LB.TopIndex := Self.TopIndex;
end;
procedure TListBox.WMMouseWheel(var Message: TWMMouseWheel);
begin
inherited;
Sync;
end;
procedure TListBox.WMVScroll(var Message: TWMVScroll);
begin
inherited;
Sync;
end;
当然,在真正的应用程序中,您会对此进行重构。
结果可能还不错:
然而,列表框的滚动动画使同步有点延迟。