updownイベントのエラー処理について
お願いします。
たとえば1-100までの数値を入力してedit1に1ずつ増減させる
処理をupdownに組み込みます。その際に、edit1に101以上が入力された
場合などは、エラーメッセージを出力しexitするのですが、出力した後、
その数値を1-100に直すまでは何をクリックしてもupdownイベント関数に
とびます。
そこで、そのフォーム内にたとえば別のedit2があったとして
そのedit2に文字を入力したい場合はedit1でエラーメッセージを
消すまで、つまり1-100に修正してからじゃないとできないのでしょうか?
初心者なのはわかりますが、
なるべく問題が再現する最小ソースを見せていただけないと適切な回答はできません。
ある目的の動作があったとしても、その動作の手段は千差万別です。
あなたにとっては唯一の手段と思われる動作がそもそも見当違いの場合もよくあることです。
慣れないうちは問題が発生する最小コードを書くことが苦難かもしれませんが、
やはりそれこそ、自力で問題を解決する手段であり、他人にものを聞く姿勢だと思います。
てなわけでソースきぼんぬ。
でないと、答えるほうも漠然とした回答しかしてくれませんよ。
例)
エラーメッセージを出力しexitする前にエラー値を修正すればよい。
エラー再現出来ました!
質問の意味が判ったかもです^^。
procedure TForm1.UpDown1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
if strtoint(edit1.Text) > 100 then
begin
showmessage('エラーです');
exit;
end;
edit1.Text := inttostr(updown1.Position);
end;
こういうことですか??
確かに何やっても、
Updownイベントで発生するメッセージから抜けるのが大変ですね
もしビンゴなら、エラー処理を書く必要は無いです。
何もしなくても勝手に100に戻してくれます。
以下はエラーを再現出来なかった、正常に動いたコードです。
procedure TForm1.UpDown1Changing(Sender: TObject;
var AllowChange: Boolean);
begin
edit1.Text := inttostr(updown1.Position);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
updown1.Position := strtoint(edit1.Text);
end;
追伸です。
もし、Editからの100以上の数値の入力の即時防止が目的なら、
下記のをEdit1Changeに追記して出来ました。
参考になれば幸いです。
procedure TForm1.Edit1Change(Sender: TObject);
begin
if strtoint(edit1.Text) > 100 then
edit1.Text := '100';
updown1.Position := strtoint(edit1.Text);
end;
返信ありがとうございます。自分の返事も遅くなりました。
エラー処理を書く必要が無いというのがいまいち解せません。
edit入力欄とupdownが二つずつありそれに入力された値またはupdownで
決定した値で足し算をするプログラムなのです。
ですが計算ボタンを押した際に1-100ではない場合はメッセージを
表示したいのでエラー処理が必要になるのです。
たぶん再現したのであってると思います。ほぼ同じ内容になっています。
edit2にedit1を足すプログラムなのですね。
そう書き直してみました。
エラー処理しなくても良いといったのは、
「プログラムがedit1が100を超えたらエラーメッセージを出すだけ」と思い込んでいたからです。
(こちらの再現では)エラー処理(メッセージが)自体がループの原因になっていたからもあります。
また、こちらの勘違いもあります。
単に「メッセージを出すこと」=「エラー処理」、と早合点したからもあります。
プログラム上エラーを通知する必要があるのですね?
Delphiのバグなのか、そうでないのか、
合計が100超えた時に、Updownボタンを押して、
EditからチェンジイベントからShowmessageが呼び出されると、
何回か、フォームのどこを押してもUpdown1が押されてしまいます。
edit1からのShowmessageを取り消すと、そのバグは起きません(?_?)。
謎です。
WinXPにてDelphi3,Delphi7でそれぞれ実行してみましたが、
どちらも同じバグ(?)が出ました。
これの解決法はお手上げで解りませんでした^^;
以下がそのコードです。
バリバリの初心者コードですが^^;
procedure TForm1.FormCreate(Sender: TObject);
begin
updown1.Associate := edit1;
updown2.Associate := edit2;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if 100 < strtoint(edit1.Text)+ strtoint(edit2.text) then begin
edit1.Text := inttostr(100 - strtoint(edit2.Text));
showmessage('エラーです');
end;
if 100 < strtoint(edit1.Text) then begin
edit1.Text := '100';
showmessage('エラーです');
end;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
Edit1Change(Sender);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit2.Text := inttostr(strtoint(edit2.Text) + strtoint(edit1.Text));
if 100 < strtoint(edit1.Text)+ strtoint(edit2.text) then begin
edit1.Text := '0';
edit2.Text := '100';
showmessage('エラーです');
end;
end;
> その数値を1-100に直すまでは何をクリックしてもupdownイベント関数に
> とびます。
これですが、
> 理由は、メッセージを表示することにより、MouseUpメッセージを UpDownコン
> トロールが受け取れないため、ボタンを押されたままになっているということ
> でした。(仕様です)
こちらより引用
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=069566
この辺のスレッドを読んでみてください
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=069562
http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=069276
Delphi大好きさんいつもありがとうございます。
ほぼ言いたい事を理解いただき、また再現ソースまで提示いただき
心よりお礼申し上げます。
ofZさんのURLを見た感じ仕様のようで・・・。
バリバリの初心者よりも初心者の私には少し難しいですね。
他の方法でなんとかエラー処理をしてメッセージ表示させるのか
もしくはわからないまま
with TUpDown(Sender) do begin
P := MakeLong(Width div 2, Height div 2);
PostMessage(Handle, WM_LBUTTONDOWN, 0, P); // (1)
PostMessage(Handle, WM_LBUTTONUP, 0, P);
end;
を追加するのがいいのか悩んでみます。
仕様ということですので一応解決ということにさせていただきます。
monaaさん、Delphi大好きさん、ofZさんありがとうございました。
解決済みにしてませんでした。
パネルを加工して、
偽ウインドウを作ってみては??
ウインドウでは無いから、ウインドウメッセージは出ないので、
バグは出ない筈・・・
ツイート | ![]() |