StringGridでセル単位でOnEnterのようなイベントを拾うには?

解決


はははね  2004-09-17 01:25:41  No: 10940

StrindGridを使用して、各セルに移動した時点でセル単位にキャレットの制御を行いたいのですがうまく行きません。
OnGetEditTextやOnKeyPress等では実際のStringGridのセル位置とInplaceEditorの位置が合わない時があるようで同一の値が確認できません。どなたか教えていただければ幸いかと思います。よろしくお願いします。


jok  2004-09-17 03:20:47  No: 10941

ご質問の意味がよく理解できません。特に

>各セルに移動した時点でセル単位にキャレットの制御を行いたいのですがうまく

の部分と

>実際のStringGridのセル位置とInplaceEditorの位置が合わない時があるようで

の部分の意味が分かりません。もう少し状況が分かればお力になれるかもしれません。


jok  2004-09-17 06:37:05  No: 10942

単純に

>StringGridでセル単位でOnEnterのようなイベントを拾うには?

だけであれば、StringGrid をサブクラス化して InplaceEdit からの通知メッセージ
を受け取るだけで実現します。

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
  public
    OldProc: TWndMethod;
    procedure SGSubClassProc(var Msg:TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldProc := StringGrid1.WindowProc;
  StringGrid1.WindowProc := SGSubClassProc;
end;

procedure TForm1.SGSubClassProc(var Msg: TMessage);
begin
  OldProc(Msg);
  if Msg.Msg = WM_COMMAND then
    with StringGrid1 do begin
      if GetParent(Msg.LParam) <> Handle then exit;
      case Msg.WParamHi of
        EN_SETFOCUS:Memo1.Lines.Add(Format('SetFocus at Cells[%d,%d]',[Col,Row]));
        EN_KILLFOCUS:Memo1.Lines.Add(Format('KillFocus at Cells[%d,%d]',[Col,Row]));
      end;
    end;
end;


はははね  2004-09-17 18:15:35  No: 10943

説明が足りなくてすみません。
「各セルに移動した時点でセル単位にキャレットの制御を行いたい..」というのは、セルを移動した時点で移動先のセル内の値によってキャレットの位置を決めたいと言う事です。
例えばセルの値中に特定の単語を含んでいた場合に、その単語だけを選択状態にしたり、数字列であったら全選択状態(SelectAll)にし、それ以外だったらセルの値の最後尾にキャレットを表示するといった動作です。

「実際のStringGridのセル位置とInplaceEditorの位置が..」という部分は
上記の処理を行う際に、移動先のセルが2列目の2行目だった場合に、StringGrid1内のOnKeyPressイベント等にてStringGrid1.Cells[2,2] と InplaceEdit(StringGrid1.Controls[0]).Textの値が同一ではない場合があります。このような状態です。
遅くなりましたが、環境はDelphi7をWindowsXpで使用しています。

OnEnterの動作に関してはこれから確認を取ってみます。
レスポンスが悪くて申し訳ありません。
よろしくお願いします。


はははね  2004-09-17 18:28:47  No: 10944

OnEnterの動作はOKです。ありがとうございます。


はははね  2004-09-24 23:00:24  No: 10945

OnEnterの動作は順調です。ありがとうございました。
キャレットに関しては、別の場所で改めて質問させていただきます。


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

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






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