StringGrid に入れ子構造を作るには?

解決


isocchi  2008-06-06 16:00:42  No: 30917  IP: 192.*.*.*

2列2行のStringGridの各Cellの中に、それぞれ2列2行のStringGridを入れ子構造に作ることを考えていますが、手をつけるべき出発点がわかりません。
開発のヒントを下さい。

編集 削除
数年ぶりの通りすがり。  2008-06-10 01:51:00  No: 30918  IP: 192.*.*.*

ゴメン、StringGridの入れ子がよく解らない。

1、ビジュアル的に縦横の升目に更に升目を入れる?
2、配列の中に配列を入れる。
3、その他。

1は分らん。
3は聞かなわからん。

編集 削除
ぬこ  2008-06-10 08:18:47  No: 30919  IP: 192.*.*.*

2列2行の各セルに2列2行ってことは、4行4列じゃないの?
OnDrawCell、OnSelectCellを使えば、見た目も固定セルのような
セルにできるので、そんなに困らないと思うが?

編集 削除
isocchi  2008-06-10 13:06:41  No: 30920  IP: 192.*.*.*

一つのセル内に4つの選択肢を表示しマウスで選択可能とする。
というイメージなのですが・・・

編集 削除
ううう  2008-06-10 19:37:38  No: 30921  IP: 192.*.*.*

なんで StringGrid でなきゃいけないのでしょう?  4つの選択肢をマウスで
選択するだけじゃ不足なんですよね? その辺の事情を詳しく書かないと有益な
レスはつかないと思います。

編集 削除
KHE00221  2008-06-11 07:55:00  No: 30922  IP: 192.*.*.*

恐らくやりたいのはこんな事?

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  ARect: TRect; AState: TGridDrawState);
var
    Rect3: TRect;
    DC: HDC;
    procedure DrawFrame(ARect:TRect);
    begin
      DC := StringGrid1.Canvas.Handle;
      DrawEdge(DC, ARect, BDR_RAISEDINNER, BF_TOPLEFT);
      DrawEdge(DC, ARect, BDR_RAISEDINNER, BF_BOTTOMRIGHT);
      Dec(ARect.Bottom);
      Dec(ARect.Right);
      Inc(ARect.Top);
      Inc(ARect.Left);
      DrawEdge(DC, ARect, BDR_RAISEDOUTER, BF_TOPLEFT or BF_MIDDLE);
    end;

begin

    if ARow = 0 then
    begin
      if (ARow = 0) and (ACol <> 0) then
      begin
        StringGrid1.Canvas.Brush.Color := StringGrid1.FixedColor;
        if ACol mod 2 = 0 then
        begin
          Rect3 := Rect(ARect.Left-StringGrid1.ColWidths[ACol+1],ARect.Top,ARect.Right,ARect.Bottom);
        end
        else
        begin
          Rect3 := Rect(ARect.Left,ARect.Top,ARect.Right+StringGrid1.ColWidths[ACol+1],ARect.Bottom);
        end;
        DrawFrame(Rect3);
      end;
    end;

    if (ACol = 0)  then
    begin
      StringGrid1.Canvas.Brush.Color := StringGrid1.FixedColor;
      if ARow mod 2 = 0 then
      begin
        Rect3 := Rect(ARect.Left,ARect.Top-StringGrid1.RowHeights[ACol+1],ARect.Right,ARect.Bottom);
      end
      else
      begin
        Rect3 := Rect(ARect.Left,ARect.Top,ARect.Right,ARect.Bottom+StringGrid1.RowHeights[ACol+1]);
      end;
      DrawFrame(Rect3);
    end;

end;

編集 削除
ofZ  2008-06-11 12:59:20  No: 30923  IP: 192.*.*.*

Panelの上にSpeedButtonを2行2列で置いたのを用意するのは?

編集 削除
isocchi  2008-06-11 13:52:59  No: 30924  IP: 192.*.*.*

入れ子構造は私の技量では無理っぽいので、汎用性は放棄し、親Grid(2×2)の各cell上に子Grid(2×2)を4個配置し、親GridのOnClickイベントで子Grid(1〜4)にSetfocusすることにしました。貴重なアドバイスを下さいました皆様に感謝します。

編集 削除
isocchi  2008-06-11 13:53:55  No: 30925  IP: 192.*.*.*

↑解決です。

編集 削除