何度も取り沙汰されている件なので恐縮ですが、
WindowsXPなどのエクスプローラーの詳細表示状態で、列項目名の部分を
右クリックする事で項目の表示/非表示を制御できますが、
これと似たような事は TListView で実現する事はできるのでしょうか?
過去記事にはWidthを0にするなどありましたが、他に方法があれば
ご教授ください。
宜しくお願いします。
TListViewとTListItemから派生。
1. TListItemEx.SubItemsとCaptionを統合したメソッドを用意。
(あとで混乱するから。Column.Indexベースでアクセスできるようにする)
例
TListItemEx.GridText[0] =Caption,
TListItemEx.GridText[1] =SubItems[1]な具合。
2.カラムの情報を管理するクラスを別に作成
TColumnInfo = class
public
properety DefColIdx: integer; read FDefColIdx;
property Visible: boolean read FVisible write SetVisible;
end;
3.TColumnInfos = class(TList) を作成し、TColumnInfoを格納し、管理。
TListViewExのコンストラクタで TClumnInfosのインスタンスを作成。
また、継承した TListItemExは、
function TListViewEx.CreateListItem: TListItem;
begin
Result := TListItemEx.Create(Items);
end;
としてインスタンスを作成。
4.コンストラクタか CreateWndあたりで
Columns.HandleNeededを呼び出し、
TColumnInfo.DefColIdxにColumn.Indexを入れておく。
(この後の Columnsの変更は認めない。
認める場合は、追加コードを書く。)
5.TColumnInfo.SetVisible で FVisibleを元に TListView.Columnsを再構築。
(FVisible=Falseのカラムはつくらない)
6.TListItem.GridText[Column.Index]では
常にColumns[DefColIdx]のListItemのCaptioかSubItem値を返す。
var
ci :TColumnInfo;
begin
ci:= FColumnInfos[Column.Index];
if ci.DefColIdx=0 then
Result:= Caption
else
Result:=SubItems[ ci.DefColIdx-1]
end;
7.カラムの並びを入れ替えた時は、 DefColIdxをswapする。
(Columnsのハンドルは WMParentNotify(var Message: TWMParentNotify);
で取得できます)
with Message do
if (Event = WM_CREATE) and (FHeaderHandle = 0) and (FHdrWndProc<>nil) then
begin
FHeaderHandle := ChildWnd;
必要なら WndProcに割り込む処理もここで。
FOldHdrWndProc:=
pointer(SetWindowLong(
FHeaderHandle,GWL_WNDPROC,longint(FHdrWndProc)));
//MakeObjectInstanceとかはコンストラクタで。
end;
要所だけまとめてみました。
というのを私はやっています・・・。
レス有難う御座います。
ちょっと敷居が高そうですが、なんとか頑張ってみますです。
ツイート | ![]() |