С помощью xBaseViewSU создал простейший dbf-файл всего с двумя полями:
ID - тип N,
NAME - тип string.
Добавил две записи:
0 Иванов
1 Петров
Вот код (привожу весь код, так как его надо пробовать, чтобы понять, что я имею ввиду):
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, dbf, db, FileUtil, Forms, Controls, Graphics, Dialogs,
DBGrids, StdCtrls, LConvEncoding, Menus, Grids;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
CheckBox1: TCheckBox;
Datasource1: TDatasource;
Dbf1: TDbf;
DBGrid1: TDBGrid;
MainMenu1: TMainMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure CheckBox1Change(Sender: TObject);
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure MenuItem2Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
PathToMyDir: string;
Db_Name: string;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.MenuItem2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
Db_Name:= UTF8ToSys(OpenDialog1.FileName);
PathToMyDir:= UTF8ToSys(ExtractFilePath(OpenDialog1.FileName));
end;
Dbf1.Close;
Dbf1.FilePath:= PathToMyDir;
Dbf1.FilePathFull:= PathToMyDir;
Dbf1.TableName:= Db_Name;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not FileExists(Db_Name) then
begin
ShowMessage('Файл БД не выбран');
exit;
end;
Dbf1.Open;
end;
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
FieldsOfDB: TField;
DataOfField: string;
FieldsAlign: TTextStyle;
begin
FieldsOfDB:= Column.Field;
//FieldsAlign.Alignment := taCenter;
//Column.Title.Alignment:= taCenter;
DataOfField:= FieldsOfDB.AsString;
//ShowMessage('');
DBGrid1.Canvas.FillRect(Rect);
if CheckBox1.Checked
then
DBGRid1.Canvas.TextRect(Rect, 0, 0, CP866ToUTF8(DataOfField), FieldsAlign)
else
DBGRid1.Canvas.TextRect(Rect, 0, 0, CP1251ToUTF8(DataOfField), FieldsAlign)
end;
procedure TForm1.CheckBox1Change(Sender: TObject);
begin
DBGrid1.Refresh;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Dbf1.Close;
Dbf1.Free;
Close;
end;
end.
Все нормально работает.
Но, как-то раз, решил посмотреть как ведет себя DBGrid, так сказать, в пошаговом режиме. Вставил
- Код: Выделить всё
ShowMessage('');
В приведенном выше коде эта строчка закомментирована.
И что я вижу. DBGrid отрисовывает строки дважды (?!), причем наименования полей выводятся только при повторном перекодировании. А если раскомментировать строку
- Код: Выделить всё
Column.Title.Alignment:= taCenter;
так еще больше.
Но ведь это явная потеря производительности! Я не проверял, но для большой таблицы это большая роскошь.
В чем может быть дело? Может я что-то не так делаю?