TDBGridの描画が変!?(MyBase接続時)
TCustomDBGridから派生した自作コンポーネントの修正をしていたのですが、時々描画がおかしくなるときがあり、いろいろ調べてみるとTDBGrid自体の描画が変な時がありました。
その1
TDBGridは、標準機能としてMouseOverでColumnsが強調表示されます。標準のテーマではわかりにくかったので、VCL StyleのGolden Graphiteを使っています。
しかし次のように先頭レコードのインジゲーター部分も強調表示されています。(他のレコードでは表示されない)まあ、これは気にするほどのことではないです。
その2
編集時にマウスの移動によって、セルの描画がおかしくなります。文字部分は、InplaceEditorが扱っているので、問題ないですけど、場合によっては、インジゲーターのアイコンが表示されたりします。結果として、ADTを使わない場合、ClientDataSet1.ObjectViewをFalseにすると問題なく描画されるようになりました。ADTがある場合は、Falseに設定していたとしても自動的にTrueになるようで、解決できませんでした。
アンダーラインのようなもの?(カラムが描画されてるのかも)
フォーカス枠の残り?
描画のタイミングが悪い?
Delphi2007とDelphi2009でも試してみましたが、こちらでは全く問題なかったです。(まあグリッドの描画があれですけど)
試しにDefaultDrawingをFalseに設定して、試してみました。 マウスを動かすとカラムのタイトルやインジゲーターアイコンが表示されます。 上手くマウスを動かすとこんな描画になります(^-^)こんなものがDefaultDrawingを使わなくても描画されていたら、オーナードローでは解決できなさそうです。(InplaceEditor表示後に描画されているのが厄介です)
ならば、DrawCellを全く表示させないとどうなるかを試してみました。 やはりDrawCell以外の部分での描画が影響しているようですね。
その1
TDBGridは、標準機能としてMouseOverでColumnsが強調表示されます。標準のテーマではわかりにくかったので、VCL StyleのGolden Graphiteを使っています。
しかし次のように先頭レコードのインジゲーター部分も強調表示されています。(他のレコードでは表示されない)まあ、これは気にするほどのことではないです。
その2
編集時にマウスの移動によって、セルの描画がおかしくなります。文字部分は、InplaceEditorが扱っているので、問題ないですけど、場合によっては、インジゲーターのアイコンが表示されたりします。結果として、ADTを使わない場合、ClientDataSet1.ObjectViewをFalseにすると問題なく描画されるようになりました。ADTがある場合は、Falseに設定していたとしても自動的にTrueになるようで、解決できませんでした。
アンダーラインのようなもの?(カラムが描画されてるのかも)
フォーカス枠の残り?
描画のタイミングが悪い?
Delphi2007とDelphi2009でも試してみましたが、こちらでは全く問題なかったです。(まあグリッドの描画があれですけど)
試しにDefaultDrawingをFalseに設定して、試してみました。 マウスを動かすとカラムのタイトルやインジゲーターアイコンが表示されます。 上手くマウスを動かすとこんな描画になります(^-^)こんなものがDefaultDrawingを使わなくても描画されていたら、オーナードローでは解決できなさそうです。(InplaceEditor表示後に描画されているのが厄介です)
ならば、DrawCellを全く表示させないとどうなるかを試してみました。 やはりDrawCell以外の部分での描画が影響しているようですね。
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;
| 固定リンク