StringGridの動的なセル結合

解決


CDR  2007-10-23 22:55:49  No: 28087

いつもお世話になっています。

早速ですが、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


Syake  2007-10-24 22:06:55  No: 28088

どう上手くいかないのか判りませんが、考え方だけ・・・

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)も・・・
ってのは如何でしょうか?


CDR  2007-10-30 20:29:06  No: 28089

おかげさまで解決しました。

ありがとうございました。


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

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






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