【问题标题】:Delphi - TQuery .AsString to return 0 or 1 for Boolean field valuesDelphi - TQuery .AsString 为布尔字段值返回 0 或 1
【发布时间】:2011-09-21 05:31:06
【问题描述】:

当 TQuery 后代字段的 FieldType 是 ftBoolean 时,如何让 Delphi 7 返回“0”或“1”?默认情况下,这会返回 'TRUE' 或 'FALSE',即

Query1.Fields[0].AsString 将返回 '0',而不是 'FALSE'

【问题讨论】:

  • 感谢大家的回答,不幸的是,我希望在执行函数调用时设置一个全局模块。在这种情况下,我不知道该字段将是什么类型,并且希望快速设置,然后恢复解决方案,而不必检查该字段是否为 TBoleanField。哦,好吧:)
  • 基本上我的目标是使用 TField 的 AsString 方法将任何查询导出到 CSV 文件。我没有设置这个查询设计时间,只在运行时

标签: string delphi delphi-7


【解决方案1】:

使用

(Query1.Fields[0] as TBooleanField).DisplayValues := 'TRUE;FALSE';

以'TRUE;FALSE'(或'1;0')的形式设置字符串。这允许您定义 AsString 将返回的值。

如果您在设计时添加了该字段,并且/或者您有一个布尔字段组件,那么您也可以使用它,而无需进行类型转换:

Query1YourBooleanField.DisplayValues := 'TRUE;FALSE';

顺便说一句,返回“0”的不是查询,也不是“是”ftBoolean 的查询。这些是查询中的字段,代表表或查询结果集中的字段。

【讨论】:

  • 有没有办法对所有字段执行此操作(无需执行 0-FieldCount-1)?也就是说,我不确切知道哪个字段将是布尔值,但如果是,我希望它返回 '0' 或 '1'
  • 嗯,这个程序在Delphi7上好像不存在
【解决方案2】:

如果您想要布尔值的数字表示,为什么不简单地使用 Query1.Fields[0].AsInteger 呢?我认为这应该工作......

【讨论】:

  • 不幸的是,这会给我一个整数。我的最终目标是将(任何)查询导出到 CSV 文件,但要全局设置选项以更改输出
【解决方案3】:

修改“dbconsts.pas”中的STextFalseSTextTrue 资源字符串。您可以将文件的修改版本放入您的项目文件夹,或者像本地化您的应用程序一样进行。


如果您想在运行时修改字符串,可以使用以下 (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);
  [...]

【讨论】:

  • 这是我的想法,但我不确定我是否可以在我的应用程序中调用此 x 次以设置为 '0,1' 然后返回 'TRUE,FALSE'?跨度>
【解决方案4】:

我个人在这种情况下使用这个技巧:

const DigitBool: array[Boolean] of string = ['0', '1'];
//and than
Caption := DigitBool[Query1.Fields[0].Value];

【讨论】:

  • 你可以这样做,但它不会改变 AsString 的行为,这同样容易实现,甚至可以在设计时进行更改,而无需编写额外的代码。如果该字段不是布尔字段,则此代码将失败。否则,带有布尔索引数组的解决方案是一个很好的解决方案,我喜欢使用很多。
  • 是的,这不会改变 AsString 的行为 :(
  • 此代码适用于任何布尔变量,而不仅仅是字段。这就是我喜欢它的原因。
【解决方案5】:

不幸的是,这样做的唯一方法似乎是检查每个 TField:

如果(Query1.Fields[i] is TBooleanField) 然后使用上面提供的方法之一。

据我所知,没有全球性的TField.AsString hack。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 2017-11-13
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 2021-09-11
    • 2013-09-03
    相关资源
    最近更新 更多