DBGridでカレントCel位置に自作コントロールを配置させたい(入力補助)のでその座標を得たいのですがTStringGridに形変換させれば、縦スクルールしていない状況ならCellRectでとれますがスクロールすると出来ません。
何かいい方法が有りましたら教えて下さい。
OnDrowColumnCellイベントの引数を利用されたらどーでしょうか?
えびさん、返信有難うございます。何となく出来そうな感じなのですが技量不足でよく分かりません。この方法であるセルがクリックされたらその位置に自前コントロールを配置する事が可能なのですか?
やったことが無いので、良い方法かどうか判りませんが、
入力フォーカスのあるセルの右端に生成済みのボタンを表示する例です↓
Delphi7.1 Entでテストしました。
#
参考までに、教えてください。
自前コントロールとは、どんなコントロールですか?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, DB, DBClient, Grids, DBGrids, StdCtrls;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
ClientDataSet1: TClientDataSet;
ClientDataSet1aa: TStringField;
DataSource1: TDataSource;
Button1: TButton;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if gdFocused in State then begin
Button1.Top := DBGrid1.Top + Rect.Top;
Button1.Left := DBGrid1.Left + (Rect.Right - Button1.Width);
Button1.Height := Rect.Bottom - Rect.Top;
end;
end;
end.
お手間をおかけしすみません。常に出すなら出来そうなのですが、フォーカスが来たらコントロールを表示して、入力後すぐ消す感じの動作がしたいです。コントロールは日付けを入力制御する感じのもので、単純に別ウインドウで入力した結果をDBGRIDにセットするようなイメージです。
もう少しの所で出来ないのですが、うまくDrawColumCellのコマンドに入ってこないようです。対象CelにきたらDrawColumCellがくれば後は何らかのフラグにより制御出来そうです。
分かりにくい文章で恐縮ですが、もし解れば助かります。
お手間をおかけしてすみませんでした。
何とかできるようになりました。
CellClick、ColEnter、AfterScroll等にコントロール表示フラグを付けて、
DBGRID.Refress により強制的にDrawColumCellに飛ばし、その中で重複しないようにフラグを落としたらうまくいきました。
大変参考になりました、有難うございます。
ツイート | ![]() |