Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить целочисленный тип, принимающий значения -1 и 1?


Mike0902 ©   (2005-11-21 13:39:00) 

Как определить целочисленный тип, принимающий значения -1 и 1?


Джо   (2005-11-22 03:29:00) [1]

В некоторой мере стёб, но иногда бывает уместно нагородить и так:

 IPlusMinus = interface
   function GetValue: Integer;
   property Value: Integer read GetValue;
   function Equals (PlusMinus: IPlusMinus): Boolean;
 end;

 function Plus: IPlusMinus;
 function Minus: IPlusMinus;

implementation

type
 TPlusMinus = class (TInterfacedObject, IPlusMinus)
 private
   FValue: Integer;
   function GetValue: Integer;
   function Equals (PlusMinus: IPlusMinus): Boolean;
 public
   constructor Create (AValue: Integer);
 end;

function Plus: IPlusMinus;
begin
 Result := TPlusMinus.Create(1);
end;

function Minus: IPlusMinus;
begin
 Result := TPlusMinus.Create(-1);
end;

{ TPlusMinus }

constructor TPlusMinus.Create (AValue: Integer);
begin
 inherited Create;
 Assert ( (AValue=1) or (AValue=-1), 'Incorrect value in assignment');
 FValue := AValue
end;

function TPlusMinus.Equals(PlusMinus: IPlusMinus): Boolean;
begin
 Result := FValue = PlusMinus.Value
end;

function TPlusMinus.GetValue: Integer;
begin
 Result := FValue
end;

Бредовенький пример:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 Direction: IPlusMinus;
begin
 case Button of
   mbLeft: Direction := Minus;
   mbRight: Direction := Plus;
   mbMiddle: raise Exception.Create('Incorrect button pressed');
 end;

 // так
 ShowMessageFmt ('Direction: %d',[Direction.Value]);

 // или так
 if Direction.Equals(Minus) then
   ShowMessage ('This is a minus direction')
 else
   ShowMessage ('This is a plus direction')
end;


Главное, нужные методы (в зависимости от области применения) задать в интерфейсе. Или принимать параметр типа IPlusMinus в других методах, выполняющих то или иное действие в зависимости от значения. В принципе, иногда выглядит очень наглядно.


Zeqfreed   (2005-11-21 23:27:00) [2]

Кефир87 ©   (21.11.05 22:47) [9]
Неа, нолик лишний :(


Кефир87   (2005-11-21 22:47:00) [3]


type
TPlusMinus = -1..1;

???


Reindeer Moss Eater   (2005-11-21 17:05:00) [4]

Отсюда вывод: такой тип не нужен вообще.


Reindeer Moss Eater   (2005-11-21 16:55:00) [5]

C приведением типов этот тип может напринимать много разных значений.
Ноль, сто, экземпляр TButton, False и т.д.


Leonid Troyanovsky   (2005-11-21 16:45:00) [6]


> Mike0902 ©   (21.11.05 15:52) [4]
> Согласен. Все равно приобразовывать придется. Нельзя наверно
> определить такой тип


А зачем? Boolean вполне хватает.

--
Regards, LVT.


Anatoly Podgoretsky   (2005-11-21 16:25:00) [7]

Mike0902 ©   (21.11.05 14:10) [2]
Не обязательно, можно и type TPlusMinus = (PlusOne=1, MinusOne=-1);


Mike0902   (2005-11-21 15:52:00) [8]

Согласен. Все равно приобразовывать придется. Нельзя наверно определить такой тип


Reindeer Moss Eater   (2005-11-21 14:55:00) [9]

> тип, принимающий значения -1 и 1?

Тип TPlusMinus может принимать значения MinusOne и PlusOne.


Mike0902   (2005-11-21 14:10:00) [10]

спасибо, направление нужни было задать


MBo   (2005-11-21 13:48:00) [11]

Это нужно?

type TPlusMinus = (MinusOne=-1, PlusOne=1);


Наверх

Титульная страница Поиск, карта сайта Написать письмо