こんにちは。
いつも参考にさせていただいております。
StringGridの入力チェックをOnSelectCellとOnExitイベントで行っています。
入力チェックでエラーが発生した場合に、その項目を反転選択させ再入力を促したいのです。
下記を双方のイベントで行っているのですが、OnExitイベントでエラーが発生した場合に、エラーのセルが編集状態になりません。
//入力チェック
if funcCheck(TStringGrid(Sender),giRow) = false then
begin //エラーの時
StringGrid1.SetFocus;
StringGrid1.EditorMode := true;
TTmpGrid(stgMeisai).InplaceEditor.SelectAll;
exit;
end;
Delphi7を使っています。
StringGridのOptionsは、goEditingをTrueにしています。
そういう制御は根本的に無理なのでしょうか。
どうかご教授下さいませ。
以下のコードでセル編集状態にできます。
procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
StringGrid1.Col := ErrCol; // 移動するセルのカラム位置
StringGrid1.Row := ErrRow; // 移動するセルの行位置
StringGrid1.SetFocus;
StringGrid1.Options := StringGrid1.Options + [goAlwaysShowEditor];
// 常時編集モードにする。
StringGrid1.EditorMode := True;
end;
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
StringGrid1.Options := StringGrid1.Options - [goAlwaysShowEditor];
// セルが移動したら常時編集モードを解除
end;
もっといい方法があるかも知れませんが、参考までに...
擬似的に、F2を押させることでできます。
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
begin
if ACol = 1 then
begin
StringGrid1.SetFocus;
// 現在選択された位置なので設定不要
// StringGrid1.Col := ACol;
// StringGrid1.Row := ARow;
keybd_event(VK_F2, 0, 0, 0);
keybd_event(VK_F2, 0, KEYEVENTF_KEYUP, 0);
end;
end;
procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
if StringGrid1.Cells[1,1] <> 'a' then
begin
StringGrid1.SetFocus;
StringGrid1.Col := 1;
StringGrid1.Row := 1;
keybd_event(VK_F2, 0, 0, 0);
keybd_event(VK_F2, 0, KEYEVENTF_KEYUP, 0);
end;
end;
いろいろな手段があるのですね。自分の無知さを思い知ります。
今回、私の作っている画面では「F2押下でサブ画面が起動する」
という仕様になっています。
にしのさんの回答のように、擬似的にF2を押させると
案の定、サブ画面が起動しました・・・
このような場合は、この方法は諦めざるをえないでしょうか?
VK_F2を、VK_ENTERにしてみてください。
EditorModeの説明によると、
> F2 キーが押されると,EditorMode プロパティは true に設定されます。
> Enter キーが押されると,EditorMode プロパティの値は true と false との間で交互に切り替わります。
ということですので。
もしかしたら、タイミングの問題でうまくいかないかもしれません。
うさこさんがF2のイベントをとってしまっているので、にしのさんの方法では、無理ですね。masayanさんの方法は試しましたか?
VK_ENTERでなく、VK_RETURNでした。
Enterキーも何かに割り当ててあれば、私の方法は使えません。
>VK_ENTERでなく、VK_RETURNでした。
>Enterキーも何かに割り当ててあれば、私の方法は使えません。
はい、割り当てていました・・・
すみません、先にお伝えしておくべきでした・・・
ので、今回はmasayanさんの方法でいこうと思います。
皆様、ありがとうございました。
ツイート | ![]() |