リストビューのFullDragプロパティを有効にしカラムの移動をし
カラムをクリックしてOnColumnClickイベントを発生させ
て返されるColumnがどうも違うものが帰ってくるのですが、どうしてでしょう
確かにずれてしまうようです。
そこで、いろいろ試してみました。
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;
とすれば、クリックした位置のキャプションが帰ってきます。
返事が遅くなって大変申し訳ありません
いろいろと調査して頂きありがとうございます
教えて頂いた通りに派生クラスを用意して試してみたのですが
TForm1.ColumnClick2にて実行しているShowMessage(String(buf))の
bufの中身は何をいれればよいのか教えていただけないでしょうか?
よろしくお願いいたします
申し訳ない、少し抜けていたようです。
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を返します。
本当にありがとうございます
これで前に進む事ができます
ツイート | ![]() |