StringGridセル結合後のセル間ボーダーラインについて

解決


TOM007  2004-07-21 07:08:31  No: 9998

はじめまして。TOM007です。
こちらの掲示板の過去ログを、よく拝見させていただいています。
DELPHIをはじめて2週間で勉強中の身です。

早速質問なんですが、内容は過去ログにも存在した、
「StringGridのセル結合」についてなんですが、OnDrawCellイベントで
StringGridの[0行 1列目と2列目]のセル結合は過去ログのSRC
(以下サンプルSRC)の通り成功したのですが、
結合した[1行目]のセルと[2行目]のセルの間にボーダーライン?が残って
しまいます。
ちなみに、StringGridの[DefaultDrawing]プロパティは「True」に設定して
います。
結合したセル間の不要な線をどのように非表示にしたらよいのか、
どなたかご教授の程宜しくお願いいたします。

開発環境OS [Windows2000]
使用言語   [Delphi5]

・[0行 1列目と2列目]のセル結合SRC
    with TStringGrid(Sender) do
    begin
      //セルの結合
      if (ARow=0) then begin
        case ACol of
          1  : Rect.Right := Rect.Right + ColWidths[2];
          2  : Rect.Left  := Rect.Left  - ColWidths[1];
        end;
        Canvas.Brush.Color := clBtnFace;
        Canvas.Font.Color  := clBlack;
        Canvas.FillRect(Rect);
        DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect,
                 DT_SINGLELINE or DT_CENTER);
      end;
    end;


o(小丸)  2004-07-21 19:43:22  No: 9999

>ちなみに、StringGridの[DefaultDrawing]プロパティは「True」に設定しています。
>結合したセル間の不要な線をどのように非表示にしたらよいのか

答えはカンタン。DefaultDrawingプロパティを False にすること。
ん?それではo(コマル)? ナンのためのOwnerDrawじゃい。

>・[0行 1列目と2列目]のセル結合SRC
>Canvas.Brush.Color := clBtnFace;

もしかして…DefaultDrawingをTrueにしたままで 固定行のセルを結合したいということかな?

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with TStringGrid(Sender) do begin
    DefaultDrawing := True;
    // [0行 1列目と2列目]の固定セルの結合
    if gdFixed in State then begin
      DefaultDrawing := False;
      case ACol of
        1 : Rect.Right := Rect.Right + ColWidths[2];
        2 : Rect.Left  := Rect.Left  - ColWidths[1] - 1;
      end;
      Canvas.Brush.Color := clBtnFace;
      Canvas.Font.Color  := clBlack;
      Canvas.FillRect(Rect);
      DrawEdge(Canvas.Handle, Rect, BDR_RAISEDINNER, BF_RECT);
      DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect,
         DT_SINGLELINE or DT_CENTER or DT_VCENTER);
    end;
  end;
end;


TOM007  2004-07-21 21:44:21  No: 10000

TOM007です。
o(小丸)さん、返事が遅くなってしまいすみません。

>もしかして…DefaultDrawingをTrueにしたままで 固定行のセルを結合したいと>いうことかな?

説明不足ですみません。ご指摘いただいた通り、defaultDrawing=Trueのまま
セルの結合をしたいのです。しかも、結合はできたのですが、結合したセル間の
不要な線がどうしても取り除けません。

ご教授の程宜しくお願いします.


HOta  2004-07-22 03:48:54  No: 10001

TOM007さん、o(小丸)さんのコードでだめでしょうか?


TOM007  2004-07-22 05:08:37  No: 10002

HOtaさん、o(小丸)さん、たびたび返事が遅くなってすみません。
o(小丸)さんのコードで再現できました!

HOtaさん、o(小丸)さん、ありがとうございます。


mozart0488  URL  2005-10-29 16:41:00  No: 10003

初めまして、サンデイプログラマーです。
横2個のセル結合は上記コードでうまくいくようですが、3個以上のセルについて下手なプログラムでつなぐことができたのですが結合したセルに文字列を書き込みセンタリングするにはどうすればよいでしょうか。また、結合したとき文字がちらつきますが、これはどうしようもないのでしょうか。
もし、3個以上のセル結合でエレガントなコードをかけるのであれば紹介下さい。


HOta  2005-10-29 22:17:40  No: 10004

