Как преобразовать целочисленное значение в логическое значение в Delphi

У меня есть значение поля базы данных, которое представляет собой целое число, например 0 и 1. Можно ли преобразовать это целочисленное значение в логическое значение при загрузке данных в сетку БД. Я ожидаю без проверки условий, как прямое приведение типов.

Спасибо


person Able Alias    schedule 05.10.2011    source источник
comment
Не знаю насчет баз данных, но вопрос в заголовке очень простой. Если i: integer, то i = 1 является логическим значением.   -  person Andreas Rejbrand    schedule 05.10.2011
comment
@Andreas: i <> 0, вероятно, немного более идиоматичен и надежен.   -  person Uli Gerhardt    schedule 05.10.2011
comment
@Ulrich: Вы абсолютно правы.   -  person Andreas Rejbrand    schedule 05.10.2011
comment
AFAIK, вы не можете этого сделать. логический тип имеет 2 возможных значения, а целочисленный гораздо больше возможных значений. Так что НЕТ нельзя.   -  person RBA    schedule 05.10.2011
comment
@RBA: преобразование может привести к потере информации (преобразование двойного числа в целое число - та же ситуация), поэтому нет причин, по которым вы не можете преобразовать целое число в логическое значение.   -  person jpfollenius    schedule 05.10.2011
comment
@Smasher - действительно, это правда .... в любом случае, я бы не стал разрабатывать приложение + dbb, где поле имеет целочисленный тип, и я манипулирую им как логическим значением. ИМХО это ни-ни   -  person RBA    schedule 05.10.2011
comment
@RBA - MySQL, например, не имеет логического типа (он использует tinyint(1) для хранения значений истинности). Пока семантика одинакова, вы можете безопасно использовать if (val <> 0) then true else false или что-то в этом роде.   -  person Leonardo Herrera    schedule 05.10.2011
comment
Какова цель конверсии?   -  person NGLN    schedule 06.10.2011


Ответы (5)


Я предполагаю, что вы хотите показать поле базы данных в DBGrid как CheckBox. Если да, прочтите статью Зарко Гайича. Речь идет о логических полях, но вы можете легко модифицировать код под свои нужды.

person kludg    schedule 05.10.2011

Невозможно преобразовать целое число в логическое значение. вы можете реализовать такую ​​​​функцию

function IntToBool(const AnInt: Integer): Boolean;
begin
   if AnInt = 0 then Result := False
                else Result := True;     
end;
person Amin Alinezhad    schedule 08.05.2019
comment
Или проще: Result := AnInt <> 0; Альтернативно Result := LongBool(AnInt); - person Tom Brunberg; 08.05.2019

Самым простым решением вашей проблемы, вероятно, будет использование логического поля вычисления.

Если вам нужно отредактировать его из DBGrid, это становится немного сложнее (но все же возможно).

person Ken Bourassa    schedule 05.10.2011

Если вы хотите отобразить слова «True» и «False» в DBGrid, вы должны использовать событие OnGetText Field следующим образом:

procedure TMyForm.MyDataSetFieldGetText(Sender: TField;
  var Text: string; DisplayText: Boolean);
begin
 case Sender.AsInteger of
  0 : Text := 'False';
  1 : Text := 'True';
 else
  Text := '-';
 end;
end;
person G3ntle_Man    schedule 09.04.2019

попробуйте эту примерную функцию здесь:

 function IntToBooleanStr(AInteger: Integer): string;
 begin
   case AInteger of
     0:begin
         Result := 'False';
       end;
     1:begin
         Result := 'True';
       end 
       else
           Result := 'False';
   end;
 end;

это все, и вы можете использовать его внутри выпадающего списка onChange Event для ФИЛЬТРАЦИИ некоторых логических данных, которые имеют логические значения внутри.
как здесь:

procedure TFrm_Books.ComBox_AvailableFilterChange(Sender: TObject);
begin   
   Table_Book.Filtered := False;
   Table_Book.FilterOptions := [foCaseInsensitive];
   Table_Book.Filter := '';
   Table_Book.Filter := 'Available = ' + IntToBooleanStr(ComBox_AvailableFilter.ItemIndex);
   Table_Book.Filtered := True;
end;

а вот код DFM для этого поля со списком:

object ComBox_AvailableFilter: TComboBox
  Left = 336
  Top = 120
  Width = 193
  Height = 21
  ItemHeight = 13
  Items.Strings = (
    'Not Available'
    'Available')
  TabOrder = 0
end

Я надеюсь, что эта функция разрешит ваш вопрос выше.

person Bravesaw    schedule 17.04.2018