はじめまして。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;
>ちなみに、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です。
o(小丸)さん、返事が遅くなってしまいすみません。
>もしかして…DefaultDrawingをTrueにしたままで 固定行のセルを結合したいと>いうことかな?
説明不足ですみません。ご指摘いただいた通り、defaultDrawing=Trueのまま
セルの結合をしたいのです。しかも、結合はできたのですが、結合したセル間の
不要な線がどうしても取り除けません。
ご教授の程宜しくお願いします.
TOM007さん、o(小丸)さんのコードでだめでしょうか?
HOtaさん、o(小丸)さん、たびたび返事が遅くなってすみません。
o(小丸)さんのコードで再現できました!
HOtaさん、o(小丸)さん、ありがとうございます。
初めまして、サンデイプログラマーです。
横2個のセル結合は上記コードでうまくいくようですが、3個以上のセルについて下手なプログラムでつなぐことができたのですが結合したセルに文字列を書き込みセンタリングするにはどうすればよいでしょうか。また、結合したとき文字がちらつきますが、これはどうしようもないのでしょうか。
もし、3個以上のセル結合でエレガントなコードをかけるのであれば紹介下さい。
このコードでセンタリングになっています。
文字のちらつきは、DefaultDrawingプロパティを Falseで
どうにかなりませんか?
早速ありがとうございました。
3個以上のセルではセンタリングができないということは私の下手なプログラミングのせいだと思います。申し訳ありませんが、3個以上のセル結合についてコードを具体的にお願いします。
センタリングできないコードはどうなっていますか?
ちょっとあげてみたらどうでしょう。
あまりにも幼稚なプログラミングであげるのに勇気がいりますが、
出来ればセル結合を関数化したいと思っています。
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;
これだと、Rectの幅は2桁しかないようですよ。
AColのそれぞれの場合は、1つだけの報がわかりやすくなります。
case ACol of
1:
begin
Hogehoge1;
Hogehoge2;
end;
2:
begin
Hogehoge3;
Hogehoge4;
end;
の様にしましょう。
すみません。コンパイルも通りません。もう少し詳しくお願いします。
書き方を書いているだけで、プログラムそのものを書いているわけではありません。
case ACol of
をいくつも書いていますが、何か意味があるのでしょうか?
まとめればどうでしょうか?
このあたりがおかしくなっている原因でしょう。
物わかりが悪くて何回もすみません。コードの意味がよく分からなかったのですが、下記でうまくセンタリングもかかりました。
セル結合を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;
ツイート | ![]() |