カラムドラッグ後のOnColumnClickイベントについて

解決


へろへろ  2001-10-18 19:22:08  No: 219  IP: [192.*.*.*]

リストビューのFullDragプロパティを有効にしカラムの移動をし
カラムをクリックしてOnColumnClickイベントを発生させ
て返されるColumnがどうも違うものが帰ってくるのですが、どうしてでしょう

編集 削除
にしの  2001-10-21 13:05:31  No: 220  IP: [192.*.*.*]

確かにずれてしまうようです。
そこで、いろいろ試してみました。
TListViewの、CN_NOTIFYメッセージに、LVN_COLUMNCLICKが飛んできます。
このときの、iSubItemの値は正常でした。
フォームにボタンを貼り付け、Column[Index].Captionの中身も正常でした。
なぜか、LVN_COLUMNCLICKの処理中、Column[PNMListView(NMHdr)^.iSubItem]の値がおかしくなっています。
# おかしくといっても、きちんとした規則で

LVN_COLUMNCLICKを処理しているところで、iSubItemを返すようなイベントを埋め込めば、正常に処理できるようになります。
# ただし、イベントでColumn[Index]を使うとずれます。

たとえば、TListViewを派生(例ではTTestListView)させ、クラス定義の前に
TColumnClickEvent2 = procedure(Sender: TObject; Index: Integer) of object;
を用意。
Privateな変数に、
  FOnColumnClick2: TColumnClickEvent2;
を用意。

Proctectedなプロシージャを用意。
  procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
  procedure ColClick2(Index: Integer);

publishedなプロパティ(イベント)を用意。
  property OnColumnClick2: TColumnClickEvent2 read FOnColumnClick2 write FOnColumnClick2;


プロシージャの中身は次のようになります。
procedure TTestListView.CNNotify(var Message: TWMNotify);
var
  iSubItem: Integer;
begin
  with Message do
    case NMHdr^.code of
      LVN_COLUMNCLICK:
      begin
        iSubItem := PNMListView(NMHdr)^.iSubItem;
        ColClick2(iSubItem);
      end;
      else inherited;
    end;
end;

procedure TTestListView.ColClick2(Index: Integer);
begin
  if Assigned(OnColumnClick2) then OnColumnClick2(Self, Index);
end;

これで、OnColumnClick2イベントができるので、この中で、

procedure TForm1.ColumnClick2(Sender: TObject; Index: Integer);
var
  col: TLVColumn;
  buf: array[0..255] of Char;
begin
  if ListView_GetColumn(
    TestListView.Handle,
    Index,
    col
  ) then
  begin
    ShowMessage(
      String(buf)
    );
  end;
end;

とすれば、クリックした位置のキャプションが帰ってきます。

編集 削除
へろへろ  2001-10-22 11:13:05  No: 221  IP: [192.*.*.*]

返事が遅くなって大変申し訳ありません
いろいろと調査して頂きありがとうございます
教えて頂いた通りに派生クラスを用意して試してみたのですが
TForm1.ColumnClick2にて実行しているShowMessage(String(buf))の
bufの中身は何をいれればよいのか教えていただけないでしょうか?
よろしくお願いいたします

編集 削除
にしの  2001-10-22 12:20:16  No: 222  IP: [192.*.*.*]

申し訳ない、少し抜けていたようです。

ColumnClick2の処理の、ifの前にcolの値を設定してください。

col: TLVColumn;
  buf: array[0..255] of Char;
begin
  col.mask := LVCF_TEXT;
  col.pszText := buf;
  col.cchTextMax := 255;
  if ListView_GetColumn(
    TestListView.Handle,
    Index,
    col
  ) then
  begin
    ShowMessage(
      String(buf)
    );
.....

となります。
col.maskの値に、LVCF_FMTを入れれば、col.fmtにAlignの情報が入り、LVCF_WIDTHを入れれば、col.cxにWidthが入ります。
ListView_GetColumnは、成功すればtrueを返します。

編集 削除
へろへろ  2001-10-22 13:20:40  No: 223  IP: [192.*.*.*]

本当にありがとうございます
これで前に進む事ができます

編集 削除