現在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;
一般論としてセルの描画をする場合
「セルAの描画イベントの時にセルBも一緒に描く」といったことをやると不具合が出ます。
今だと「セルAの隣は必ずセルB」と決め打ちして描画していますが
スクロールすると必ずしもそれが成り立たなくなるわけですよね。
きちんと「セルAの描画イベントではセルAの範囲だけ」
「セルBの描画イベントではセルBの範囲だけ」描くようにしなくてはいけません。
お手軽なところで、ClipRectを設定してセルの範囲外にはみ出ないようクリップしてみるというのはどうでしょうか。
torさん有難うございました。
ClipRectは使用したことが無く良く分からないのですが
>きちんと「セルAの描画イベントではセルAの範囲だけ」
>「セルBの描画イベントではセルBの範囲だけ」描くようにしなくてはいけません。
と言われ考えた所
1 : Rect.Left := Rect.Left - ColWidths[ACol-1] - 1;
をコメントアウトして実行してみたところ
動作的に少し課題は残りましたが
カラムがかぶる現象はなくなりました。
結局のところ
セルの結合って
セルの描画を伸ばしてくっついているように見せているだけだと気付きました。
有難うございました。
すいません
1 : Rect.Left := Rect.Left - ColWidths[ACol-1] - 1;
を
1:Rect.Left := Rect.Right;
に変更して実行した
の間違いです。
0のセルを結合させて、
1のセルは幅をなくすという考え方です。
みなさんこんにちは.Mr.XRAYです.
もう解決済ということですが.
StringGridのデータセルの結合は結構,いや非常に面倒です.
コンポーネントを使用していいというのであれば,市販のもありますが,フリーウェア
のコンポを試してみました.
紹介記事を書いてみましたので,参考になれば幸いです
[051_セルの結合とZColorStringGridコンポ]
http://mrxray.on.coocan.jp/Delphi/plSamples/051_ZColorStringGridCompo.htm
ツイート | ![]() |