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です.
Sleepの各行の前に、
Application.ProcessMessages;
を入れてみてください。
ご回答ありがとうございます.
にしのさんのアドバイスに従い,
以下のように修正してみました.
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);
しかし,以前と変わらない実行結果となってしまいました.
かわりに
Image1.Invalidate;
を入れてみてはどうでしょう?
かわりにというと,以下のようでいいのでしょうか.
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);
残念ながら,結果はかわりませんでした.
Image1.Refresh;
では?
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;
ならば。
> 残念ながら,結果はかわりませんでした.
すみません、ふぁさんが書いておられるRefreshが正しいです。
BMP1,BMP2,BMP3が同じ画像、というオチはないですよね^^;
Delphi7 Pro, WinXP Pro, Pentium4 3.0GHz, Memory 1GBで試したところ、
・Application.ProcessMessages;の場合、OK
・Image1.Invalidate;の場合、NG(おそらく、WM_PAINTなどのメッセージが飛ぶだけで、Sleep時に実行できないせい)
・Image1.Refresh;の場合、OK
でした。
追試験。
Updateの場合、OK。
ただし、Image1.Update;は、Parentに対してUpdateするのと同じで、最終的にはFormのハンドルに対して、UpdateWindowを呼び出しています。
ちょっと冗長かと。
私の環境ではRefreshもUpdateもOKでした。
この場合はどちらでもよさそうです。
あっ。
Application.ProcessMessages;
が駄目なら、UpDateも駄目かな。(^_^;)
みなさん,いろいろな回答ありがとうございます.
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.
OnCreateに書くのはまずいです。
OnCreateの時点ではフォームすら表示されていないです。
ボタンのイベントハンドラなどで試されてはどうですか?
ふぐちゃんさん,ありがとうございます.
アドバイス通りにやったところ無事解決しました.
> OnCreateに書くのはまずいです。
> OnCreateの時点ではフォームすら表示されていないです。
delphiを始めたばかりとはいえ,こういったところを
全然理解できていませんでした.
回答を下さったみなさん,どうもありがとうございました.
解決ということですが,ついでに...
一般に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;
ツイート | ![]() |