スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサードリンク

TDBGridにボタンを配置する

TDBGridの特定セルにTButtonを貼り付ける方法です。

■参考資料:第14回エンバカデロ・デベロッパーキャンプセッションT7
C++Builderのソースですが、大変参考になりました。ありがとうございます。

コンポーネントを作らずにオーナードローで回避するなんて素晴らしいです。
Delphi独自のオブジェクト指向らしい方法です。

usesに Themes を追加してください。

※以下Delphiで書き直したサンプルコードの抜粋

// TDBGridのMouseMoveでカレントレコード移動させる為のもの
type TRecMoveDBGrid = class(TDBGrid)
end;


//******************************************************************************
//******************************************************************************
procedure TFM_KoushuM.FormCreate(Sender: TObject);
var
BoundsRect: TRect;
begin
 BoundsRect := DBGrid1.CellRect(8, DBGrid1.FixedRows);
 Button1.Parent := DBGrid1;
 Button1.Visible := False;
end;

//******************************************************************************
//******************************************************************************
procedure TFM_KoushuM.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
 clientRect : TRect;
 pTheme : TThemeServices;
 Details : TThemedElementDetails;
 LastMode : Integer;
begin
 if (DataCol <> 0) then Exit;

 clientRect := Rect;
 // Windowsテーマを取得
 pTheme := ThemeServices();

 if (pTheme.ThemesEnabled) then begin
  // テーマが有効
  Details := pTheme.GetElementDetails(tbPushButtonNormal);
  pTheme.DrawElement(DBGrid1.Canvas.Handle, Details, Rect, nil);
  pTheme.DrawText(DBGrid1.Canvas.Handle, Details, 'AAA', clientRect, DT_CENTER OR DT_VCENTER OR DT_SINGLELINE, 0);
 end else begin
  // テーマが無効
  // ボタンを描画
  DrawFrameControl(DBGrid1.Canvas.Handle, &Rect, DFC_BUTTON, DFCS_BUTTONPUSH OR DFCS_ADJUSTRECT);

  // ボタンのラベルを描画
  LastMode := SetBkMode(DBGrid1.Canvas.Handle, TRANSPARENT);
  DrawTextW(DBGrid1.Canvas.Handle, 'AAA', lstrlenW('AAA'), clientRect, DT_CENTER OR DT_VCENTER OR DT_SINGLELINE);
  SetBkMode(DBGrid1.Canvas.Handle, LastMode);
 end;
end;

//******************************************************************************
//******************************************************************************
procedure TFM_KoushuM.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
 Col, Row : Integer;
 BoundsRect : TRect;
 gc : TGridCoord;

begin
 // マウスカーソルの位置のグリッドのセルを取得する
 gc := DBGrid1.MouseCoord(x, y);
 if (gc.X > 0) AND (gc.Y > 0) Then
 begin
  // カレントレコードを移動させる。
  DBGrid1.DataSource.DataSet.MoveBy(gc.Y - TRecMoveDBGrid(DBGrid1).Row);
 end;

 if (gc.Y >= 1) and (gc.X = 7) then begin
  // TButtonをカレントグリッドセルに配置する。
  BoundsRect := DBGrid1.CellRect(gc.X, gc.Y);
  Button1.BoundsRect := BoundsRect;
  Button1.Visible := True;
 end;

// TDrawGrid(DBGrid1).MouseToCell(X, Y, col, row);
// if (row>=1) and (col=7) then begin
// BoundsRect := DBGrid1.CellRect(Col, Row);
// Button1.BoundsRect := BoundsRect;
// end;

end;

//******************************************************************************
//******************************************************************************
procedure TFM_KoushuM.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
 Col, Row: Integer;
 ORect : TGridRect;
 gc : TGridCoord;

begin
// gc := DBGrid1.MouseCoord(x, y);
 TDrawGrid(DBGrid1).MouseToCell(Button1.Left + X, Button1.Top + Y, Col, Row);
 DBGrid1.Row := Row;
 DBGrid1.SetFocus;

 ORect.Left := 0;// 左上の列
 ORect.Top := Row;// 左上の行
 ORect.Right := 7;// 右下の列
 ORect.Bottom := Row;// 右下の行
//
// 選択したい範囲を Selection プロパティに指定
 TStringGrid(DBGrid1).Selection := ORect;// 3 行 2 列 ~ 4 行 3 列

 MessageDlg(DBGrid1.DataSource.DataSet.FieldByName('calc_KoshuCode').AsString, mtError, [mbOK], 0);
end;

スポンサードリンク

テーマ:ソフトウェア - ジャンル:コンピュータ

コメントの投稿

非公開コメント

スポンサードリンク
最新記事
カテゴリ
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

月別アーカイブ
激安特価情報
Amazonタイムセール
楽天市場タイムセール
Yahoo出店記念セール
NTT-X Store 激安特価!
激安家電のGENO PLUS
コストコ・イケアの通販
つけたまま眠れるファンデ
家電品を安値で買うならこちら!
ケーズデンキ
ベルメゾンアウトレット
激安ブランドコスメ 週末セール
モバコレ SALE
au Brand Garden
アウトレットモール BRANDELI
ブックオフオンラインのオトナ買い
ビッグカメラ◆週末特別セール
ソフマップ 中古・アウトレット
【宿代全額ポイントバック】夏休み早期予約キャンペーン
ネットプライス 送料294円
イオンモールオンライン
EDIONネットショップ
最新コメント
天気予報

-天気予報コム- -FC2-
カウンター
検索フォーム
リンクに表示されるテキスト
ランキング参加中
クリックしていただけると、 こまつもとは大変嬉しいです。



人気ブログランキングへ

ランキングに参加しています。 クリックのご協力をお願い致します。 いつもありがとうございます。 にほんブログ村 通販ブログへ
ブログランキング・にほんブログ村へ
にほんブログ村 IT技術ブログ ソフトウェアへ
にほんブログ村 ゲームブログへ
にほんブログ村 IT技術ブログへ



人気ブログをblogramで分析

趣味・個人

ランキング

リンクリックブログランキング

私を登録 by BlogPeople



RSSリンクの表示
リンク
QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。