stringgridの結合後で横にスクロールすると

解決


たかやま  2011-06-08 05:41:09  No: 40646

現在stringgridの結合で表示させたいと思って
過去の質問などを読んでいますが
横のカラムを結合して
スクロールさせると
結合したセルが縦のカラムにかぶって表示していまい
カラムが見えなくなる現象が起こってしまいます。

かなり変則的なセルの結合をしています。
スクロールした時に
横のカラムが縦にかぶらないようにするには
どうすればいいでしょうか?
以下プログラムの一部です

procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
  val: integer;
begin
     StringGrid1.ColCount := 52;
     StringGrid1.Cells[0,0]:='ID';
     StringGrid1.Cells[0,1]:='ID';
     StringGrid1.Cells[0,2]:='ID';
     StringGrid1.Cells[1,0]:='名前';
     StringGrid1.Cells[1,1]:='名前';
     StringGrid1.Cells[1,2]:='名前';
     StringGrid1.Cells[2,0]:='年齢';
     StringGrid1.Cells[2,1]:='年齢';
     StringGrid1.Cells[2,2]:='年齢';
     StringGrid1.Cells[3,0]:='性別';
     StringGrid1.Cells[3,1]:='性別';
     StringGrid1.Cells[3,2]:='性別';
     for I := 4 to 51 do begin
        StringGrid1.Cells[I,0]:='2011/04/19';
        StringGrid1.Cells[I,1]:='OK';
        if I mod 2 = 1 then begin
          StringGrid1.Cells[I,2]:= 'OK';
        end else begin
          StringGrid1.Cells[I,2]:= 'NG';
        end;
     end;
     StringGrid1.DefaultDrawing := False;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  col1,col2 :Integer;
begin
  with StringGrid1 do begin
    DefaultDrawing:=False;

    if (ARow  <= 2)and(ACol >= 4)and(gdFixed in State) then  begin
      case ACol mod 2 of
        0 : Rect.Right := Rect.Right + ColWidths[ACol+1];
        1 : Rect.Left  := Rect.Left  - ColWidths[ACol-1] - 1;
      end;
    end else if (ACol <= 3)and(gdFixed in State)then begin
      case ARow of
        0  : Rect.Bottom := Rect.Bottom + RowHeights[1];
        2  : Rect.Top  := Rect.Top  - RowHeights[1]- RowHeights[0] - 1;
      end;
    end;
    if ((gdSelected in State) )then begin
        Canvas.Brush.Color := clHotLight;
        Canvas.Font.Color := clWhite;
    end else begin
      if (gdFixed in State) then begin
        Canvas.Brush.Color := clBtnFace;
      end else begin
        Canvas.Brush.Color := clWindow;
        Canvas.Font.Color := clBlack;
      end;
    end;
    Canvas.FillRect(Rect);
    DrawEdge(Canvas.Handle, Rect, BDR_RAISEDINNER, BF_RECT);
    DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect,
            DT_SINGLELINE or DT_VCENTER or DT_CENTER);
  end;
end;


tor  2011-06-08 09:04:35  No: 40647

一般論としてセルの描画をする場合
「セルAの描画イベントの時にセルBも一緒に描く」といったことをやると不具合が出ます。
今だと「セルAの隣は必ずセルB」と決め打ちして描画していますが
スクロールすると必ずしもそれが成り立たなくなるわけですよね。
きちんと「セルAの描画イベントではセルAの範囲だけ」
「セルBの描画イベントではセルBの範囲だけ」描くようにしなくてはいけません。

お手軽なところで、ClipRectを設定してセルの範囲外にはみ出ないようクリップしてみるというのはどうでしょうか。


たかやま  2011-06-08 22:00:57  No: 40648

torさん有難うございました。
ClipRectは使用したことが無く良く分からないのですが
>きちんと「セルAの描画イベントではセルAの範囲だけ」
>「セルBの描画イベントではセルBの範囲だけ」描くようにしなくてはいけません。

と言われ考えた所
1 : Rect.Left  := Rect.Left  - ColWidths[ACol-1] - 1;
をコメントアウトして実行してみたところ
動作的に少し課題は残りましたが
カラムがかぶる現象はなくなりました。
結局のところ
セルの結合って
セルの描画を伸ばしてくっついているように見せているだけだと気付きました。
有難うございました。


たかやま  2011-06-08 22:17:38  No: 40649

すいません
1 : Rect.Left  := Rect.Left  - ColWidths[ACol-1] - 1;

1:Rect.Left := Rect.Right;
に変更して実行した
の間違いです。
0のセルを結合させて、
1のセルは幅をなくすという考え方です。


Mr.XRAY  2011-06-12 04:32:43  No: 40650

みなさんこんにちは.Mr.XRAYです.
もう解決済ということですが.

StringGridのデータセルの結合は結構,いや非常に面倒です.
コンポーネントを使用していいというのであれば,市販のもありますが,フリーウェア
のコンポを試してみました.
紹介記事を書いてみましたので,参考になれば幸いです

[051_セルの結合とZColorStringGridコンポ]
http://mrxray.on.coocan.jp/Delphi/plSamples/051_ZColorStringGridCompo.htm


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

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






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