DBGridのタイトルを複数行表示するには?

解決


Ru  2008-06-24 19:47:16  No: 31056

いつも参考にしています。
DBGridで不明点が出てきたので相談させてください。

列タイトルを複数行表示するにはどうすればいいのでしょうか?
行幅変更するのは下記コードで出来たのですが,
文字列を複数行にして表示することが出来ません。
(文字列に #13#10 を加えてみました。変化無し)
過去ログ検索すると出来る雰囲気はあるのですが・・・
https://www.petitmonte.com/bbs/answers?question_id=1383

ご存じの方がいれば教えて頂けると幸いです。
よろしくお願いします。

行幅変更方法:TStringGrid(DBGrid1).RowHeights[0] := 30;


Null  2008-06-25 03:12:22  No: 31057

これの事ですか?。

unit MutiTitleDBGroid;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBGrids, Grids;

type
  TMutiTitleDBGrid = class(TDBGrid)
  private
    { Private 宣言 }
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
                                         AState: TGridDrawState); override;
  protected
    { Protected 宣言 }
  public
    { Public 宣言 }
  published
    { Published 宣言 }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMutiTitleDBGrid]);
end;

{ TMutiTitleDBGrid }

procedure TMutiTitleDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
  AState: TGridDrawState);
const
  AlignFlags : array [TAlignment] of Integer =
    ( DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
      DT_RIGHT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
      DT_CENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX );
var
  Text : string;
  Flags: LongInt;
begin
  inherited DrawCell(ACol, ARow, ARect, AState);
  if (ARow = 0) and (ACol <> 0) and (FieldCount > 0) then
  begin
    // 縁を残して塗りつぶす
    InflateRect(ARect, -1, -1);
    Canvas.FillRect(ARect);
    // DBGridのTitleFontプロパティを使う
    Canvas.Font.Assign(TitleFont);
    // カラムのTitle.Captionを使用する
    Text := Columns[ACol-1].Title.Caption;
    // 文字列に";"があるかを判断して2行に分ける
    if (Pos(';', Text) > 0) then
    begin
      // 2行の場合
      Flags := DT_VCENTER or AlignFlags[Columns[ACol-1].Title.Alignment];
      // 文字列を分割し、CRLFを入れる
      Text := Copy(Text, 1, Pos(';', Text)-1) + #13+#10 +
              Copy(Text, Pos(';', Text)+1, Length(Text));
    end else
      // 1行の場合DT_SINGLELINEを付けて行の真ん中に表示する
      Flags := DT_SINGLELINE or DT_VCENTER or
                                AlignFlags[Columns[ACol-1].Title.Alignment];
    // 表示
    DrawText(Canvas.Handle, PChar(Text), Length(Text), ARect, Flags);
  end;
end;

end.


Ru  2008-06-25 19:23:14  No: 31058

返信ありがとうございます。

DrawCellをオーバーライドしないとダメだったんですね。
定数宣言の部分はいまいち分かっていませんが,
参考にして無事組み込むことが出来ました。

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


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

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






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