Delphi - TQuery .AsString для возврата 0 или 1 для значений логического поля - PullRequest
4 голосов
/ 21 сентября 2011

Как я могу заставить Delphi 7 возвращать '0' или '1', если FieldType поля потомка TQuery является ftBoolean? По умолчанию возвращается «ИСТИНА» или «ЛОЖЬ», то есть

Query1.Fields[0].AsString вернется '0', а не 'FALSE'

Ответы [ 6 ]

4 голосов
/ 21 сентября 2011

Использование

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

для установки строки в форме «ИСТИНА; ЛОЖЬ» (или «1; 0»). Это позволяет вам определить, какие значения AsString будет возвращать.

Если вы добавили поле во время разработки и / или получили компонент логического поля, вы можете использовать его и без Typecast:

Query1YourBooleanField.DisplayValues := 'TRUE;FALSE';

Между прочим, это не запрос, который возвращает '0', не запрос, который 'is' ftBoolean. Эти поля в запросе представляют собой поля в таблице или наборе результатов запроса.

2 голосов
/ 21 сентября 2011

Измените STextFalse и STextTrue строки ресурсов в 'dbconsts.pas'. Вы можете поместить модифицированную версию файла в папку вашего проекта или просто локализовать ваше приложение.


Если вы хотите изменить строки во время выполнения, вы можете использовать следующее ( 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);
  [...]
2 голосов
/ 21 сентября 2011

Почему бы просто не использовать Query1.Fields [0] .AsInteger, если вы хотите числовое представление для логического значения? Я думаю, что это должно работать ...

1 голос
/ 21 сентября 2011

Лично я использую этот трюк в таких ситуациях:

const DigitBool: array[Boolean] of string = ['0', '1'];
//and than
Caption := DigitBool[Query1.Fields[0].Value];
0 голосов
/ 07 октября 2011

К сожалению, похоже, что единственный способ сделать это - проверить для каждого TField:

, если (Query1.Fields[i] is TBooleanField), а затем использовать один из методов, представленных выше.

Не существует глобальногоTField.AsString хак, насколько я знаю.

0 голосов
/ 21 сентября 2011

Hardcast это как

var ZeroOrOne: Byte;
ZeroOrOne := Byte(Query1.Fields[0].Value);
...