TDBGrid で使われている機能ですから、相当古い Delphi でも普通にできます。
[uGridEx.pas]
unit uGridEx;
interface
uses Classes, Grids;
type TEditBtnClick = procedure(Sender: TObject; ACol, ARow: Integer) of object; TGetPickListItems = procedure(Sender: TObject; ACol, ARow: Integer; Items: TStrings) of object; TGetEditStyle = procedure(Sender: TObject; ACol, ARow: Integer; var EditStyle: TEditStyle) of object;
TStringGridEx = class(TStringGrid) private FOnEditBtnClick: TEditBtnClick; FOnGetPickListItems: TGetPickListItems; FOnGetEditStyle: TGetEditStyle; procedure EditButtonClick(Sender: TObject); procedure GetPickListItems(ACol, ARow: Integer; Items: TStrings); protected function CreateEditor: TInplaceEdit; override; function GetEditStyle(ACol, ARow: Integer): TEditStyle; override; published property OnEditBtnClick: TEditBtnClick read FOnEditBtnClick write FOnEditBtnClick; property OnGetPickListItems: TGetPickListItems read FOnGetPickListItems write FOnGetPickListItems; property OnGetEditStyle: TGetEditStyle read FOnGetEditStyle write FOnGetEditStyle; end;
implementation
{ TStringGridEx }
function TStringGridEx.CreateEditor: TInplaceEdit; begin result := TInplaceEditList.Create(Self); TInplaceEditList(result).OnGetPickListItems := Self.GetPickListItems; TInplaceEditList(result).OnEditButtonClick := Self.EditButtonClick; end;
procedure TStringGridEx.EditButtonClick(Sender: TObject); begin if Assigned(FOnEditBtnClick) then FOnEditBtnClick(Self, Self.Col, Self.Row); end;
function TStringGridEx.GetEditStyle(ACol, ARow: Integer): TEditStyle; var LEditStyle: TEditStyle; begin LEditStyle := esSimple; if Assigned(FOnGetEditStyle) then FOnGetEditStyle(Self, ACol, ARow, LEditStyle); result := LEditStyle; end;
procedure TStringGridEx.GetPickListItems(ACol, ARow: Integer; Items: TStrings); begin Items.Clear; if Assigned(FOnGetPickListItems) then FOnGetPickListItems(Self, ACol, ARow, Items); end;
end.
こんな感じのユニットを作っておけば、
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, uGridEx;
type TStringGrid = class(TStringGridEx);
TForm1 = class(TForm) StringGrid1: TStringGrid; procedure FormShow(Sender: TObject); procedure EditBtnClick(Sender: TObject; ACol, ARow: Integer); procedure GetEditStyle(Sender: TObject; ACol, ARow: Integer; var EditStyle: TEditStyle); procedure GetPickListItems(Sender: TObject; ACol, ARow: Integer; Items: TStrings); private { Private 宣言 } public { Public 宣言 } end;
var Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormShow(Sender: TObject); // フォーム表示時 begin OnShow := nil;
StringGrid1.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goEditing,goAlwaysShowEditor];
// イベントハンドラを設定 StringGrid1.OnEditBtnClick := EditBtnClick; StringGrid1.OnGetEditStyle := GetEditStyle; StringGrid1.OnGetPickListItems := GetPickListItems; end;
procedure TForm1.EditBtnClick(Sender: TObject; ACol, ARow: Integer); begin // グリッドの [...] ボタンが押された時 ShowMessage(IntToStr(ACol)); end;
procedure TForm1.GetEditStyle(Sender: TObject; ACol, ARow: Integer; var EditStyle: TEditStyle); begin // グリッドのセルの種類を設定 case ACol of 2: EditStyle := esEllipsis; // [...] ボタン 3: EditStyle := esPickList; // コンボボックス else EditStyle := esSimple; end; end;
procedure TForm1.GetPickListItems(Sender: TObject; ACol, ARow: Integer; Items: TStrings); begin // コンボボックスのリストを設定 Items.Add('AAA'); Items.Add('BBB'); Items.Add('CCC'); end;
end.
こんな感じで使えます。現在作っているものとはちょっとやり方が異なりますが、基本的には同じようなものです。
※ 画像の開発環境は Delphi 7 です。
|