DBGridでTStringGrid.CellRectと同じ結果を得るには?

解決


KazKaz  2006-08-03 11:16:25  No: 22827  IP: 192.*.*.*

DBGridでカレントCel位置に自作コントロールを配置させたい(入力補助)のでその座標を得たいのですがTStringGridに形変換させれば、縦スクルールしていない状況ならCellRectでとれますがスクロールすると出来ません。
何かいい方法が有りましたら教えて下さい。

編集 削除
えび  2006-08-03 15:00:39  No: 22828  IP: 192.*.*.*

OnDrowColumnCellイベントの引数を利用されたらどーでしょうか?

編集 削除
KazKaz  2006-08-03 18:37:03  No: 22829  IP: 192.*.*.*

えびさん、返信有難うございます。何となく出来そうな感じなのですが技量不足でよく分かりません。この方法であるセルがクリックされたらその位置に自前コントロールを配置する事が可能なのですか?

編集 削除
えび  2006-08-03 19:43:18  No: 22830  IP: 192.*.*.*

やったことが無いので、良い方法かどうか判りませんが、
入力フォーカスのあるセルの右端に生成済みのボタンを表示する例です↓
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.

編集 削除
KazKaz  2006-08-03 20:07:51  No: 22831  IP: 192.*.*.*

お手間をおかけしすみません。常に出すなら出来そうなのですが、フォーカスが来たらコントロールを表示して、入力後すぐ消す感じの動作がしたいです。コントロールは日付けを入力制御する感じのもので、単純に別ウインドウで入力した結果をDBGRIDにセットするようなイメージです。
もう少しの所で出来ないのですが、うまくDrawColumCellのコマンドに入ってこないようです。対象CelにきたらDrawColumCellがくれば後は何らかのフラグにより制御出来そうです。
分かりにくい文章で恐縮ですが、もし解れば助かります。

編集 削除
KazKaz  2006-08-03 20:23:43  No: 22832  IP: 192.*.*.*

お手間をおかけしてすみませんでした。
何とかできるようになりました。
CellClick、ColEnter、AfterScroll等にコントロール表示フラグを付けて、
DBGRID.Refress により強制的にDrawColumCellに飛ばし、その中で重複しないようにフラグを落としたらうまくいきました。
大変参考になりました、有難うございます。

編集 削除