お世話になっております。
Delphi2007,XPです。
Shapeを置き、
Shape=stRectangle
Pen.Style=psDot
にすると、辺が点々の長方形になりますが、
この点々を、動いているように見せたいのです。
具体的には、Timerを置いて、1秒ごとに、長方形の辺の点の部分と空白の部分が入れ替わるみたいな感じにしたいのです。
Pen.StyleとかPen.Modeとかをいろいろいじっていますが、思うとおりになりません。
よろしくお願いします。
Shapeでは実現が難しいので、Imageなどを置いて自分で描画するのはどうでしょう。
Rectangleの変わりにLineToで長方形の四辺を描画するようにし、
開始点を少しずつずらしていけば原理的には点線が動いているように見えます。
procedure TForm1.FormCreate(Sender: TObject);
begin
// ずらす量を管理する変数を用意
FOffset := 0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
rc: TRect;
begin
FOffset := (FOffset + 1) mod 6; // pdDotの場合、繰り返し周期は3+3=6みたい
rc := Image1.ClientRect;
Dec(rc.Right); // Rectangleは矩形の右と下の端を含まないので、それに合わせて調整
Dec(rc.Bottom);
with Image1.Canvas do
begin
Pen.Style := psDot;
MoveTo(rc.Left + FOffset, rc.Top); // offset分ずれた位置から点線を引き始める
LineTo(rc.Right, rc.Top); // 上
LineTo(rc.Right, rc.Bottom); // 右
LineTo(rc.Left, rc.Bottom); // 下
LineTo(rc.Left, rc.Top); // 左
LineTo(rc.Left + FOffset, rc.Top); // 最後に開始点とつなぐ
end;
end;
中も塗りつぶしたい場合は、線を引く前にFillRectしてください。
さて、実際にやってみるとわかりますが、これだけだと辺の長さの合計が6の倍数でない場合、始点が0に戻る時に左上隅が不自然に動きます。
気になるようだったら、始点が長方形をぐるりと一周するように改良してみてください。
不連続が発生しないようちょっと修正
...
rc := Image1.ClientRect;
// ClientRect以外の領域に描画する場合、矩形の外にはみ出さないよう
// ここでクリッピング領域を設定しなくてはいけない。
// やり方はTCanvas.ClipRectのヘルプにあるExampleを参照
Dec(rc.Right); // Rectangleでは矩形の右と下の端を含まないお約束なので、それに合わせて調整
Dec(rc.Bottom);
with Image1.Canvas do
begin
Pen.Style := psDot;
MoveTo(rc.Left - FOffset, rc.Top); // offset分はみ出した位置から点線を引き始める
LineTo(rc.Right, rc.Top); // 上
LineTo(rc.Right, rc.Bottom); // 右
LineTo(rc.Left, rc.Bottom); // 下
LineTo(rc.Left, rc.Top); // 左
end;
end;
ありがとうございます。
Adobeのイラストレーターのように、Imageの上に描画した画像や文字を、ドラッグして移動するプログラムを作っていました。
教えてもらったようにImageに点々を描くと、元のImageと点々用のImageが重なってしまい、画像や文字がドラッグできなくなってしまったので、Imageではなく、PaintBoxを置き、PaintBoxのEnable=Falseにしてみました。
そうすると、元のImageの上にある画像や文字がドラッグできましたし、点々も動きました。
ありがとうございました。
ツイート | ![]() |