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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2015, 19:27   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию Подскажите, как различать способы сравнения значений и параметров

Конечно это пофигизм с моей стороны столько времени прошло, но до сих пор попадаюсь на таких штуках:
Вот есть например компонент TIBDataSet, у него есть свойство «State property (TDataSet)», которое может принимать значения «dsInactive, dsBrowse и т.д»
Для использования проверки состояния, мы используем запись:
Код:
if (IBDataSet.State in [dsInsert, dsEdit]) then
Или например компонент DBGrids, у него есть событие «DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState)», у которого параметр « State» может принимать три значения («gdSelected », «gdFocused» и « gdFixed»)
Для использования проверки состояния, мы используем запись:
Код:
if (gdSelected in State) then
Или
Код:
if (gdFocused in State) then
Я бы написал - (if (State in gdFocused) then), что есть не правильно, или того хуже - ((if (State = gdFocused) then))

Как различать подобные способы записей?

Спасибо

Последний раз редактировалось KBO; 25.12.2015 в 19:33.
KBO вне форума Ответить с цитированием
Старый 25.12.2015, 19:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего различать то? Это не приводимые типы и сравнение в лоб не катит. State это множество некого перечислимого типа. gdFocused - одно из значений этого перечислимого типа.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.12.2015, 21:44   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Я немного не про то.
Вот например, захотел я использовать свойство "State" в DataSet. Пошел я в помощь по "State" в DataSet, благо там есть пример, в котором
1.
Код:
...if State = dsEdit then ...
,
хотя можно и воспользоваться записью
2.
Код:
if (IBDataSet.State in [dsEdit]) then
Хотя запись "2." тоже приемлема, но в примере ее нет.

Ну, а что касается события "OnDrawColumnCell", то там примера вообще нет. И начинаешь мудрить, как правильно записать, чтоб отладчик не ругался.
А если примера нет, то подразумевается, что программист сам должен знать правильный синтаксис написания (вот я про что).

Последний раз редактировалось KBO; 25.12.2015 в 21:54.
KBO вне форума Ответить с цитированием
Старый 25.12.2015, 22:05   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А, то я еще больше запутал. State само значение перечислимого типа. Тогда его можно сравнивать с другим значением этого же типа, так и определять его входимость в множество со значениями этого типа. И мало ли, примера нет. Там в хелпе много чего нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.12.2015, 23:09   #5
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Вот вы, из помощи к "State" «DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState)
можете сразу сказать, и написать, что
Код:
if (gdFocused in State) then
запись правильная
а
Код:
if (State in gdFocused) then
запись не правильная???

И если "Да" - то откда это видно?
KBO вне форума Ответить с цитированием
Старый 25.12.2015, 23:19   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего нет? Смотрю тип State:
Код:
TGridDrawState = set of (gdSelected, gdFocused, gdFixed);
Множество. Ну и обращаюсь с параметром State в соответствии с его типом. Не пойму затруднений.

Тип State из датасета другой -
Код:
type TDataSetState = (dsInactive, dsBrowse, dsEdit, dsInsert, dsSetKey, dsCalcFields, dsFilter
      , dsNewValue, dsOldValue, dsCurValue, dsBlockRead, dsInternalCalc, dsOpening);
Совсем не множество. Разница очевидна
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Stilet; 26.12.2015 в 09:32.
Аватар вне форума Ответить с цитированием
Старый 25.12.2015, 23:40   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Так тут же просто все понятно
как можно иметь в датасете состояние сразу например и dsEdit и dsInactive, очевидно никак, стало быть = State, или State in [] но нельзя dsEdit in State.
Другое дело с гридом, там может быть сразу несколько состояний, соответственно и проверка.
come-on вне форума Ответить с цитированием
Старый 25.12.2015, 23:51   #8
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

А немного стало проясневатся.
А ключевое сово "in", может применятся и к множеству и к перечисляемому типу.
С тем условием, что в множестве нельзя сразу проверить вход всех элементов в множество, т.е. нельзя написать
Код:
if ([gdFocused, gdSelected]	in State) then
в отличии от перечисляемого типа например проверка состояний в DataSet:
Код:
if (State in [dsInsert, dsEdit]) then
Цитата:
Сообщение от come-on Посмотреть сообщение
Так тут же просто все понятно
как можно иметь в датасете состояние сразу например и dsEdit и dsInactive, очевидно никак, стало быть = State, или State in [] но нельзя dsEdit in State.
Другое дело с гридом, там может быть сразу несколько состояний, соответственно и проверка.
Как раз наоборот, у меня что-то не получается сделать:
Код:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if ([gdFocused, gdSelected]	in State) then
...
ошибку выкидывает

Последний раз редактировалось Stilet; 26.12.2015 в 09:28.
KBO вне форума Ответить с цитированием
Старый 26.12.2015, 00:02   #9
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

вы ищете множество в множестве, вот и вся наоборот

Если = работает в обе стороны, т.е. А = В тождественно В = А, то ин работает только в 1 сторону, что то одно в (in) множестве, и переставить нельзя, это простите тоже пофигизм в понимании?

Последний раз редактировалось Stilet; 26.12.2015 в 09:32.
come-on вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Организация программ с использованием процедур .использованием параметров-значений и параметров переменных Фрейтор 40-500 Помощь студентам 0 02.11.2012 21:58
Организация программ с использованием процедур .использованием параметров-значений и параметров переменных Фрейтор 40-500 Помощь студентам 6 02.11.2012 21:46
Вычисление значений функции для нескольких значений аргументов и параметров kolychii Помощь студентам 0 08.10.2012 15:49
Способы сравнения конкуренции тематических полей сайтов Linel Свободное общение 0 12.09.2011 19:20
как привязать запуск макроса к результату сравнения значений zander Microsoft Office Excel 2 14.02.2009 13:42