2

OnColumnDraggedのイベントはTListView単純なTNotifyEventタイプであるため、どの列が実際に新しい位置にドラッグされたかを直接見つける方法はありません。

ドラッグされた列を見つけるにはどうすればよいですか?

4

2 に答える 2

2

挿入されたクラスの助けを借りて、メッセージ ハンドラー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;
于 2012-08-02T10:51:50.587 に答える
1

どの列が移動されたかはわかりません。リストビューのリスト内のアイテムは、リストビュー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;

当然、これよりももっと便利なことをしたいと思うでしょうが、それがアイデアを広めると信じています。

于 2012-08-02T10:34:41.477 に答える