TStringGridで特定の列のカラム数を変えるには

解決


小間のマグロ  2010-01-06 13:35:29  No: 36751  IP: [192.*.*.*]

StringGridで特定の列のカラム数を変えることはできますか?

例えば、偶数行はカラムの数が4つ、奇数行はカラムの数が2つ、とかです。

編集 削除
HOta  2010-01-06 14:25:55  No: 36752  IP: [192.*.*.*]

予めカラム数を4つにしておいて、OnDrawCellイベントで奇数行の場合に2つのセルの範囲を描き直せば出来ます。

編集 削除
小間のマグロ  2010-01-06 15:30:54  No: 36753  IP: [192.*.*.*]

う〜ん?
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を使って上書きのようなことをするんでしょうか?

そうなると、超アマの僕にはちょっと手に負えませんね・・

編集 削除
通りすがり  2010-01-06 16:00:24  No: 36754  IP: [192.*.*.*]

お邪魔します。
用途がわかりませんが、1つのセルを複数に分割するという手もあります。

編集 削除
そもそも  2010-01-06 17:19:33  No: 36755  IP: [192.*.*.*]

固定行(0行目)のカラムはどっちに合わせたいの?

編集 削除
HOta  2010-01-06 17:41:30  No: 36756  IP: [192.*.*.*]

1カラム目と2カラム目を1つのセルに見せるだけです。
DefaultDrawingをFalseにして、OnDrawCellイベントで書き直します。
OnDrawCellイベントで値をセットするのは無しです。
値は、1カラム目にセットします。

編集 削除
小間のマグロ  2010-01-06 18:30:26  No: 36757  IP: [192.*.*.*]

>固定行(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;

編集 削除
通りすがり  2010-01-06 18:46:31  No: 36758  IP: [192.*.*.*]

例えば、こんな感じでしょうか?

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;

編集 削除
すみません  2010-01-06 19:01:48  No: 36759  IP: [192.*.*.*]

Typesってのは何のユニットにあるんですか?

編集 削除
通りすがり  2010-01-06 19:05:51  No: 36760  IP: [192.*.*.*]

当方、BDS2006を使用しています。そこには Types(.pas)ユニットがあります。
以前から存在していたと思います。

編集 削除
通りすがり  2010-01-06 19:11:31  No: 36761  IP: [192.*.*.*]

Types.UnionRect(uRect,Rect,rRect);
の部分は
uRect := Rect;
uRect.Right := rRect.Right;
としても、この場合は構いませんけど。

編集 削除
小間のマグロ  2010-01-06 19:24:34  No: 36762  IP: [192.*.*.*]

できました!

通りすがりさんのやり方でうまくできました。
後は自分なりにいただいたコードを研究して生かしてみたいと思います。

ありがとうございます。

編集 削除