@ndbn

Как присвоить выражение boolean полю TObject?

Имеется класс с полем тип TObject.
Значение поля может быть булевого типа илил другим классом.
Не получается присвоить ему булевое значение, приведения типов (явное или as TObject) не помогают.
Возможно ли это сделать вообще, может стоит как-то сделать свой TBoolean?!

TBar = class
    field : TObject;
  end;
... 
var 
  bar : TBar;
...  
  bar.field := True;
  • Вопрос задан
  • 434 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Попробую угадать задачу. Есть некое поле (назовём его UserData), но у нас-то пользовательские данные boolean!

Решение 1. Прямое преобразование, невзирая на несовместимости типов.
someObj.UserData := TObject(true);
someBool := boolean(someObj.UserData);

+ Эффективнее всех.
− Запрещено разыменовывать.

Решение 2. Создать некий объект DummyObject. Обозначить nil=false, <>nil = true.
someObj.UserData := dummyObject;
someBool := (someObj.UserData <> nil);

initialization
  dummyObject := TObject.Create;
finalization
  dummyObject.Free;
end.

+ Достаточно эффективно, можно разыменовывать.
− Если в классе есть неотключаемое автоуничтожение UserData — облом!

Решение 3. Создать класс TBoolObject.
TBoolObject = class
public
  Value : boolean;
  // конструкторы опущу, деструктор не нужен
end.

someObj.UserData := TBoolObject(true);
someBool := (someObj.UserData as TBoolObject).Value;

+ Работает, когда в классе есть автоуничтожение UserData.
− Иначе — овчина не стоит выделки, тогда нам эти объекты придётся уничтожать самим.

Если же у вас тут экономия памяти и надо в одной памяти держать object или boolean, работает решение 4.
TObjBool = record
case integer of
0 : ( asObj : TObject );
1 : ( asBool : boolean );
end;

+ Очень эффективно.
− Программист сам должен следить за тем, что там: объект или буль.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kalapanga
Изврат какой-то придумали. Конечно нельзя так.
А как надо, не зная задачи, никто не подскажет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы