TListViewでカラムの表示/非表示を実現するには?

解決


ぽぽろん  2006-05-10 22:55:31  No: 21451

何度も取り沙汰されている件なので恐縮ですが、
WindowsXPなどのエクスプローラーの詳細表示状態で、列項目名の部分を
右クリックする事で項目の表示/非表示を制御できますが、
これと似たような事は TListView で実現する事はできるのでしょうか?

過去記事にはWidthを0にするなどありましたが、他に方法があれば
ご教授ください。

宜しくお願いします。


気合で  2006-05-11 02:32:53  No: 21452

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;

要所だけまとめてみました。    
というのを私はやっています・・・。


ぽぽろん  2006-05-18 18:34:32  No: 21453

レス有難う御座います。
ちょっと敷居が高そうですが、なんとか頑張ってみますです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加