喫茶XRAYトップページ

[▲前のスレッド]

[7523] StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/22 (火) 11:38:15 taki
列によって数字と文字の入力を切り替えたいと思いました。

http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200604/200604_06040024.html
http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00034.html

を参考にしました。

imOpen,imHira,imCloseは正常に動作するのですが、
imCloseの代わりにimDisableを使うとうまく動きません。の報告です。

Windows7 Pro + Microsoft Office IME 2010 SP2
Delphi XE4 Starter

新規作成
フォームにStringGrid1,StringGrid2を配置
オブジェクトインスペクタより
OptionのgoEditing,goAlwaysShowEditor,goTabsをTrueに設定

以下コードです。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids;

type
  _TGrid = class(TCustomGrid);    // 継承のクラス

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
      var Value: string);
    procedure StringGrid2GetEditText(Sender: TObject; ACol, ARow: Integer;
      var Value: string);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// 継承を使う方法
procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
begin
  with TEdit(_TGrid(Sender).InplaceEditor) do
    case ACol of
     1: ImeMode := imHira;  // Openと同じ
     2: ImeMode := imClose; // imDisableを使うと変になる
     3: ImeMode := imOpen;
     4: ImeMode := imClose;
    end;
end;

// SetImeMode()を使う方法
procedure TForm1.StringGrid2GetEditText(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
begin
  case ACol of
   1: SetImeMode( Handle, imHira  );
   2: SetImeMode( Handle, imClose );  // imDisableを使うと変になる
   3: SetImeMode( Handle, imOpen  );
   4: SetImeMode( Handle, imClose );
  end;
end;

end.

ちなみに、継承を使う方法は理解できていません。マスターすみません。(^^;


[7524] Re:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/22 (火) 11:49:33 taki
すみません。
「imDisableを使うとうまく動きません。」の意味は
その列だけではなく、StringGrid全体でのIMEの動作が変になります。


[7526] Re2:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/23 (水) 10:13:07 snail
▼ takiさん

>imCloseの代わりにimDisableを使うとうまく動きません。の報告です。

とあるので以前の質問の続きでしょうか?
話の前が見えていなせんが

http://mrxray.on.coocan.jp/Delphi/plSamples/083_InplaceEditor.htm

は参考にされているのでしょうか。



[7527] Re3:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/23 (水) 10:38:30 Mr.XRAY
▼ snailさん

> とあるので以前の質問の続きでしょうか?
> 話の前が見えていなせんが


現象の報告ではないかと.
後で調べてみようと思っています.

>http://mrxray.on.coocan.jp/Delphi/plSamples/083_InplaceEditor.htm

この記事もいろいろ書いてあるので,読む人は迷ってしまうでしょうね.
だから「難解」なのか ?


▼ takiさん

>ちなみに、継承を使う方法は理解できていません。マスターすみません。(^^;

「継承」なんて難しいのは使わないでください.なんちゃって (笑)
でも,みんな自然に使っているんですよね.
用語なんて,用語の意味なんて,どうでもいいです.使っているんだかから.
「勝てば官軍,動けば正義」です.ハイ.


[7528] クラスとコンポーネント返信 削除
2014/4/23 (水) 11:17:14 Mr.XRAY
思いついた時に書いておかないと忘れてしまうので.

Delphi では,フォーム等に配置して使用する場合,
コンポーネントと言っているようです.
つまり,IDE のコンポーネントのパレットに表示されるものと言うことになります.

ただ,「このコンポーネントはインストールしないで使用します」
と書いている「コンポーネント(?)」もあります.

コンポーネントは,つまり「クラス」です.
プログラムの世界以外でも「コンポーネント」という言葉は使われています.
ある意味では,単なるクラスも,コンポーネントという言い方をしても,
決しておかしいとは思っていません.

あまり厳密に考えることはないと,個人的には思っています.
「いや,あんたの,その考え方はおかしい」
という方の反論は....  どうしようかな,受け付けようかな?


[7529] Re4:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/23 (水) 13:27:22 taki
▼ snailさん、マスター

> > とあるので以前の質問の続きでしょうか?
> > 話の前が見えていなせんが


混乱させてすみません。

http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200604/200604_06040024.html

には、imDisableが使われていますが、動作が変になった。と言いたかっただけです。

マスターの
http://mrxray.on.coocan.jp/Delphi/plSamples/083_InplaceEditor.htm
のコードは使っていません。

問題が起きたのは私が示している<7523>のコードだけです。

「〜の報告です。」という表現がよくありませんでした。

http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200604/200604_06040024.html
「参考コードにはimDisableが使われていますが、私の環境ではうまく動作しませんでした。
しかし、imCloseだとうまく動作しました。」
と表現すべきでした。反省してます。


[7530] Re5:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/23 (水) 14:50:32 taki
マスターの
http://mrxray.on.coocan.jp/Delphi/plSamples/083_InplaceEditor.htm
の中の
「01_TStringGrid - GetEditTextイベントで処理」だけですが試してみました。

私の環境だけかもしれませんが、imDisableだとIMEがうまく制御できません。
Row1,Col1だけ日本語入力ができましたが、Row1,Col2でDisableの状態になると、
Row2,Col1に入ってもDisableのままでした。
また、セルを移動する度にIMEも「あ」と「A」が頻回に切り替わります。
imDisableの代わりにimCloseを使うとうまく制御できました。

私のPC環境
Windows 7 Professional SP1 32bit
Microsoft Office IME 2010 (14.0.7003.1000) SP2
Delphi XE4 Starter 、DelphiXE4 and C++BuilderXE4 Update1 適用済み
での現象です。


[7531] Re6:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/23 (水) 16:51:26 taki
コンパイルしたプログラムをお客さんのPCにコピーして試してみました。
結果は[7530]と同じでした。

お客さんのPCはWindows8.1です。


[7533] Re7:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/23 (水) 23:50:40 snail
▼ takiさん
> コンパイルしたプログラムをお客さんのPCにコピーして試してみました。
> 結果は[7530]と同じでした。


細かいところはみていませんが 02_TStringGrid_class で私も確認しました。
環境は Win7 64bit + XE2。

明日は車で 300 Km以上移動なので今日は寝ます。


[7537] Re8:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/24 (木) 16:19:13 Mr.XRAY
▼ snailさん
▼ takiさん

少し前にやった時は,再現した.と思ったのですが,勘違いでした.
今やってみましたが,当方では,現在のところ,再現していません.

環境は Win7 64bit + XE2(UP4) Pro です.
日本語 IME は Microsoft Office IME 2010 です.
2010 の後に,特にバージョンを表示する数値はないです(設定ダイアログで確認).

さて,困ったな〜.


[7538] Re9:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/24 (木) 16:45:45 Mr.XRAY
▼ snailさん
▼ takiさん

> 少し前にやった時は,再現した.と思ったのですが,勘違いでした.
> 今やってみましたが,当方では,現在のところ,再現していません.


再現しました!!
 taki さんの,最初の環境が Delphi XE4 だったので,

Windows 7 U64(SP1) + Delpi XE4(UP1) + Microsoft Office IME 2010

でコンパイルして,IDE 上,作成した EXE でも再現しました.
これはこれで困ったな〜.
あれっ?! snail さんは,XE2 で発生しているんですね.
さらに,う〜ん.


[7539] Re10:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/24 (木) 22:14:00 snail
▼ Mr.XRAYさん
>
> あれっ?! snail さんは,XE2 で発生しているんですね.
> さらに,う〜ん.


朝会社を出る前に少し見ていました。

Option の goAlwaysShowEditor を入れるともっと困ったことに、


今日はすでに酔っ払いモード、続きはまた明日。
こうして毎日が過ぎていく。

[7540] 誰か私を助けてください返信 削除
2014/4/25 (金) 00:00:43 Mr.XRAY
しかし,参った!!
一体どうやって,原因を探ればいいのでしょう?
今のところ確実なのは,管理者権限(IDE) から実行しても,一般ユーザで
実行しても現象には影響はないらしい.

誰が教えてくださーい !!
とりあえず寝よう....


[7541] Re:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/25 (金) 00:51:07 Mr.XRAY
▼ takiさん
▼ snailさん

そして,このスレッドをご覧の皆さま.

http://mrxray.on.coocan.jp/Delphi/plSamples/083_InplaceEditor.htm
の「01_TStringGrid - GetEditTextイベントで処理」ですが,

以下のようにしてみてください.
どうなるか.私の環境 Win 7 + Delphi XE4 VCL-32, 64 共
IME の切り換えができました.

    hInpEdit := InpEdit.Handle;
    if ACol = 1 then begin
      SetImeMode(hInpEdit, imHira);
    end else begin
      Win32NLSEnableIME(hInpEdit, False); //これに変更
//    SetImeMode(hInpEdit, imDisable);  //これは使わない
    end;

眠い....

結果待ちで,掲載サンプルのコードを修正したいと思います.

# スレッドが長くなりましたので,ここに書きました

参考
[たたみやのホームページ - IMEの制御]
http://hp.vector.co.jp/authors/VA015730/delphi/TipsTips.html#IME%E3%81%AE%E5%88%B6%E5%BE%A1

[Vcl.Controls.Win32NLSEnableIME - RAD Studio API Documentation]
http://docwiki.embarcadero.com/Libraries/XE5/ja/Vcl.Controls.Win32NLSEnableIME


[7542] Re2:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/25 (金) 09:28:38 taki
▼ Mr.XRAYさん

>       Win32NLSEnableIME(hInpEdit, False); //これに変更
> //    SetImeMode(hInpEdit, imDisable);  //これは使わない


正常に動くようになりました。
お客さんのPCでも大丈夫です。
えっ、客のPCをテストに使うなって。(^_^;

> 眠い....
>
> 結果待ちで,掲載サンプルのコードを修正したいと思います.


お疲れ様でした。


[7543] Re3:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/25 (金) 10:23:11 Mr.XRAY
▼ takiさん

> えっ、客のPCをテストに使うなって。(^_^;

全く問題ありません.
マイクロソフトだって,全世界のユーザをテストに使っていますから.

最近,夜の11時過ぎると,急激に眠くなるんですよね.
気になるので,寝る前に調べたのですが,終わったら....パタン.
気が付いたら朝なんです.ハハハッ.

原因なのですが,
Delphi XE, XE2, XE4 のソースコードを調べたら,
これは,Delphi のバグというより,Windows API のバグではないかと思います.
Windows のバグを回避するコードを書いていない,という意味では
Delphi のバグとも言えなくはないですが.

Win32NLSEnableIME は内部で Windows API の WINNLSEnableIME を実行している
だけなんですが,MSDN の記事では,この関数は使うなと書いてあります.
でも,そんなこと言ったってね.
 2011年7月6日の Microsoft のサポート記事にも,この関数の使い方が
書いてあるぐらいですから,問題ないと思います.
この点も,サンプルの記事に追加しておきます.

# 連休中にお仕事ができてしまった ?!


[7546] Re3:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/25 (金) 11:08:37 snail
▼ takiさん

さすが若い、朝早くまでがんばれますね。
私は早く寝たのはいいけど胃食道逆流で死んでいました。

ところで、たたみやさんのHPに

http://hp.vector.co.jp/authors/VA015730/delphi/TipsTips.html

>procedure ImeOnOff(const winctr :TWinControl; const status:boolean);
> var Imc:HIMC;
>begin
> winctr.SetFocus;
> if status then Win32NLSEnableIME(winctr.Handle,true) else Win32NLSEnableIME(winctr.Handle,false);
>                            // MS-IMEでは上記のようにします。win98以降のもの?
> Imc := ImmGetContext(winctr.Handle);
> if status then ImmSetOpenStatus(imc,true) else ImmSetOpenStatus(imc,false);
> ImmReleaseContext(winctr.Handle, Imc);
>//その他のIME(Atokなど)では、上の3行でOKみたいです。
>end;


という記事がありました。IMEによって動作の違いがあるようですね。
ちなみに私は ATOK です。
また後から色々と確認してみます。



[7547] Re4:StringGridでIMEをコントロールしたんですが・・・返信 削除
2014/4/25 (金) 11:19:45 Mr.XRAY
▼ snailさん

> という記事がありました。IMEによって動作の違いがあるようですね。

なるほど,そのあたりも考える必要がありそうですね.
サンプルプログラム集の修正はちょっと待ちます.


[7548] 日本語 IME の Disable 操作返信 削除
2014/4/26 (土) 09:59:19 Mr.XRAY
考えてみたら,ATOK はもってないし.で,とりあえず更新しましたです.

[083_TStringGrid 等のセル編集とインプレイスエディタ]
http://mrxray.on.coocan.jp/Delphi/plSamples/083_InplaceEditor.htm


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82