Delphiで何らかの大量なバッチ処理を行っている時フォームを間違ってクリックしてしまうと「応答なし」のメッセージが上部バーに出てプログラムが停止されてしまいます。カーソルで制御すれば何とかなると思うのですがお解かりの方教えて下さい。
私の知る限りでは,時間のかかる処理を実行する場合,
フォームを操作しても,「応答なし」にならないようにするのが一般的なようです.
また,その時間のかかる処理の実行を「キャンセル」する機能を持たせることもあるようです.
例えば,ファイルをダウンロードするのに時間がかかる場合等がそうです.
ただし,このようなコミュニティの場での質問では,質問された方が期待する動作を実現する,
という方向で解決するのが,不文律の慣習となっています.
で,カーソルの制御ということですが,
そのアプリをクライアント (お客様) に納入したとします.
「このパソコンのカーソルは,このアプリのフォームには触れません」
と説明したとします.
おそらく,この意味を理解できるクライアントは,ほとんどいないのではないかと思われます.
(どういう意味ですか ? と訊く人もいないと思いますが)
もう,一度,質問の文章を見直してみてはいかがでしょうか ?
質問のタイトルを書きなおす必要があれば,別のスレッドにすることも考えられます.
カーソル云々は難しそうなので、単純にフォームを見せないようにするのはどうでしょうか?
最小化して見せなくする方法
Application.Minimize;
Application.ProcessMessages; //不要かも
sleep(3000); //重たい処理
Application.Restore;
文字通り見せなくする方法
Hide;
Application.ProcessMessages; //不要かも
sleep(3000); //重たい処理
Show;
Mr.XRAYさん、deldel さん有難う御座います。
説明不足みたいで申し訳ありません。
カーソルとはTFormのCursorプロパティーの事です。以前何処かのサイトのサンプルプログラムで大量のバッチ処理を行う際、マウスのポインターが砂時計になりフォームに触れさせないルーチンがありました。Cursorプロパティーを変変更してやってみたのですがフォームをクリック出来てしまい質問した次第です。なにせサンプルプログラムを閲覧したのは5年以上前なので覚えていませんでした...お手数かけます。
Google 等の検索エンジンで
「時間のかかる処理 Delphi」
等で検索してみてはいかがでしょうか.
検索結果の中から,また別の語句で検索するとかですね.
すでに調べていたらゴメンナサイ.
個人的にも興味があったので色々やってそれなりにできました。
下記例では、Form1の全面にPanel1を置き、その上に他のコンポーネントを置いています。
(Form1.Enabledをいじってもカーソルが変化しなかったので・・・何故でしょ?)
var
OldCursor: TCursor;
lw: Longword;
begin
OldCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
Panel1.Enabled := False;
//Form1.Enabled := False; //これではカーソルが変化しない
try
Label1.Caption := '0';
for lw := 0 to 10000 do begin
Label1.Caption := IntToStr(StrToInt(Label1.Caption) + 1);
Application.ProcessMessages;
end;
finally
Screen.Cursor := OldCursor;
Panel1.Enabled := True;
//Form1.Enabled := True;
end;
すみません誤記でした
×Form1.Enabledをいじっても
○Form1.Enabledをいじったら
>//Form1.Enabled := False; //これではカーソルが変化しない
begin
OldCursor := Screen.Cursor;
Screen.Cursor := crHourGlass;
Application.ProcessMessages;
ですね.
Form1.Enabled := False; にする前に処理します.
これ,よくはまるケースですね.
[Vcl.Forms.TApplication.ProcessMessages]
http://docwiki.embarcadero.com/Libraries/XE5/ja/Vcl.Forms.TApplication.ProcessMessages
みなさん有難う御座いました。Application.ProcessMessagesをループ内に入れることで解決出来ました。一部開いていたDBが閉じてしまったりの症状がありましたプログラミングを入れて解決しました。
ツイート | ![]() |