お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"StringGridで作るDBGridもどき(表示専用)"




//StringGridで作るDBGridもどき(表示専用)

説明
 StringGrid をDBGridのように使用するサンプルです。
 DataSourceにデータソースを指定し、MeisaiDispをコール
 することでデータが表示されます。
 セルの色や書式等は別に沢山サンプルがあるので省略します。

 現状の問題は、データを一度にすべて読んでしまうこと。^^;
                        ^^^^^^^^^^^^^^^^^^^^^^^^
 あんまり時間がかかるので、初期表示だけ入れてみました。
 (ただの悪あがきですね。)

 テストはC/S版で行ったのですが、Pro版でもいけると思います。

***プログラム部***

unit StrDBGrid1;

interface

uses
  Windows, SysUtils, Classes, Controls,
  Grids,DB;

type
  TStrDBGrid = class(TStringGrid)
  private
    { Private 宣言 }
    constructor Create(AOwner: TComponent); Override;
    function  DsGet: TDataSource;
    procedure DsSet(Ds: TDataSource);
  protected
    { Protected 宣言 }
  public
    { Public 宣言 }
    procedure MeisaiDisp;
  published
    { Published 宣言 }
    Property DataSource :TDataSource read DsGet write DsSet;
  end;

var
  DataSource1 : TDataSource; //グリッド・データソース

procedure Register;

implementation

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

//--------------------------------------------------------------------
// constructor: 表領域作成処理
// input      : AOwner
// output     : None
// Return     : None
//--------------------------------------------------------------------
constructor TStrDBGrid.Create(AOwner: TComponent); 
begin
  //元のCreate処理を実行する
  inherited Create(AOwner);
end;

//--------------------------------------------------------------------
// function   : データソース読取り処理
// input      : None
// output     : None
// Return     : TDataSource データソース名
//--------------------------------------------------------------------
function TStrDBGrid.DsGet : TDataSource;
begin
  Result := DataSource1;
end;

//--------------------------------------------------------------------
// procedure  : データソース設定処理
// input      : TDataSource データソース名
// output     : None
// Return     : None
//--------------------------------------------------------------------
procedure TStrDBGrid.DsSet(Ds: TDataSource);
begin
  if Ds = DataSource1 then
  begin
    exit;
  end;

  DataSource1 := Ds;

  //データソースの状態チェック(かなり甘いかも)
  if Ds = nil then
  begin
    exit;
  end;

  if Ds.State = dsInactive then
  begin
    exit;
  end;

  //グリッド内容表示
  MeisaiDisp;
end;

//--------------------------------------------------------------------
// procedure  : グリッド内容表示処理
// input      : None
// output     : None
// Return     : None
//--------------------------------------------------------------------
procedure TStrDBGrid.MeisaiDisp;
var
  x,y : integer;
  Meisai_FieldCount : integer; //データの項目数
  Meisai_RecCount   : integer; //データの件数
begin

  //データソースの状態チェック
  if DataSource1 = nil then
  begin
    exit;
  end;

  if DataSource1.State = dsInactive then
  begin
    exit;
  end;

  if DataSource1.DataSet.Active then
  begin
    //結果セットの項目数を取得
    Meisai_FieldCount := DataSource1.DataSet.FieldCount;  
    //結果セットのレコード数
    Meisai_RecCount   := DataSource1.DataSet.RecordCount; 

    //明細グリッドの項目数を結果セットと同じにする
    ColCount := Meisai_FieldCount;
    //明細グリッドの行数を結果セットと同じにする
    RowCount := Meisai_RecCount + 1;  

    //項目名表示
    for x := 0 to Meisai_FieldCount - 1 do
    begin
      Cells[x,0] := DataSource1.DataSet.Fields[x].FieldName; 
    end;

    //結果セット・カーソルを先頭に移動
    DataSource1.DataSet.First;

    //データ表示
    for y := 1 to Meisai_RecCount + 1 do
    begin
      for x := 0 to Meisai_FieldCount - 1 do
      begin
        if DataSource1.DataSet.Fields[x].isNull then
        begin
          Cells[x,y] := ''; //Nullを空白として表示
        end
        else
        begin
          Cells[x,y] := DataSource1.DataSet.Fields[x].Value;
        end;
      end;
      //次レコードを読み込み
      DataSource1.DataSet.Next;

      //初期表示の加速例?
      {
      if y = 20 then //一度に画面にでる行数を指定する
      begin
        Repaint;
      end;
      }
    end;
  end;
end;
end.

Original document by k.ogawa         氏 ID:(CQX02565)


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

Copyright 1996-2002 Delphi Users' Forum