お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"メモ型項目の1行目を表示するDBグリッド"






 メモ型項目の一行目を表示するDBグリッドです。

 DBグリッドにメモ型項目を表示させると「(Memo)」などという味気ない表
示になってしまいます(少なくともデルファイ1では)。これでは一覧性がな
いのでメモ型項目の場合にはその1行目を表示するようにしてみました。

 デルファイ1だと「ins」ぁしたり「eof」になると、元の表示に戻ってし
まいます。デルファイ2以降では、たぶん、問題はありません。

 nifty:FDelphi/MES/7/10712 以降で謎の全知師さんに教えてもらいました。

 【イベントハンドラ版】

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect:
TRect;
  Field: TField; State: TGridDrawState);
var
  L:TStringList;
  S:string;
begin
  if  ( Field is TMemoField ) then begin
    L := TStringList.Create;
    L.assign( TMemoField(Field) );
    if L.count <> 0 then begin
      DbGrid1.Canvas.FillRect(Rect);
      DbGrid1.canvas.TextOut( Rect.Left , Rect.top , L[0] );
    end;
    finally L.Free ; end;
  end;
end;

 【コンポーネント版】

 コンポーネント版では、DefaultDrawing  を一時的に変更してチラツキをな
くしています。

 「S := StrCut( S , -Field.DisplayWidth) ; { 漢字対応の copy  }」の部
分では漢字の途中で切れないようにカットしていますが、自作のユーティリテ
ィでちょっと複雑だったのでカットしました。長い文字列だと表の後半の罫線
がおかしくなるようですが、無くてもたいした問題はないです。

type
  TTkDBGrid = class(TDBGrid)
  private
    { Private 宣言 }
    FOldDefaultDrawing:boolean;
  protected
    { Protected 宣言 }
    procedure DrawCell(
                    ACol, ARow: Longint;
                    ARect: TRect;
                    AState: TGridDrawState); override;
    procedure DrawDataCell(
            const   Rect: TRect;
                    Field: TField;
                    State: TGridDrawState); override;
  end;

procedure TTkDbGrid.DrawDataCell(const Rect: TRect; Field: TField;
  State: TGridDrawState);
var
  L:TStringList;
  S:string;
begin
  if   FOldDefaultDrawing
  and (Field is TMemoField )
  then begin
    L := TStringList.Create;
    try
      L.assign( TMemoField(Field) );
      if L.count <> 0
        then S := L[0]
        else S := Field.DisplayText;
    finally ; L.Free ; end;
    S := copy( S , 1 , Field.DisplayWidth) ;
    {S := StrCut( S , -Field.DisplayWidth) ;    { 漢字対応の copy }
    Canvas.FillRect(Rect);
    canvas.TextOut( Rect.Left , Rect.top , S );
  end;
    {}
    {   ユーザードロー
    {}
  inherited DrawDataCell( Rect , Field , State );
end;

procedure TTkDbGrid.DrawCell(
                    ACol, ARow: Longint;
                    ARect: TRect;
                    AState: TGridDrawState);
var
  Field : TField;
begin
  FOldDefaultDrawing := DefaultDrawing;
  try
    if dgIndicator in Options
      then Field := GetColField( ACol-1 )
      else Field := GetColField( ACol );
    if (Field is TMemoField ) then begin
      DefaultDrawing := false;
    end;
    inherited DrawCell( ACol , ARow , ARect , AState );
  finally DefaultDrawing := FOldDefaultDrawing ; end;
end;

  98/4/23(Thu) GGB03124 熊谷秀武

Original document by 熊谷秀武        氏 ID:(GGB03124)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum