四角形があって、数値を入れる場所があるとします。
例えば数値を2といれると四角形に線が入って2分割されます。
同様に数値をいれるとその分だけ四角形が分割されるようにしたいのですが、どうすればスマートにできるか教えて下さい。
よろしくお願いします。
続けて質問すいません。
さらに2分割にしたとして、分割1、分割2にそれぞれに違う色を付けるなんことできますか?
よろしくお願いします。
4角を描いて色を付けるのなら、フォームにPaintBoxを貼り付けて、PaintBoxのCanvasにRectangle()で描くのが一番簡単だと思いますよ。
色はBrushで指定できます。
まずヘルプを見て、四角を一つ書いてみて、分からないところをまた質問してください。
Kennyさん
回答ありがとうございます。
とりあえず、四角を書いて見ました。
分割するには
現在の CanvasのXの値÷分割数 で出てきた値を
使用して線を描いていくやり方以外にありますか?
また分割したものを配列のように分割1のCanvas、分割2のCanvas・・・、
としていきたいのですが、できますか?
分割したものをそれぞれ違う処理をかけたいです。
よろしくお願いします。
では、まず基本方針を決めましょう。
四角の分割というのは、棒グラフのように同じ方向の分割だけですか?
それとも、「田」のように異方向分割にしますか?
異方向分割の場合、LineTo、MoveTo、FillRectの世界になってきて、力業でかなり面倒なことになってきます。
次に、何分割まで対応しますか? あまり多いと考え方も変わってきますし。
あと、1024*768ドットの画面を使うと仮定して、横方向に長い四角をベースにしましょう。
画面半分使ったとして横512ドットにすると、2分割だと一マス256ドットですが、13分割だと39.3846.....ドットになります。
しかし、TRectはドットに対応するためintegerですから、整数に限りますよね。
そうすると切り捨てて13*39=507、切り上げて520のどちらかに全体サイズが変わってしまいますから、
ここも小細工か割り切りが必要になってきます。
以上どうでしょうか。
Kennyさん
説明不足ですいません、丁寧にありがとうございます。
やはりひとつひとつ描いてくには面倒そうですね。
基本的には100くらいまで分割したいです。
棒グラフのようにたて方向のみの分割です。
Integerしか対応してないのですね…。
切捨てなり、サイズ変更なりそこは臨機応変に考えたいと思います。
さくっと作ってみました。とりあえずのお手軽基本形です。
フォームにButtonとEditとPaitnBoxを貼り付けてください。
Button1のOnClickから呼び出せるようにこのプロシージャをButton1.OnClickより上に貼り付けて、
procedure DrawManyRects(iCount: integer);
var k, iUnit: integer;
begin
if iCount<1 then exit;
iUnit:=512 div iCount;
with Form1.PaintBox1.Canvas do
begin
for k:=0 to iCount-1 do begin
Brush.Color:=$00000002*k;
Pen.Color:=Brush.Color;
Rectangle(iUnit*k, 0, iUnit*(k+1), 100)
end
end
end;
Buttonのイベントを
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawManyRects(StrToIntDef(Edit1.Text, 1))
end;
として、Editに適当な数字を入れてください。
色はBrush.Colorで指定するのですが、困るのは、100色目立って違う色を用意するのが難しいんことなんですよね。
私がよく使う手は、12色位を使い回しすることです。
ここでは簡単に赤のグラデーションにしましたけど、善じさんならあとは分かりますよね。
Pen.Colorも、黒で書くと升目の数が増えてきたときに見難くなるので、色々トライしてみてください。
6色巡りパターン。
procedure DrawManyRects(iCount: integer);
var k, iUnit, iColor: integer;
begin
if iCount<1 then exit;
iUnit:=512 div iCount;
with Form1.PaintBox1.Canvas do
for k:=0 to iCount-1 do begin
iColor:=k mod 6;
case iColor of
0:Brush.Color:=clBlue;
1:Brush.Color:=clYellow;
2:Brush.Color:=clRed;
3:Brush.Color:=clLime;
4:Brush.Color:=clAqua;
5:Brush.Color:=clWhite;
end;
Pen.Color:=Brush.Color;
Rectangle(iUnit*k, 0, iUnit*(k+1), 100);
end
end;
こんな感じで。
Kennyさん
どうもありがとうございます。
実際にじっこうしてみましたが、
Pen.Color:=Brush.Color;
実際に描く色を変更していますよね。
0:Brush.Color:=clBlue;
としたら最後までclBlueで描いてしまいます。
色を変更した後なにか更新するようなものとか入れなきゃだめなのですかね?
Kennyさん
ごめんなさい、私の確認不足でした!
できました。
あとは色々ためしてみます。
わかりやすく、ていねいな説明ありがとうございました。
ツイート | ![]() |