Sleepの動作について

解決


ソノキネ  2005-03-11 23:04:47  No: 13706

Sleepがうまく動きません.

Image1.Canvas.Draw(0,0,BMP1);
sleep(500);
Image1.Canvas.Draw(0,0,BMP2);
sleep(500);
Image1.Canvas.Draw(0,0,BMP3);

しばらく待った後,なぜか一気にBMP3を表示してしまいます.
何故?なお,Delphi6  personalです.


にしの  2005-03-11 23:21:53  No: 13707

Sleepの各行の前に、
Application.ProcessMessages;
を入れてみてください。


ソノキネ  2005-03-12 00:18:46  No: 13708

ご回答ありがとうございます.
にしのさんのアドバイスに従い,
以下のように修正してみました.

 Image1.Canvas.Draw(0,0,BMP1);
 Application.ProcessMessages;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP2);
 Application.ProcessMessages;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP3);

しかし,以前と変わらない実行結果となってしまいました.


ふぐちゃん  2005-03-12 00:24:35  No: 13709

かわりに
Image1.Invalidate;
を入れてみてはどうでしょう?


ソノキネ  2005-03-12 02:49:21  No: 13710

かわりにというと,以下のようでいいのでしょうか.

 Image1.Canvas.Draw(0,0,BMP1);
 Image1.Invalidate;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP2);
 Image1.Invalidate;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP3);

残念ながら,結果はかわりませんでした.


ふぁ  2005-03-12 03:01:45  No: 13711

Image1.Refresh;
では?


Syake  2005-03-12 03:12:37  No: 13712

Image1.Canvas.Draw(0,0,BMP1);
 Image1.UpDate;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP2);
 Application.ProcessMessages;
Image1.UpDate;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP3);
Image1.UpDate;
ならば。


ふぐちゃん  2005-03-12 03:12:55  No: 13713

> 残念ながら,結果はかわりませんでした.
すみません、ふぁさんが書いておられるRefreshが正しいです。


にしの  2005-03-12 03:14:48  No: 13714

BMP1,BMP2,BMP3が同じ画像、というオチはないですよね^^;
Delphi7 Pro, WinXP Pro, Pentium4 3.0GHz, Memory 1GBで試したところ、

・Application.ProcessMessages;の場合、OK
・Image1.Invalidate;の場合、NG(おそらく、WM_PAINTなどのメッセージが飛ぶだけで、Sleep時に実行できないせい)
・Image1.Refresh;の場合、OK

でした。


にしの  2005-03-12 03:18:10  No: 13715

追試験。
Updateの場合、OK。
ただし、Image1.Update;は、Parentに対してUpdateするのと同じで、最終的にはFormのハンドルに対して、UpdateWindowを呼び出しています。
ちょっと冗長かと。


ふぐちゃん  2005-03-12 03:18:27  No: 13716

私の環境ではRefreshもUpdateもOKでした。
この場合はどちらでもよさそうです。


Syake  2005-03-12 03:18:39  No: 13717

あっ。
Application.ProcessMessages;
が駄目なら、UpDateも駄目かな。(^_^;)


ソノキネ  2005-03-12 03:46:56  No: 13718

みなさん,いろいろな回答ありがとうございます.
Refresh,Update共に試してみましたが,だめでした.

> BMP1,BMP2,BMP3が同じ画像、というオチはないですよね^^;
これは,一番最初にチェックしたので大丈夫です.

もしかしたら,プログラムの他の部分でミスがあるのでしょうか.
以下がプログラムの全文です.

interface
uses
  Windows, Messages, SysUtils, Classes,
  Graphics, Forms, ExtCtrls, Controls;
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
var
 BMP1,BMP2,BMP3 : TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Form1.DoubleBuffered:=true;
 BMP1:=TBitmap.Create;
 BMP2:=TBitmap.Create;
 BMP3:=TBitmap.Create;
 BMP1.LoadFromFile('bmp01.bmp');
 BMP2.LoadFromFile('bmp02.bmp');
 BMP3.LoadFromFile('bmp03.bmp');

 Image1.Canvas.Draw(0,0,BMP1);
 Image1.Refresh;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP2);
 Image1.Refresh;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP3);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 BMP1.Free;
 BMP2.Free;
 BMP3.Free;
end;
end.


ふぐちゃん  2005-03-12 04:03:47  No: 13719

OnCreateに書くのはまずいです。
OnCreateの時点ではフォームすら表示されていないです。
ボタンのイベントハンドラなどで試されてはどうですか?


ソノキネ  2005-03-12 04:22:48  No: 13720

ふぐちゃんさん,ありがとうございます.
アドバイス通りにやったところ無事解決しました.

> OnCreateに書くのはまずいです。
> OnCreateの時点ではフォームすら表示されていないです。

delphiを始めたばかりとはいえ,こういったところを
全然理解できていませんでした.

回答を下さったみなさん,どうもありがとうございました.


Mr.XRAY  URL  2005-03-12 04:33:58  No: 13721

解決ということですが,ついでに...
一般にCanvasへの描画は重ね描画の時に使用します.
また,単一の画像を表示する時は,Pictureを使用するといいでしょう.
今回の目的がどちらかはわかりまんが,例えば以下のコードを,
サイズの違うビットマップで動作させてみると違いがわかります.
(できればBMP01を一番サイズの大きいものにすると,なおBetter)

// 単一の画像の表示なら

procedure TForm1.Button1Click(Sender: TObject);
begin
 Image1.Picture.Assign(BMP1);
 Image1.Refresh;
 sleep(500);
 Image1.Picture.Assign(BMP2);
 Image1.Refresh;
 sleep(500);
 Image1.Picture.Assign(BMP3);
 Image1.Refresh;
end;

// Canvasは重ね書きに

procedure TForm1.Button2Click(Sender: TObject);
begin
 if Image1.Picture.Graphic<>nil then Image1.Picture.Graphic:=nil;
 Image1.SetBounds(0,0,ClientWidth,ClientHeight);
 Image1.Canvas.Draw(0,0,BMP1);
 Image1.Refresh;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP2);
 Image1.Refresh;
 sleep(500);
 Image1.Canvas.Draw(0,0,BMP3);
 Image1.Canvas.Font.Size:=20;
 Image1.Canvas.TextOut(10,10,'テスト');
end;


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

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






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