StringGridの日本語入力について


mook  2016-04-06 18:19:21  No: 48140

また教えて頂きたいことが出てきました。
StringGridで日本語入力する時に、以下のソースのようなやり方で行っているのですが..

最初のセルで日本語を入力するときには問題ないのですが
文字確定後エンターで次のセルに移動してそのまま日本語入力を行いますと
セルの中ではなく小さな編集ポップアップが出て来てそこで文字入力をする事になってしまいます。

これは操作する側としては好ましくないのでセルでの入力に戻したいのですが
いろいろと調べたりしましたが方法が分かりません。

どなたかご存知の方がいらっしゃいましたらお願いします。

尚環境は、Windows8.1+Delphi6です。

//-------------------------------------------------------
// StringGrid1をForm1に貼って

//-------------------------------------------------------
//  Gridで次のセル(右)へ移動
//-------------------------------------------------------
procedure SGrid_NextCt(var gridp:TStringGrid;sc:integer=1;ec:integer=0);
begin
  if (ec=0) then
      ec := gridp.Colcount-1;

  if (gridp.Col>=ec) then begin
     gridp.Col := sc;
     if (gridp.Row<gridp.Rowcount-1) then begin
        gridp.Row := gridp.Row+1;
     end;
  end else begin
     gridp.Col := gridp.Col+1;
  end;
end;

//-------------------------------------------------------
procedure TForm1.FormShow(Sender: TObject);
begin
  with StringGrid1 do begin
    Options := Options - [goRowSelect] + [goEditing] - [goRangeSelect];
  end;
end;

procedure TForm1.StringGrid1Click(Sender: TObject);
var
  Rect1: TRect;
begin
  Rect1 := TStringGrid(sender).CellRect(TStringGrid(sender).Col,TStringGrid(sender).Row);

  SetIMEMode(Handle, imHira);

  SetImeCompositionWindow(TStringGrid(sender).Font,Rect1.Left,Rect1.Top);
end;

procedure TForm1.StringGrid1Enter(Sender: TObject);
begin
  StringGrid1Click(Sender);
end;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_RETURN) then begin
     SGrid_NextCt(TStringGrid(sender));                  // 次のセルへ移動
     TStringGrid(sender).EditorMode := true;
  end;
end;


take  2016-04-06 18:47:52  No: 48141

フォーカスが移ってないもしくは
KewDownの後処理の問題と思われます。

SGrid_NextCt(TStringGrid(sender));                  // 次のセルへ移動
TStringGrid(sender).EditorMode := true;
TStringGrid(sender).SetFocus();                     // フォーカスを移動
Key := 0;                                           // 元のキー入力処理を無効に


mook  2016-04-06 19:32:03  No: 48142

takeさん、早速のご回答ありがとうございます。
確かにフォーカスに問題がありそうな気がします。
それで、教えて頂きました内容を以下のように

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_RETURN) then begin
     SGrid_NextCt(TStringGrid(sender));                  // 次のセルへ移動
     TStringGrid(sender).EditorMode := true;
     TStringGrid(sender).SetFocus();                     // フォーカスを移動
     Key := 0;                                           // 元のキー入力処理を無効に
  end;
end;

追加してみましたが、結果は変わりませんでした。


tor  2016-04-06 21:51:33  No: 48143

モヌにはもともと、ナキーで編集モードをマッマする機能がありますから
自分でナヘスにするヲサ→ヲサナキーの効果でに戻る
という動きをしているように見えます。
なのでヲサナヘヲサコスヲサヲサのところを取っちゃえばいいんじゃないですか?
常に編集モードにしておきたいのだったら、マのチモナを使ってもいいと思いますけど。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアカッーエッーカィ水ゥ アウコアキコアキ  書込者ノト:ロ 」 ァ」ハノJ

 ン

補足、厳密に言うと、チモナがない場合は
アョヲサセルを移動するとナヘスにリセットされる
イョヲサその後(マヒトの中で)ナヘスに設定する
ウョヲサヒミが発生。」アウ(改行)だったらナヘが切り替えられる
という動きになります。

今はイとウの合わせ技で結果的にヲサナヘスヲサになっているので、どちらか片方をなくせばいいということですね。(両方潰しちゃうと元の木阿弥です)
なお、ウを潰したいのならマヒトではなくマヒミでないと駄目です。

どの方法を選ぶかは、ナキー以外でセル移動した場合にどうしたいか?次第でしょう。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアカッーエッーカィ水ゥ アエコーイコアカ  書込者ノト:ロ 」 「 ン

さん、ご回答ありがとうございます。

アドバイスに従いやり方を変えてみました。

モヌアヒトィゥヲサは止めまして..

ヲサヤニアョモヌアヒミィモコヲサヤマサヲサヲサヒコヲサテゥサ

ヲサヲサヲサィヒス」アウゥヲサヲサ
ヲサヲサヲサヲサヲサモヌ゜ホティヤモヌィゥゥサ
ヲサヲサヲサヲサヲサヒヲサコスヲサ」ーサ
ヲサヲササ

以上のイベントに切り替えましたらうまく行きました。
エンターキーでセルを移動するときにはセルがへこんだ(編集)状態では
好ましくないと言う事で悩んでいましたが今回のやり方で解決しました。

助かりました、ありがとうございました。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアカッーエッーカィ水ゥ アエコアアコウオ  書込者ノト:ロ 」 「 ン
モコ 

解決とさせて頂きます。


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

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






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