いつもお世話になっています。
早速ですが、StringGridにて、上下のセルの中の値が同じ場合に結合したいと考えています。
結合範囲は同じ値があるだけを考えているですが、どうにもうまくいきません。
基本的にセルの中の値は行単位で同じになります。
お力添えの程、よろしくお願いします。
※以下のコード(DrawCell内)で、指定行に関しての結合は実装できました。
if ARow in [1..2] then
begin
case ARow of
1:Rect.Bottom := Rect.Bottom + RowHeights[2] + 1;
2:Rect.Top := Rect.Top - RowHeights[1] - 1;
end;
end;
環境
Delphi2007
Oracle10g
ADO
どう上手くいかないのか判りませんが、考え方だけ・・・
RowHeigthでは罫線の関係で上手くいきませんというか面倒です。
相手方のCellのRect値を持ってくるほうが良いと思います。
ARect := CellRect(0,3);
Rect.Bottom := ARect.Bottom; ってな感じ。
で、動的・・・
今描画しようとしているのはARow,ACol値ですよね。
ならば、Grid描画範囲内で、ARowを基準に上方向、下方向と各Cellを
走査すれば同じ値か否かはわかりますよね。
つまり、ARowを基準に上方向及び下方向それぞれCellを見ていって、
値が異なればその前のCellまでは同じ内容って事ですよね。
そのCellのRect値をもってくれば、描画枠のTopとBottomはわかり
ます。
イベント内に関数でも作成して値を持ってくれば良いでしょう。
{上方向を走査する例}手打ちですのでイメージという事で。
function MyFuncGetTopRow():Integer;
var
i,RetRow :Integer;
begin
for i := ARow downto (Sender as TStringGrid).TopRow do
begin
if (Sender as TStringGrid).Cell[ACol,ARow] =
(Sender as TStringGrid).Cell[ACol,i] then
begin
RetRow := i;
end else begin
Break;
end;
end;
//RetRow値からTop値を求めて返す----
(略)
end;
あと、下方(Bottom)も・・・
ってのは如何でしょうか?
おかげさまで解決しました。
ありがとうございました。
ツイート | ![]() |