このコードでセンタリングになっています。
文字のちらつきは、DefaultDrawingプロパティを Falseで
どうにかなりませんか?


mozart0488  2005-10-30 03:37:53  No: 10005

早速ありがとうございました。
3個以上のセルではセンタリングができないということは私の下手なプログラミングのせいだと思います。申し訳ありませんが、3個以上のセル結合についてコードを具体的にお願いします。


HOta  2005-10-30 17:27:20  No: 10006

センタリングできないコードはどうなっていますか?
ちょっとあげてみたらどうでしょう。


mozart0488  2005-11-01 04:53:10  No: 10007

あまりにも幼稚なプログラミングであげるのに勇気がいりますが、
出来ればセル結合を関数化したいと思っています。
procedure TForm1.FormCreate(Sender: TObject);
begin
     Count:=0;
     StringGrid1.Cells[1,0]:='得  点';
     StringGrid1.Cells[2,0]:='得  点';
     StringGrid1.Cells[3,0]:='得  点';
     StringGrid1.Cells[4,0]:='得  点';
     StringGrid1.Cells[5,0]:='得  点';
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
     with StringGrid1 do
     begin
          DefaultDrawing:=true;
       if ARow = 0 then
         begin
              DefaultDrawing:=false;
              case ACol of
              1  : Rect.Right := Rect.Right + ColWidths[2]; 
              2  : Rect.Left  := Rect.Left  - ColWidths[1];
              end;
              case ACol of
              2  : Rect.Right := Rect.Right + ColWidths[3];
              3  : Rect.Left  := Rect.Left  - ColWidths[2];
              end;
              case ACol of
              3  : Rect.Right := Rect.Right + ColWidths[4];
              4  : Rect.Left  := Rect.Left  - ColWidths[3];
              end;
              case ACol of
              4  : Rect.Right := Rect.Right + ColWidths[5];
              5  : Rect.Left  := Rect.Left  - ColWidths[4];
              end;
              Canvas.Brush.Color := clBtnFace;
              Canvas.FillRect(Rect);
          //StringGrid1.Cells[1,0]、StringGrid1.Cells[2,0]には
          //前もって同じ文字列を入れてある。
              DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect,
                       DT_SINGLELINE or DT_VCENTER or DT_CENTER);
         end;
     end;
end;


HOta  2005-11-01 17:24:55  No: 10008

これだと、Rectの幅は2桁しかないようですよ。
AColのそれぞれの場合は、1つだけの報がわかりやすくなります。
case ACol of
1:
  begin
    Hogehoge1;
    Hogehoge2;
  end;
2:
  begin
    Hogehoge3;
    Hogehoge4;
  end;
の様にしましょう。


mozart0488  2005-11-02 02:18:19  No: 10009

すみません。コンパイルも通りません。もう少し詳しくお願いします。


HOta  2005-11-02 04:13:20  No: 10010

書き方を書いているだけで、プログラムそのものを書いているわけではありません。

case ACol of
をいくつも書いていますが、何か意味があるのでしょうか?
まとめればどうでしょうか?
このあたりがおかしくなっている原因でしょう。


mozart0488  2005-11-02 06:23:45  No: 10011

物わかりが悪くて何回もすみません。コードの意味がよく分からなかったのですが、下記でうまくセンタリングもかかりました。
セル結合を1つのセル毎に結合していました。結合したいセルの左で右範囲を指定し、右で左範囲を指定すればよいのですね。
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
     with StringGrid1 do
     begin
          DefaultDrawing:=true;
       if ARow = 0 then
         begin
              DefaultDrawing:=false;
              case ACol of
              1  : Rect.Right := Rect.Right + ColWidths[2]+Colwidths[3]+Colwidths[4]; //2列目の描画
              5  : Rect.Left  := Rect.Left  - ColWidths[4]- ColWidths[3]- ColWidths[2]- ColWidths[1];
              end;
              Canvas.Brush.Color := clBtnFace;
              Canvas.FillRect(Rect);
              //StringGrid1.Cells[1,0]、StringGrid1.Cells[2,0]には
              //前もって同じ文字列を入れてある。
              DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect,
                       DT_SINGLELINE or DT_VCENTER or DT_CENTER);
         end;
     end;
end;


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

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






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