« MyBaseを試してみる。(フィールド作成編) | トップページ | MyBaseを試してみる。(AppendとInsert) »

TDBGridの描画が変!?(MyBase接続時)

TCustomDBGridから派生した自作コンポーネントの修正をしていたのですが、時々描画がおかしくなるときがあり、いろいろ調べてみるとTDBGrid自体の描画が変な時がありました。

その1
TDBGridは、標準機能としてMouseOverでColumnsが強調表示されます。標準のテーマではわかりにくかったので、VCL StyleのGolden Graphiteを使っています。

Dbgrid1


しかし次のように先頭レコードのインジゲーター部分も強調表示されています。(他のレコードでは表示されない)まあ、これは気にするほどのことではないです。

Dbgrid2



その2
編集時にマウスの移動によって、セルの描画がおかしくなります。文字部分は、InplaceEditorが扱っているので、問題ないですけど、場合によっては、インジゲーターのアイコンが表示されたりします。結果として、ADTを使わない場合、ClientDataSet1.ObjectViewをFalseにすると問題なく描画されるようになりました。ADTがある場合は、Falseに設定していたとしても自動的にTrueになるようで、解決できませんでした。

アンダーラインのようなもの?(カラムが描画されてるのかも)

Dbgrid_underline


フォーカス枠の残り?

Dbgrid_error2


描画のタイミングが悪い?

Dbgrid_error3


Delphi2007とDelphi2009でも試してみましたが、こちらでは全く問題なかったです。(まあグリッドの描画があれですけど)

Dbgrid_2009_2




試しにDefaultDrawingをFalseに設定して、試してみました。 マウスを動かすとカラムのタイトルやインジゲーターアイコンが表示されます。 上手くマウスを動かすとこんな描画になります(^-^)こんなものがDefaultDrawingを使わなくても描画されていたら、オーナードローでは解決できなさそうです。(InplaceEditor表示後に描画されているのが厄介です)

Dbgrid_error4


Dbgrid_nodefaultdraw



ならば、DrawCellを全く表示させないとどうなるかを試してみました。 やはりDrawCell以外の部分での描画が影響しているようですね。

Dbgrid_nodrawcell



  TDBGridTest = class(TDBGrid)
  protected
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
      AState: TGridDrawState); override;
  end;

procedure TDBGridTest.DrawCell(ACol, ARow: Integer; ARect: TRect;
  AState: TGridDrawState);
begin
  Exit;
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  // TStyleManager.TrySetStyle('Golden Graphite');
  with ClientDataSet1 do
  begin
    FieldDefs.Add('ID',ftAutoInc);
    FieldDefs.Add('ITEM',ftWideString,10);
    FieldDefs.Add('QTY',ftFloat);
    FieldDefs.Add('UNIT',ftWideString,4);
    FieldDefs.Add('PRICE',ftCurrency);
    CreateDataSet;

    Append;
    FieldByName('ITEM').AsString := 'PEN';
    FieldByName('QTY').AsInteger := 10;
    FieldByName('UNIT').AsString := '本';
    FieldByName('PRICE').AsString := '1000';
    Append;
    FieldByName('ITEM').AsString := 'Fan';
    FieldByName('QTY').AsInteger := 3;
    FieldByName('UNIT').AsString := '台';
    FieldByName('PRICE').AsString := '30000';
    Append;
    FieldByName('ITEM').AsString := 'PC';
    FieldByName('QTY').AsInteger := 1;
    FieldByName('UNIT').AsString := '台';
    FieldByName('PRICE').AsString := '180000';
    CheckBrowseMode;
  end;

  TestDBGrid:= TDBGridTest.Create(Self);
  TestDBGrid.Parent := self;
  TestDBGrid.align := alClient;
  DataSource1.DataSet := ClientDataSet1;
  TestDBGrid.DataSource := DataSource1;
end;

|

« MyBaseを試してみる。(フィールド作成編) | トップページ | MyBaseを試してみる。(AppendとInsert) »