OnColumnDragged
のイベントはTListView
単純なTNotifyEvent
タイプであるため、どの列が実際に新しい位置にドラッグされたかを直接見つける方法はありません。
ドラッグされた列を見つけるにはどうすればよいですか?
挿入されたクラスの助けを借りて、メッセージ ハンドラーHDN_ENDDRAG
で通知コードをキャッチできます。WM_NOTIFY
HDN_ENDDRAG
通知は、ドラッグされていたヘッダー項目に関する情報を含む構造体をlParam
パラメーターで返します。NMHEADER
コード サンプルは次のとおりです。commented version
投稿のフォローもできます:
uses
ComCtrls, CommCtrl;
type
TListView = class(ComCtrls.TListView)
private
procedure WMNotify(var AMessage: TWMNotify); message WM_NOTIFY;
end;
implementation
{ TListView }
procedure TListView.WMNotify(var AMessage: TWMNotify);
var
HeaderHandle: HWND;
begin
inherited;
if (AMessage.NMHdr^.code = HDN_ENDDRAG) then
begin
HeaderHandle := ListView_GetHeader(Handle);
if (AMessage.NMHdr^.hWndFrom = HeaderHandle) then
ShowMessage(
'The header with index ' +
IntToStr(TWMNotifyHC(AMessage).HDNotify^.Item) + ' ' +
'has been dragged to the position with index ' +
IntToStr(TWMNotifyHC(AMessage).HDNotify^.PItem^.iOrder) + '. ' +
'Columns are not updated yet!');
end;
end;
どの列が移動されたかはわかりません。リストビューのリスト内のアイテムは、リストビューColumns
内の列の新しい順序に一致するように再配置されます。リスト内の列の位置を使用せずに、各列を一意に識別できる限り、列の順序を推測できます。
Tag
考えられるアプローチの1つは、各列に異なる値を与えることです。次に、次のようなことを行うことができます。
procedure TForm1.ListView1ColumnDragged(Sender: TObject);
var
i: Integer;
s: string;
begin
s := '';
for i := 0 to ListView1.Columns.Count-1 do begin
s := s + IntToStr(ListView1.Columns[i].Tag) + ' ';
end;
Caption := Trim(s);
end;
当然、これよりももっと便利なことをしたいと思うでしょうが、それがアイデアを広めると信じています。