適当なタイトルが思いつかず、「〜について」という形式のタイトルに
なってしまい申し訳ございませんが、よろしくお願いします。
Form上にEditBoxが配置されています。以下のコードでEditBoxに「a」と入力すると「Miss」とメッセージが出ます。「OK」と出るはずなのにおかしいな、と思っています。なぜ、このコードで「Miss」と表示されてしまうのか、ご教授お願いします。
procedure TForm1.Edit1Change(Sender: TObject);
var
moji : string;
begin
if moji = 'a' then
ShowMessage('OK')
else
ShowMessage('Miss');
end;
mojiの内容が、'a'になることは絶対にありません。
ローカル変数mojiは、''に初期化されています。
嘘を書いてしまいました。
ローカル変数は、初期化されていません。
# そのため、偶然'a'になることがあるかもしれません
変数は初期化したほうがよいでしょう。
Edit1.Textの内容と'a'を比較したいのであれば、
if Edit1.Text='a' then ...
とするか、
moji := Edit1.Text;
としてから処理すると、期待通りの動作をすると思います。
こんにちは。
string に限って、ローカル変数でも初期化されるようです。(Delphi 6 の
場合)
ですから、moji は、'' に初期化されていると思います。
にしのさん、ご回答下さりどうもありがとうございます。
質問する上で簡潔なコードとするために、あれこれいじっているうちに聞きたいことと違うコードになっていました。これじゃあ、当然ダメですよね・・・
再度質問させてください。
var
mojiretu : string; // 実現部で宣言しています。
procedure TForm1.FormCreate(Sender: TObject);
begin
mojiretu := 'あい'
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text = mojiretu then
ShowMessage('OK')
else
ShowMessage('Miss');
end;
上記のコードで、IMEをOnにしてEditBoxに「あい」と入力してEnterキーを押すと「OK」と出たあと「Miss」とも出てしまいます。「OK」とだけ出てくれるのを期待しているのですが、無理でしょうか?何だか無理なような気がしてきました。
Kobさん、こんにちは。
最初のコードは間違えということでお願いします。
FormCreate時に'a'を入れておいたのですが書き忘れてしまいました。
また、「a」を入れたコードだと、きちんと「OK」と表示されます。
あれこれ、いじっているうちに変なコードをアップしてしまいました。
お手をわずらわせてしまいすみませんでした。
OnChangeはTextが変化すると呼ばれます。
IMEで「あい」と入力すると、1回で「あい」と入力しているように見えますが、「あ」「い」と送られています。
つまり、「あ」が入力されたときの'miss'が表示されるのです。
それと、missが表示されてからOKが出ますよね?
OKのダイアログをちょっとずらしてみてください。
# うちでは隠れて先に出ています。
もしタイミングが完全に逆であれば、OnChangeでShowMessage('miss')が実行される前に、次のメッセージが処理されているのかもしれません。
どちらにせよ、「あ」も処理されるために"miss"とでます。
>OnChangeはTextが変化すると呼ばれます。
>IMEで「あい」と入力すると、1回で「あい」と入力しているように見えます>が、「あ」「い」と送られています。
>つまり、「あ」が入力されたときの'miss'が表示されるのです。
なるほど!合点がいきました。1回で「あい」と入力しているわけではないのですね。
>それと、missが表示されてからOKが出ますよね?
はい。そうでした。OKが上に出ているから先に出たと早とちりしていました。
この方法では無理なので、何とかOnChangeを使った別の方法を考えてみようと思います。ご教授下さり、どうもありがとうございました。
解決済みでした。
ツイート | ![]() |