掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
TListViewでカラムの表示/非表示を実現するには? (ID:21452)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
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; 要所だけまとめてみました。 というのを私はやっています・・・。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.