StrindGridを使用して、各セルに移動した時点でセル単位にキャレットの制御を行いたいのですがうまく行きません。
OnGetEditTextやOnKeyPress等では実際のStringGridのセル位置とInplaceEditorの位置が合わない時があるようで同一の値が確認できません。どなたか教えていただければ幸いかと思います。よろしくお願いします。
ご質問の意味がよく理解できません。特に
>各セルに移動した時点でセル単位にキャレットの制御を行いたいのですがうまく
の部分と
>実際のStringGridのセル位置とInplaceEditorの位置が合わない時があるようで
の部分の意味が分かりません。もう少し状況が分かればお力になれるかもしれません。
単純に
>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;
説明が足りなくてすみません。
「各セルに移動した時点でセル単位にキャレットの制御を行いたい..」というのは、セルを移動した時点で移動先のセル内の値によってキャレットの位置を決めたいと言う事です。
例えばセルの値中に特定の単語を含んでいた場合に、その単語だけを選択状態にしたり、数字列であったら全選択状態(SelectAll)にし、それ以外だったらセルの値の最後尾にキャレットを表示するといった動作です。
「実際のStringGridのセル位置とInplaceEditorの位置が..」という部分は
上記の処理を行う際に、移動先のセルが2列目の2行目だった場合に、StringGrid1内のOnKeyPressイベント等にてStringGrid1.Cells[2,2] と InplaceEdit(StringGrid1.Controls[0]).Textの値が同一ではない場合があります。このような状態です。
遅くなりましたが、環境はDelphi7をWindowsXpで使用しています。
OnEnterの動作に関してはこれから確認を取ってみます。
レスポンスが悪くて申し訳ありません。
よろしくお願いします。
OnEnterの動作はOKです。ありがとうございます。
OnEnterの動作は順調です。ありがとうございました。
キャレットに関しては、別の場所で改めて質問させていただきます。
ツイート | ![]() |