Delphi XE4如何实现TListGroups间项目切换的详细长尾?

2026-04-10 03:111阅读0评论SEO资讯
  • 内容介绍
  • 相关推荐

本文共计385个文字,预计阅读时间需要2分钟。

Delphi XE4如何实现TListGroups间项目切换的详细长尾?

我已经使用Delphi XE4一周了,刚刚发现了新的TListGroups功能。非常方便地将TListItem的GroupID设置为在组间切换/移动。现在,我想有一个程序,只要TListItem离开一个组,或者一个TListItem进入一个组就执行操作。

Delphi XE4如何实现TListGroups间项目切换的详细长尾?

我已经使用Delphi XE4一周了,我刚刚发现了新的TListGroups功能.很容易将TlistItem的GroupID设置为在组之间切换/移动.现在,我想有一个程序,只要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;

本文共计385个文字,预计阅读时间需要2分钟。

Delphi XE4如何实现TListGroups间项目切换的详细长尾?

我已经使用Delphi XE4一周了,刚刚发现了新的TListGroups功能。非常方便地将TListItem的GroupID设置为在组间切换/移动。现在,我想有一个程序,只要TListItem离开一个组,或者一个TListItem进入一个组就执行操作。

Delphi XE4如何实现TListGroups间项目切换的详细长尾?

我已经使用Delphi XE4一周了,我刚刚发现了新的TListGroups功能.很容易将TlistItem的GroupID设置为在组之间切换/移动.现在,我想有一个程序,只要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;