StringGridで特定の列のカラム数を変えることはできますか?
例えば、偶数行はカラムの数が4つ、奇数行はカラムの数が2つ、とかです。
予めカラム数を4つにしておいて、OnDrawCellイベントで奇数行の場合に2つのセルの範囲を描き直せば出来ます。
う〜ん?
OnDrawCellのイベントで次のようなコードを書いてみたのですが、
if ARow mod 2=0 then
begin
SG1.ColWidths[0] := 150;
SG1.ColWidths[1] := 150;
SG1.ColWidths[2] := 0;
SG1.ColWidths[3] := 0;
end;
全部の列がこの設定になってしまいます。
APIを使って上書きのようなことをするんでしょうか?
そうなると、超アマの僕にはちょっと手に負えませんね・・
お邪魔します。
用途がわかりませんが、1つのセルを複数に分割するという手もあります。
固定行(0行目)のカラムはどっちに合わせたいの?
1カラム目と2カラム目を1つのセルに見せるだけです。
DefaultDrawingをFalseにして、OnDrawCellイベントで書き直します。
OnDrawCellイベントで値をセットするのは無しです。
値は、1カラム目にセットします。
>固定行(0行目)のカラムはどっちに合わせたいの?
奇数行はカラムの数が4つ、偶数行は2つ、って言うふうにして、奇数行はステータス、偶数行は直前のステータスの中の内容を表示するようにしたかったのです。
>DefaultDrawingをFalseにして、OnDrawCellイベントで書き直します。
>OnDrawCellイベントで値をセットするのは無しです。
DefaultDrawingをFalseにしてみても、Form1.Createの中で値をセットしてみたりしたけど、思うようになりませんでした。
procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
for i:=0 to SG1.RowCount-1 do
begin
if i mod 2=0 then
begin
SG1.ColWidths[0] := 150;
SG1.ColWidths[1] := 150;
SG1.ColWidths[2] := 0;
SG1.ColWidths[3] := 0;
end;
end;
end;
例えば、こんな感じでしょうか?
procedure TForm1.FormCreate(Sender: TObject);
begin
SG1.DefaultColWidth := 40;
SG1.DefaultRowHeight := 20;
SG1.ColCount := 4;
SG1.RowCount := 5;
SG1.FixedCols := 0;
SG1.FixedRows := 1;
SG1.DefaultDrawing := False;
//
SG1.Rows[0][0] := '時刻';
SG1.Rows[0][1] := '温度';
SG1.Rows[0][2] := '流量';
SG1.Rows[0][3] := '判定';
SG1.Rows[1][0] := '運転開始';
SG1.Rows[1][2] := '通常状態';
SG1.Rows[2][0] := '18:37';
SG1.Rows[2][1] := '135℃';
SG1.Rows[2][2] := '21t';
SG1.Rows[2][3] := '0.1';
SG1.Rows[3][0] := '運転中';
SG1.Rows[3][2] := '臨界状態';
SG1.Rows[4][0] := '20:55';
SG1.Rows[4][1] := '365℃';
SG1.Rows[4][2] := '26t';
SG1.Rows[4][3] := '1.9';
end;
procedure TForm1.SG1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
var
uRect, rRect: TRect;
begin
uRect := Rect;
//
if Odd(ARow) then
begin
if not Odd(ACol) then
begin
rRect := SG1.CellRect(ACol+1,ARow);
Types.UnionRect(uRect,Rect,rRect);
SG1.Canvas.FillRect(uRect);
end;
end;
//
SG1.Canvas.TextOut(uRect.Left+1,uRect.Top+1,SG1.Cells[ACol,ARow]);
end;
Typesってのは何のユニットにあるんですか?
当方、BDS2006を使用しています。そこには Types(.pas)ユニットがあります。
以前から存在していたと思います。
Types.UnionRect(uRect,Rect,rRect);
の部分は
uRect := Rect;
uRect.Right := rRect.Right;
としても、この場合は構いませんけど。
できました!
通りすがりさんのやり方でうまくできました。
後は自分なりにいただいたコードを研究して生かしてみたいと思います。
ありがとうございます。
ツイート | ![]() |