StringGridのあるCellに入力されている値を変更した場合、そのCellを出るときに変更前の値と変更後の値をとらえたいのですが、どのようにしたらいいのでしょうか。マウス、↑↓キー、Enterでフォーカスを移動させています。
OnSetEditTextイベントは1字毎に発生してしまうし・・・・悩んでいます。
StringGrid をサブクラス化して、インプレースエディタのフォーカスの出入り
を監視し、そのときのテキストを変更を検出できます。
新規で StringGrid1 と Memo1 を置いて以下のようにします。
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
public
revCellStr:string;
revCol,revRow:integer;
OldProc:TWndMethod;
procedure SubClassProc(var Msg: TMessage);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
OldProc := StringGrid1.WindowProc;
StringGrid1.WindowProc := SubClassProc;
end;
procedure TForm1.SubClassProc(var Msg: TMessage);
begin
OldProc(Msg);
if Msg.Msg = WM_COMMAND then
with StringGrid1 do
case Msg.WParamHi of
EN_SETFOCUS:begin
revCol := Col; revRow := Row;
revCellStr := Cells[revCol,revRow];// 変更前のテキストを保存
end;
EN_KILLFOCUS:begin
Memo1.Lines.Add(Format('before : %s After : %s',
[revCellStr,Cells[revCol,revRow]]));
end;
end;
end;
解決できました!
ありがとうございました。
ツイート | ![]() |