使用BDE的ASCII驱动数据库:     Delphi (包括所有使用BDE的工具) 具有使用ASCII文件当数据库表Table的能力,能够转换数据值成固定长度格式或者使用逗号分隔的ASCII文件,能够使用TTable元件显示。如何存取ASCII文件依赖于一个伴随的格式定义文件。这个格式定义文件定义了分析这个ASCII文件成单条记录和字段的必要的信息。因为逗号分隔的ASCII数据文件分析更加复杂,所以本文集中介绍这类文件。
格式定义文件
ASCII数据驱动的格式定义文件包含了定义文件类型(逗号分隔或者固定长度)和定义字段。为了使程序能够知道格式定义文件,格式定义文件的文件名必须与数据文件同名,并使用SCH为扩展名。其中定义的描述如下:
  File name:被一对方括号包含,这个设置定义ASCII文件的名称。数据文件的扩展名必须为TXT。
Filetype定义ASCII文件的结构。
FIXED  固定格式
VARYING   变化格式
Delimiter:定义字符串的分隔符,通常为双引号
Separator定义字段间的分隔符,通常为逗号
CharSet:定义语言驱动程序,通常为ASCII
    定义文件下部分为字段定义。ASCII文件的每一行都是一条记录。字段定义提供BDE分配虚拟字段内存空间的信息。
    字段定义的描述如下:
  Field:虚拟的字段名,总是以Field加一个整形数字。如Field1。第一个Field为Field1。
Field name:定义显示的字段名。
Field type:定义数据的BDE类型。
名称类型描述
CHAR字符串
FLOAT64位的浮点型
NUMBER16为的整数
BOOL逻辑型,为True或False
LONGINT32位的整形
DATE日期字段
TIME时间字段
TIMESTAMP日期+时间字段
(日期和时间格式为BDE设置中设置的格式.)
Data value length:最大的字段长度。
Number of decimals:适用于浮点数,定义小数点的位数
Offset:描述起始位值
例如有一数据文件的第一字段为字符串,字段名为“Text”,最大长度为3个字符,没有小数点(字符串类型总是没有小数点),并起始偏移量为0(因为是第一字段)。所以定义如下:
Field1=Text,Char,3,00,00
下面是一个具有三个字段的格式定义文件,第一个字段为字符串,第二、三字段为日期型字段,格式定义文件如下(ASCII文件名为DATES.TXT,所以SCH文件名为DATES.SCH):
[DATES]
Filetype=VARYING
Delimiter="
Separator=,
CharSet=ascii
Field1=Text,Char,3,00,00
Field2=First Contact,Date,10,00,03
Field3=Second,Date,10,00,13
这个格式定义文件为逗号分隔的文件。注意计算偏移量和小数点的定义。
    一个ASCII逗号分隔的文件的偏移量不再是ASCII文件中的真正偏移量,但是这个长度参数将定义此字段的最大长度,并且有利于内存的管理。
    实际上,如果你还有不太明白的地方,可以使用Database Desktop来创建一个ASCII数据表,观察SCH文件的定义和ASCII文件的存储格式。
    如果你熟练掌握ASCII数据库的应用,在实际的工作中有许多需要直接文件操作的工作可以使用数据库来实现,减轻工作量和提高程序的稳定性。
在StringGrid中按照自己的要求显示内容
将StringGrid的DefaultDrawing属性设为False,在OnDrawDataCel事件中添加代码
 procedure TForm1.StringGrid1DrawDataCell(Sender: TObject; const Rect: 
            TRect;Field: TField; State: TGridDrawState);
            begin
            if Field.FieldName = 'NAME' then {字段名为NAME}
            { 字体颜色改为红色并显示内容 }
            (Sender as TStringGrid).Canvas.Font.Color := clRed;
            (Sender as TStringGrid).Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 
            2,Field.AsString);
            end;
8.10.1使StringGrid的某几笔资料变色,像标计一样??
你可在 StringGrid 元件的 DrawDataCell 事件中, 依资料的条件性来改变格子或文字的颜色.如 :
OnDrawDataCell(...)
begin
with TStringGrid(Sender) do
begin
if (条件) then
Canvas.TextOut(Rect.Left + 4, Rect.Top + 2, '要显示的文字, 如表格的资料');
end;
而你会看到 StringGrid 的显示资料怎麽有重叠的情况, 那是因为原本StringGrid
要显示的资料与 TextOut 所显示的资料重叠, 解决方法 :
在 Query 元件所加入的栏位(在元件上按右键, 会有 Add Fields...的选单), 在
不要显示资料的栏位的 OnGetText 事件中有一参数设定为 False;
procedure TForm1.Query1Detail1GetText(Sender: TField; var Text: string;
DisplayText: Boolean);
begin
// 决定在 StringGrid 得知表格资料时, 要不要显示所得到的资料, False -> 不显示
// 就可避免与 TextOut 的文字重叠了
DisplayText : = False;
end;
end;
如果用 Delphi 3 处理很简单.
例如,对表中某字段当其数值小于0时为红字,其他为黑字.
在 StringGrid.OnDrawColumnCell(...) 中:
begin
if TableField.AsInteger < 0 then
StringGrid.Canvas.Font.Color := clRed
else
StringGrid.Canvas.Font.Color := clBlack;
StringGrid.DefaultDrawColumnCell(...);
end;
这样,对 Field 指定的格式仍旧生效,不必重写.
end;