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

解決


KazKaz  2006-08-03 20:16:25  No: 22827

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


えび  2006-08-04 00:00:39  No: 22828

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


KazKaz  2006-08-04 03:37:03  No: 22829

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


えび  2006-08-04 04:43:18  No: 22830

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

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


KazKaz  2006-08-04 05:23:43  No: 22832

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加