VCL TDrawGrid, TStringGridにComboBoxを使う
通常の、goEditingでは、TInplaceEditが使われますが、これをTInplaceEditListに代えてやればOK。
あとは、TCustomGridのGetEditStyle関数が、戻すTEditStyleによって、エディタの挙動が変わります。esSimpleが普通の状態、esPickListでコンボボックス、esEllipsisで参照ボタンのような点が3つ描かれたボタンが表示されます。
TEditStyle __fastcall GetEditStyle (int ACol, int ARow);
TInplaceEditListクラスには、OnGetPickListitems、OnEditButtonClickというイベントハンドラプロパティが用意されていて、OnGetPickListitemは、内部エディタがPickListの要素を要求した時に発生するので、ここで任意の要素を設定すれば、セルの座標に応じたリストを表示する事ができる。OnEditButtonClickはesEllipsisの時に表示されるボタンのクリックに対応する。普通に考えるとOpenDialogを表示して、ファイル名をセルに描画するという感じになると思う。
TInplaceEditをTInplaceEditListに変えるには、TCustomGrid::CreateEditor関数でTInplaceEdit*を返す。TInplaceEditListは、TInplaceEditの派生クラスなので、TInplaceEditListを生成して返してやれば良いのだが、上記2つのイベントハンドラの設定が必要になる。
TInplaceEdit * __fastcall CreateEditor ();
で、簡単にこれらをグリッドで管理してしまおうと思う。ついでに、GetEditStyleをフォームなどから操作できるように、コールバック化する。
class TMyGrid : public TStringGrid
{
private:
TOnGetPickListItems FOnGetPickListItems;
TNotifyEvent FOnEditButtonClick;
{
if (NULL != FOnGetEditStyle)
{
return style;
TInplaceEdit* __fastcall CreateEditor ()
{
editor->OnGetPickListitems = FOnGetPickListItems;
editor->OnEditButtonClick = FOnEditButtonClick;
return editor;
virtual void __fastcall SetOnGetPickListItems (TOnGetPickListItems event)
{
TInplaceEditList* editor =
if (NULL != editor)
{
virtual void __fastcall SetOnEditButtonClick (TNotifyEvent event)
{
TInplaceEditList* editor =
if (NULL != editor)
{
public:
FOnGetPickListItems (NULL),
FOnEditButtonClick (NULL)
}
virtual __fastcall ~TMyGrid ()
{
}
__published:
__property TOnGetPickListItems OnGetPickListItems =
__property TNotifyEvent OnEditButtonClick =
あとは、このグリッドをフォームのメンバにして、フォーム側でOnGetPickListItems、OnEditButtonClick, OnGetEditStyleを実装してから、グリッドのプロパティにセットしてやる。
OnEditButtonClickでオープンダイアログを表示するために、フォームにはOpenDialogを置いておく。
{
__published:
TStringList* FStringList2;
__fastcall TForm1 (TComponent *Owner)
FStringList1 (new TStringList),
FStringList2 (new TStringList)
MyGrid->Options += TGridOptions () << goEditing << goColSizing;
MyGrid->Align = alClient;
MyGrid->FixedRows = 1;
MyGrid->FixedCols = 1;
MyGrid->RowCount = 5;
MyGrid->ColCount = 5;
MyGrid->OnGetEditStyle = MyGridGetEditStyle;
MyGrid->OnGetPickListItems = MyGridGetPickListItems;
MyGrid->OnEditButtonClick = MyGridEditButtonClick;
FStringList1->Append (L”リスト1-1”);
FStringList1->Append (L”リスト1-2”);
FStringList1->Append (L”リスト1-3”);
FStringList2->Append (L”リスト2-1”);
FStringList2->Append (L”リスト2-2”);
FStringList2->Append (L”リスト2-3”);
virtual __fastcall ~TForm1 ()
{
delete FStringList1;
delete FStringList2;
void __fastcall MyGridGetEditStyle (int ACol, int ARow, TEditStyle& AStyle)
{
{
case 1:
case 2:
break;
case 3:
break;
default:
void __fastcall MyGridGetPickListItems (int ACol, int ARow, TStrings* Items)
{
{
case 1:
break;
case 2:
break;
void __fastcall MyGridEditButtonClick (TObject *Sender)
{
{
コンポーネントにしておけば、普段から簡単に使えるんじゃないかと思う。コンパイルには#include <Grids.hpp>が必要
| 固定リンク
「CBuilder」カテゴリの記事
- 一定時間アイドル状態が続いたら何かをしたい(2015.11.26)
- TMetafileへの描画が反映されない(2015.07.30)
- TDataModuleはClientHeightプロパティを持っていない(2015.02.19)
- VCLのTStringsを検索キーワードのトークナイザー的に使ってみる(2014.12.18)
- Delphi/C++Builder TControl::ClientToScreenでVCLコントロール上の座標をスクリーン座標に変換する(2014.12.02)
この記事へのコメントは終了しました。
コメント