Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 18:09   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию Типы вида: type TOptions = (to1,to2,yo3);

Доброго времени суток!

как реализуется тип данных, которые принимает, к примеру:
Код:
TForm.Anchors
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2011, 18:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
type TAnchors = set of TAnchorKind;
type TAnchorKind = (akTop, akLeft, akRight, akBottom);
Это же в хелпе описано
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2011, 18:28   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Нет, мне не надо знать, что это. Я знаю=)
Я хочу видить это у себя в программе. Не знаю как реализуется.

Как-то так?
Код:
const
  to1=0;
  to2=2;
  to3=3;

type
  TOptions = (to1,to2,to3);
?
Человек_Борща вне форума Ответить с цитированием
Старый 23.10.2011, 18:35   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а.
Ну это тебе нуна почитать из классического паскаля
Код:
type
  TOptions = (to1,to2,to3);
И все. to - это не константы, их не нужно описывать. им итак назначается "индекс" по мере их всплывания в set-e.
А использовать в коде так:
Код:
if [to1] in Option then в переменной установленно to1
http://www.pascal.helpov.net/index/p...ts_programming
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2011, 19:42   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,886
По умолчанию

Аа, вон оно что, Человек_Борща а я как-то даже удивился когда ответил Вам что енумы смотрелись бы лучше для кода в какой-то Вашей теме, я полагал, Вы знаете..
Ну что ж :
enumerated types (можно глянуть справку по ним) представляют из себя пользовательский тип данных, описываются примерно так:
Код:
TCardType = (ctSpades, ctClubs, ctDiamonds, ctHearts ); // по Стингу ))
в реальности получаются как бы именованные константы последовательного диапазона, счёт идёт от 0.
номер такого значения можно получить Ord'ом, получить такое значение по номеру можно так : имя типа(номер), т.е. применительно к нашему примеру : TCardType(1)= ctClubs
Рекомендую ещё почитать справку, там есть кое-какие тонкости простых и нумерованных енумов
Образовывать сеты (наборы значений) из таких данных можно так:
Код:
TCardTypes = set of TCardType;
var redcards : Tcardtypes;
...
redcards := ctDiamonds+ctHearts ; // теперь в redcards 2 из 4 значений
тут же справку по сетам рекомендую - изучить оператор in и функции include , exclude
phomm вне форума Ответить с цитированием
Старый 23.10.2011, 20:26   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Благодарю, очень полезный ответ=)
Человек_Борща вне форума Ответить с цитированием
Старый 26.10.2011, 09:38   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Реализовал:
Код:
type
  TSheduleTaskActionSet=(saStart,saStop,saRestart);
  TSheduleTaskAction=set of TSheduleTaskActionSet;
но при коде:
Код:
   case aTask.Action of
   saStart: LI.Caption:=RssaStart;
   saStop: LI.Caption:=RssaStop;
   saRestart: LI.Caption:=RssaRestart;
   end;
выпадает ошибка, несовместимости типов Integer и TSheduleTaskActionSet;
Цитата:
[Error] SheduleTaskMgrUnit.pas(68): Ordinal type required
[Error] SheduleTaskMgrUnit.pas(69): Incompatible types: 'Integer' and 'TSheduleTaskActionSet'
[Error] SheduleTaskMgrUnit.pas(70): Incompatible types: 'Integer' and 'TSheduleTaskActionSet'
[Error] SheduleTaskMgrUnit.pas(71): Incompatible types: 'Integer' and 'TSheduleTaskActionSet'
[Fatal Error] ProccesUnit.pas(8): Could not compile used unit 'SheduleTaskMgrUnit.pas'
[Fatal Error] Internal error: U2425
где баг?

и как через комбобокс.итеминдекс передать тип?
пробовал так:
Код:
        st := TSheduleTask.Create;
        st.Action := TSheduleTaskAction(ActionBox.ItemIndex);
не воркает..

Последний раз редактировалось Человек_Борща; 26.10.2011 в 10:08.
Человек_Борща вне форума Ответить с цитированием
Старый 26.10.2011, 09:57   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если Action типа TSheduleTaskAction, то так нельзя. Можно если тип TSheduleTaskActionSet. TSheduleTaskAction - множество и проверка if saStart in Action then ...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.10.2011, 10:05   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

case [saStart,saStop] of //что делать не скажет никто

зачем здесь множество
исходя из именований и приведенного кода
aTask.Action должно быть TSheduleTaskActionSet , т.е. ОДНО ИЗ (saStart,saStop,saRestart) НО не TSheduleTaskAction их набором (set of TSheduleTaskActionSet) .
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.10.2011, 12:56   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,886
По умолчанию

Я может не понял, но вроде сет тут просто не нужен, используем его, коли мы хотим хранить вместе несколько разнозначимых значений одного типа (енума), а если не надо несколько, а только всегда одно значение, то выкинуть вообще сет, оставить везде только енум-тип TSheduleTaskAction (обозвать енум словом с set на конце и сет по такому же имени, но без set - разрыв :D )
тогда его (енум) можно будет проверять в кейсах и передавать из комбобокса с приведением типа.

ПС то же , что высказал evg_m, но иными словами

К слову - когда я говорил о полиморфмизме, я намекал на то, что можно сделать ещё изящней на классах и не понадобится куча кейсов, (могу даже предоставить пример), но, сейчас уже думаю, что в данной задаче это будет избыточно.

И ещё кстати - очень люблю пользоваться RTTI енумов и функциями GetEnumName и GetEnumValue - дичайше удобные вещи для перевода енумов сразу в строки и обратно (в примере , который я предлагаю, это есть, коли таки надо - в личку )

Последний раз редактировалось phomm; 27.10.2011 в 13:09.
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Could not convert variant of type (Olestr) into type (Double) java_91 Общие вопросы Delphi 1 18.02.2011 18:46
The type name 'GreenShalControl' does not exist in the type Beton_net WPF, UWP, WinRT, XAML 0 15.02.2011 11:24
Could not convert variant of type (UnicodeString) into type (Double) postaveche БД в Delphi 11 13.12.2010 16:41
[C] Абстрактные типы данных. Реализация дерева общего вида. Dju Помощь студентам 0 11.05.2009 18:11