gpt4 book ai didi

Delphi XE4 检测 TListGroup 之间的项目切换

转载 作者:行者123 更新时间:2023-12-03 15:29:05 24 4
gpt4 key购买 nike

我已经使用 Delphi XE4 一周了,我刚刚发现了新的 TListGroups 功能。可以轻松设置 TlistItemGroupID 以便轻松在组之间切换/移动。现在,我想要一个在 TListItem 离开组和/或在 TlistItem 进入组时立即调用的过程。我正在寻找这样的东西:

procedure TForm1.ListView1On(Before/After)ListGroupEnter(Sender: TObject; Item: TListItem);
begin
// Do some stuff here like...
// AllowedToDraw := TRUE/FALSE
// I/O Code...
// etc...
end;

procedure TForm1.ListView1On(Before/After)ListGroupLeave(Sender: TObject; Item: TListItem);
begin
// Do some stuff here like...
// This might be replaceable with OnDeletion...
// I/O Code...
end;

这里的主要问题是如果设置了GroupID属性,则检测不同组之间的切换。那么,一旦更改/设置 GroupID 属性,是否有什么方法可以检测到开关呢?

最佳答案

TListItem.GroupID 属性 setter 将 LVM_SETITEM 消息发送到 TListView 的 HWND。您可以子类化 TListView 并在 TListView 处理该消息之前拦截该消息,例如:

const
APPWM_LISTVIEW_CHECKGROUP = WM_APP + 100;

var
PrevLVWndProc: TWndMethod = nil;

procedure TForm1.FormCreate(Sender: TObject);
begin
PrevLVWndProc := ListView1.WindowProc;
ListView1.WindowProc := LVWndProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ListView1.WindowProc := PrevLVWndProc;
end;

procedure TForm1.LVWndProc(var Message: TMessage);
var
LVItem: PLVItem;
ListItem: TListItem;
begin
case Message.Msg of
LVM_SETITEM:
begin
LVItem := PLVItem(Message.LParam);
if (LVItem^.mask and LVIF_GROUPID) <> 0 then
begin
ListItem := ListView1.Items[LVItem.iItem];

if ListItem.GroupID <> LVItem.iGroupID then
begin
if ListItem.GroupID >= 0 then
ListView1GroupLeave(ListView1, ListItem);

PrevLVWndProc(Message);

// this gives the TListItem time to actually update itself
PostMessage(ListView1.Handle, APPWM_LISTVIEW_CHECKGROUP, 0, LVItem.iItem);

Exit;
end;
end;
end;
APPWM_LISTVIEW_CHECKGROUP:
begin
ListItem := ListView1.Items[Message.LParam];
if ListItem.GroupID >= 0 then
ListView1GroupEnter(ListView1, ListItem);
Exit;
end;
end;

PrevLVWndProc(Message);
end;

procedure TForm1.ListView1GroupLeave(Sender: TObject; Item: TListItem);
begin
// Item is about to leave from its current GroupID ...
end;

procedure TForm1.ListView1GroupEnter(Sender: TObject; Item: TListItem);
begin
// Item has entered into its current GroupID ...
end;

关于Delphi XE4 检测 TListGroup 之间的项目切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16563169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com