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;
| 固定リンク
