お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"StringGridでCellの文字配置設定(2)"






■説明
 StringGrid の OnDrawCellイベントでセル内文字列の配置を変更する
場合、文字列が一旦セルの左端に描画された後に指定の  Alignment で
再描画されるため、 StringGrid をスクロールさせた時などにチラツキ
が気になることがあります。

 以下は TStringGridから派生させたコンポーネントのサンプルであり、
上記理由によるスクロール時などのチラツキを押さえるため DrawCell 
を自前のコードと差し替えたものです。
  OnDrawCellで文字列の配置変更用のコードを記述しなくても良い様に、
予め各セル内の文字列を意図する位置に描画させるようにしています。

 なお、以下のサンプルでは、固定列・行は文字列をセルの中央に配置
し、それ以外のセルは文字列を右寄せするようになっています。

■コンポーネントの作成手順
---------------------------------------------------------
 1.[ファイル] → [新規作成] を順に選択します。
 2.表示されるダイアログの "新規作成" ページを開きます。
 3.そのページ内の "コンポーネント" を選択しOKボタンを押し
   ます。(あるいはダブルクリックします。)(コンポーネント
   の新規作成ダイアログが表示されます。)
 4."上位クラス(A)"         を   "TStringGrid"   にします。
   "クラス名(C)"           を   "TMyStrG"       にします。
   "パレットページ名(P)"   を   "Samples"       にします。
 5.OKボタンを押します。
 6.自動生成されたユニットに "MyStrG.pas" と名前を付けて適当
   なフォルダに保存します。
 7.下記サンプルコードに必要に応じて手を加え、保存します。
 8.その後、コンポーネントをインストールして下さい。
---------------------------------------------------------
 1.[ファイル] → [新規作成] を順に選択します。
 2.表示されるダイアログの "新規作成" ページを開きます。
 3.そのページ内の "コンポーネント" を選択しOKボタンを押し
   ます。(あるいはダブルクリックします。)(コンポーネント
   の新規作成ダイアログが表示されます。)
 4."上位クラス(A)"         を   "TStringGrid"   にします。
   "クラス名(C)"           を   "TMyStrG"       にします。
   "パレットページ名(P)"   を   "Samples"       にします。
   "ユニットファイル名(F)" を   "..\MyStrG.pas" にします。
   ※ユニットファイルの保存フォルダは任意。
 5."ユニットの作成"ボタンを押します。
 6.下記サンプルコードに必要に応じて手を加え、保存します。
 7.その後、作成したコンポーネントをインストールして下さい。

■参考
 コンポを作らず DefaultDrawing を False に設定して、OnDrawCell 
イベント内に自前で描画コードを書く手もあります。
                   (→ FDELPHI/MES/15/4 参照 )
■サンプルコード
//=====================================================================
unit MyStrG;

interface

uses
  Windows, Classes, Graphics, Grids;

type
  TMyStrG = class(TStringGrid)
  private
    { Private 宣言 }
    FOnDrawCell: TDrawCellEvent;  //←OnDrawCell Event 用に追加
  protected
    { Protected 宣言 }            //↓DrawCell を書き換える
    procedure DrawCell( ACol, ARow: Longint; ARect: TRect;
                                    AState: TGridDrawState ); override;
  public
    { Public 宣言 }
  published
    { Published 宣言 }            //↓OnDrawCell Event 用に追加
    property OnDrawCell: TDrawCellEvent read FOnDrawCell
                                       write FOnDrawCell;
  end;

procedure Register;

implementation

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

procedure TMyStrG.DrawCell( ACol, ARow: Longint; ARect: TRect;
                                              AState: TGridDrawState );
  procedure DrawCellText;    //文字列描画
  var
    S      : String;    //セル内の文字列を格納
    dtRect : TRect;     //文字列描画範囲指定
    DTFLG  : UINT;
  begin
    S := Cells[ACol, ARow];
    with dtRect do
      begin
        Left   := ARect.Left   + 2;    //文字列位置補正、数値は適当に
        Right  := ARect.Right  - 2;    //   〃      〃   
        Top    := ARect.Top    + 2;    //   〃      〃   
        Bottom := ARect.Bottom - 2;    //   〃      〃   
      end;
    with Canvas do
      begin
        if gdFixed in AState then    //固定列・行は文字列を中央に配置
          DTFLG :=  DT_SINGLELINE or DT_VCENTER or DT_CENTER
        else                         //固定列・行以外は右寄せ配置
          DTFLG :=  DT_SINGLELINE or DT_VCENTER or DT_RIGHT;
        DrawText( Handle, PChar( S ), -1, dtRect, DTFLG );
      end;
  end;

begin
  if DefaultDrawing then DrawCellText;
//--- OnDrawCell Event を発生させる -----------------------------------
  if Assigned( FOnDrawCell ) then
    FOnDrawCell( Self, ACol, ARow, ARect, AState );
//---------------------------------------------------------------------
end;
end.
//=====================================================================

                                     98/02/08(日) 23:33 Fermion(KHF03264)

Original document by Fermion         氏 ID:(KHF03264)


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

Copyright 1996-2002 Delphi Users' Forum