动态创建access表出现的小问题(100分)

  • 主题发起人 主题发起人 gxw
  • 开始时间 开始时间
G

gxw

Unregistered / Unconfirmed
GUEST, unregistred user!
用sql语句动态创建了一个access表Table1:

create table Table1(remark char(255) with comp,answer char(10) with comp)

建表后用dbgrideh编辑该表,遇到个小问题:若某行记录的remark字段已有字符,则鼠标点击时字符会先跑到左边隐藏的位置,只显示后面的空白部分,短光标时也是全行蓝色的(字符+空白部分)。尝试过用以下语句去掉后面的空字符,但完全无效:
update Table1 set remark=rtrim(remark)


若用手动创建此表,只要设置了Unicode=True后根本无此问题,但为何动态建立就不行?头大中~~~
 
这个问题的主要原因是Table中,ramark字段是定长的。所以在DbGridEh中编辑的时候,字符串有空格补空!
TStringField在实现这种定长的字段的时候,获得数据的时候:
function TStringField.GetValue(var Value: string): Boolean;
var
Temp: String;
pBuff: PChar;
Buffer: array[0..dsMaxStringSize] of Char;
begin
if DataSize > dsMaxStringSize then
begin
SetLength(Temp, DataSize);
pBuff := pChar(Temp);
Result := GetData(pBuff);
if Result then
SetLength(Temp, strlen(PBuff));
end else
Result := GetData(@Buffer); /// 255的长度,走这个分支。
if Result then
begin
if DataSize > dsMaxStringSize then
Value := Temp
else
Value := Buffer;
if Transliterate and (Value <> '') then
DataSet.Translate(PChar(Value), PChar(Value), False);
end;
end;
所以其长度是Record中定义的长度。

如果Unicode则不一样,
首先是用类TWideStringField
function TWideStringField.GetAsWideString: WideString;
begin
GetData(@Result, False);
end;
/// 注意一下GetData的第二个参数,表示在GetData的时候,需要使用NativeFormat,这个时候系统自动处理了长度问题。

其实楼主的问题也好解决啊:
只要响应OnGetFieldText事件,加上
procedure TForm1.Table1aaaGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
SetLength(Text, StrLen(PChar(Text)));
end;
 
谢谢xiammy!
结帖~[:D]
 
后退
顶部