フリーソフト

TListView

[BCB] OnAdvancedCustomDrawSubItem, OnAdvancedCustomDrawItemでフォントがおかしくなる

TListViewのOnAdvancedCustomDrawSubItemやOnAdvancedCustomDrawItemイベントで処理をするとフォントがおかしくなることがあります。

その場合は、以下を書き加えてみてください。

    if (ListView1->Canvas->Font->OnChange!=NULL) ListView1->Canvas->Font->OnChange(ListView1->Canvas->Font);

[BCB] ListViewで選択中の行までスクロール

if (ListView1->Selected!=NULL)
  ListView1->Selected->MakeVisible(true);

[BCB] ListViewのHeader(Column)に画像を表示する

ListViewのヘッダーに画像を表示する方法です。文字列の左側に表示する場合はプロパティを設定するだけで簡単にできますが、文字列の右側に画像を表示する場合は以下の関数で実現できます。表示したい画像はあらかじめImageListにいれておきます。

void __fastcall TForm1::ShowImageToLvColumn(TListView *ListView,int ACol,int ImageIndex)
{
  //ヘッダコントロールのハンドル取得
  HWND ColumnHandle=ListView_GetHeader(ListView->Handle);
  if (ColumnHandle==NULL) return;
  //イメージリストを割り当て
  if (!Header_SetImageList(ColumnHandle,ImageList1->Handle)) return;

  //設定を取得
  HD_ITEM hi;
  hi.mask=HDI_FORMAT;
  if (!Header_GetItem(ColumnHandle,ACol,&hi)) return;

  //イメージを設定
  hi.mask   = HDI_IMAGE|HDI_FORMAT;
  if (ImageIndex>=0) {
    hi.fmt   |= HDF_IMAGE|HDF_BITMAP_ON_RIGHT;  // 取得しておいたフォーマットに HDF_IMAGE 追加
    hi.iImage = ImageIndex; // ImageListのID
  } else {
    hi.fmt   &= ~(HDF_IMAGE|HDF_BITMAP_ON_RIGHT);
    hi.iImage = 0; //-1をいれるとエラーになる
  }
  Header_SetItem(ColumnHandle,ACol,&hi);
}

[Delphi] ListViewのHeaderに画像を表示する

ListViewのHeaderにソートの方向を表す矢印(三角マーク)を表示したりするときに、役に立つと思います。

TreeViewEx1.ColumnImages[2]:=0;

のように設定すると2列目のヘッダにSmallImageに設定されているImageListの最初の画像が表示されます。消すときはColumnImages[2]:=-1のようにします。

[BCB] ListViewで行毎に背景色を変える

void __fastcall TForm1::ListView1AdvancedCustomDrawItem(
      TCustomListView *Sender, TListItem *Item, TCustomDrawState State,
      TCustomDrawStage Stage, bool &DefaultDraw)
{
  if (Item->Index%2==0)
    Sender->Canvas->Brush->Color=(TColor)RGB(240,240,255);
}

[BCB] ListViewに32bitアイコンを表示

BCB6.0では、ListViewなどにWindows XPで使用される32bitアイコン(アルファチャンネルを持つ半透明アイコン)を表示しようとすると、アルファがうまく反映されず、アイコンのふちが黒くなって表示されてしまいます。これを解決する方法です。

まず、ImageListを32bitに変更します。例えばFormCreateなどに次のようなコードを書いておきます。

void __fastcall TForm1::FormCreate(TObject *Sender)
{            
  UINT Flags=ILC_COLOR32;
  if (ImageList1->Masked) Flags|=ILC_MASK;
  ImageList1->Handle = (int)ImageList_Create(Width, Height, Flags, 0, ImageList1->AllocBy);
}

次に、manifestファイルを作成します。書き方はこちらを参照してください。
以上です。

BCB6.0、XP環境において、ImageListに32bitアイコンを追加していき、ListViewに表示したところ正常に表示されました。

[BCB] ListViewのコラムをクリックでソート

ListViewのコラムをクリックした時に、その列をキーに内容をソートする方法です。ListViewのViewStyleはvsReport、ShowColumnHeaderはtrueに設定されているとします。

クリックされた列の番号を保持しておく変数を用意しておきます。

  :
private
  int FColumnToSort;
  :
};

ListViewのOnColumnClickとOnCompareを使います。またTagプロパティは、コラムをクリックするたびに、ソートの方向(昇順か降順か)を反転するために使っています。

void __fastcall TForm1::ListView1ColumnClick(TObject *Sender,
      TListColumn *Column)
{
  FColumnToSort = Column->Index;
  ((TCustomListView *)Sender)->AlphaSort();

  //ソートの方向を切り替える 昇順、降順
  if (FColumnToSort==0)
    ListView1->Tag=(ListView1->Tag==1)?0:1;
  else
    ListView1->Columns->Items[FColumnToSort-1]->Tag=
      (ListView1->Columns->Items[FColumnToSort-1]->Tag==1)?0:1;
}
//