当TQuery后代的Field的FieldType是ftBoolean时,如何让Delphi 7返回'0'或'1'?默认情况下,它返回“TRUE”或“FALSE”,即
Query1.Fields[0].AsString
会返回'0'
,而不是'FALSE'
答案 0 :(得分:4)
使用
(Query1.Fields[0] as TBooleanField).DisplayValues := 'TRUE;FALSE';
以'TRUE; FALSE'(或'1; 0')的形式设置字符串。这允许您定义AsString将返回的值。
如果您在设计时添加了字段,并且/或者您自己有一个布尔字段组件,那么您也可以使用它,而无需使用类型转换:
Query1YourBooleanField.DisplayValues := 'TRUE;FALSE';
顺便说一句,它不是返回'0'的查询,而不是'是'ftBoolean的查询。这些是查询中表示表或查询结果集中字段的字段。
答案 1 :(得分:2)
为什么不简单地使用Query1.Fields [0] .AsInteger如果你想要一个布尔值的数字表示?我认为这应该有用......
答案 2 :(得分:2)
修改'dbconsts.pas'中的STextFalse
和STextTrue
资源字符串。您可以将文件的修改版本放到项目文件夹中,或者就像本地化您的应用程序一样。
如果您想在运行时修改字符串,可以使用以下(credit):
[...]
implementation
uses
dbconsts;
{$R *.dfm}
procedure SetResourceString(ResStringRec: pResStringRec; NewStr: string);
var
OldProtect: DWORD;
begin
if ResStringRec = nil then
Exit;
VirtualProtect(ResStringRec, SizeOf(ResStringRec^),
PAGE_EXECUTE_READWRITE, @OldProtect) ;
ResStringRec^.Identifier := Integer(NewStr) ;
VirtualProtect(ResStringRec, SizeOf(ResStringRec^), OldProtect, @OldProtect) ;
end;
const
TextFalse = '0';
TextTrue = '1';
procedure TForm1.FormCreate(Sender: TObject);
begin
SetResourceString(@STextFalse, TextFalse);
SetResourceString(@STextTrue, TextTrue);
[...]
答案 3 :(得分:1)
我个人在这种情况下使用这个技巧:
const DigitBool: array[Boolean] of string = ['0', '1'];
//and than
Caption := DigitBool[Query1.Fields[0].Value];
答案 4 :(得分:0)
不幸的是,似乎唯一的方法是检查每个TField:
if (Query1.Fields[i] is TBooleanField)
然后使用上面提供的方法之一。
据我所知,没有全球TField.AsString
黑客攻击。
答案 5 :(得分:-3)
将其硬编为
var ZeroOrOne: Byte;
ZeroOrOne := Byte(Query1.Fields[0].Value);