フォームに触れなくするカーソルは?

解決


斉藤  2014-05-09 21:57:55  No: 46297

Delphiで何らかの大量なバッチ処理を行っている時フォームを間違ってクリックしてしまうと「応答なし」のメッセージが上部バーに出てプログラムが停止されてしまいます。カーソルで制御すれば何とかなると思うのですがお解かりの方教えて下さい。


Mr.XRAY  2014-05-11 19:02:26  No: 46298

私の知る限りでは,時間のかかる処理を実行する場合,
フォームを操作しても,「応答なし」にならないようにするのが一般的なようです.
また,その時間のかかる処理の実行を「キャンセル」する機能を持たせることもあるようです.
例えば,ファイルをダウンロードするのに時間がかかる場合等がそうです.

ただし,このようなコミュニティの場での質問では,質問された方が期待する動作を実現する,
という方向で解決するのが,不文律の慣習となっています.

で,カーソルの制御ということですが,
そのアプリをクライアント (お客様) に納入したとします.

「このパソコンのカーソルは,このアプリのフォームには触れません」

と説明したとします.
おそらく,この意味を理解できるクライアントは,ほとんどいないのではないかと思われます.
(どういう意味ですか ? と訊く人もいないと思いますが)
もう,一度,質問の文章を見直してみてはいかがでしょうか ?
質問のタイトルを書きなおす必要があれば,別のスレッドにすることも考えられます.


deldel  2014-05-12 19:32:19  No: 46299

カーソル云々は難しそうなので、単純にフォームを見せないようにするのはどうでしょうか?

最小化して見せなくする方法
  Application.Minimize;
  Application.ProcessMessages; //不要かも
  sleep(3000); //重たい処理
  Application.Restore;

文字通り見せなくする方法
  Hide;
  Application.ProcessMessages; //不要かも
  sleep(3000); //重たい処理
  Show;


斉藤  2014-05-13 00:01:55  No: 46300

Mr.XRAYさん、deldel さん有難う御座います。
説明不足みたいで申し訳ありません。
カーソルとはTFormのCursorプロパティーの事です。以前何処かのサイトのサンプルプログラムで大量のバッチ処理を行う際、マウスのポインターが砂時計になりフォームに触れさせないルーチンがありました。Cursorプロパティーを変変更してやってみたのですがフォームをクリック出来てしまい質問した次第です。なにせサンプルプログラムを閲覧したのは5年以上前なので覚えていませんでした...お手数かけます。


Mr.XRAY  2014-05-13 00:57:37  No: 46301

Google 等の検索エンジンで

「時間のかかる処理 Delphi」

等で検索してみてはいかがでしょうか.
検索結果の中から,また別の語句で検索するとかですね.
すでに調べていたらゴメンナサイ.


deldel  2014-05-13 19:43:37  No: 46302

個人的にも興味があったので色々やってそれなりにできました。
下記例では、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;


deldel  2014-05-13 19:44:53  No: 46303

すみません誤記でした
×Form1.Enabledをいじっても
○Form1.Enabledをいじったら


Mr.XRAY  2014-05-13 20:29:33  No: 46304

>//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


斉藤  2014-05-13 20:30:42  No: 46305

みなさん有難う御座いました。Application.ProcessMessagesをループ内に入れることで解決出来ました。一部開いていたDBが閉じてしまったりの症状がありましたプログラミングを入れて解決しました。


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

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






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