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

解決


小間のマグロ  2010-01-06 22:35:29  No: 36751

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

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


HOta  2010-01-06 23:25:55  No: 36752

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


小間のマグロ  2010-01-07 00:30:54  No: 36753

う〜ん?
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-07 01:00:24  No: 36754

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


そもそも  2010-01-07 02:19:33  No: 36755

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


HOta  2010-01-07 02:41:30  No: 36756

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


小間のマグロ  2010-01-07 03:30:26  No: 36757

>固定行(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-07 03:46:31  No: 36758

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

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-07 04:01:48  No: 36759

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


通りすがり  2010-01-07 04:05:51  No: 36760

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


通りすがり  2010-01-07 04:11:31  No: 36761

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


小間のマグロ  2010-01-07 04:24:34  No: 36762

できました!

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

ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加