|
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
|