StringGridをOnExitイベントで編集状態にする

解決


うさこ  2003-10-08 18:46:20  No: 5132

こんにちは。
いつも参考にさせていただいております。

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にしています。

そういう制御は根本的に無理なのでしょうか。
どうかご教授下さいませ。


masayan  2003-10-08 20:00:33  No: 5133

以下のコードでセル編集状態にできます。

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;

もっといい方法があるかも知れませんが、参考までに...


にしの  2003-10-08 20:08:49  No: 5134

擬似的に、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;


うさこ  2003-10-08 20:28:48  No: 5135

いろいろな手段があるのですね。自分の無知さを思い知ります。

今回、私の作っている画面では「F2押下でサブ画面が起動する」
という仕様になっています。

にしのさんの回答のように、擬似的にF2を押させると
案の定、サブ画面が起動しました・・・

このような場合は、この方法は諦めざるをえないでしょうか?


にしの  2003-10-08 21:06:30  No: 5136

VK_F2を、VK_ENTERにしてみてください。
EditorModeの説明によると、
> F2 キーが押されると,EditorMode プロパティは true に設定されます。
> Enter キーが押されると,EditorMode プロパティの値は true と false との間で交互に切り替わります。
ということですので。
もしかしたら、タイミングの問題でうまくいかないかもしれません。


HOota  2003-10-08 23:17:07  No: 5137

うさこさんがF2のイベントをとってしまっているので、にしのさんの方法では、無理ですね。masayanさんの方法は試しましたか?


にしの  2003-10-09 00:33:28  No: 5138

VK_ENTERでなく、VK_RETURNでした。
Enterキーも何かに割り当ててあれば、私の方法は使えません。


うさこ  2003-10-09 05:14:16  No: 5139

>VK_ENTERでなく、VK_RETURNでした。
>Enterキーも何かに割り当ててあれば、私の方法は使えません。

はい、割り当てていました・・・
すみません、先にお伝えしておくべきでした・・・

ので、今回はmasayanさんの方法でいこうと思います。

皆様、ありがとうございました。


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

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






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