Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите правильно составить условие


Автор: -Сергей- 4.6.2013, 09:10
Имеется ListView со стилем Report. Необходимо пройтись по всем элементам, и в зависимости от выделенного элемента и его значения в некоем столбце произвести определенные действия. 
Но почему-то условие
Код

ListView1.Items.Item[I].Selected

всегда срабатывает правильно, а это:
Код

(
  (copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) <> 'Зав')
  OR (copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) <> 'Отм')
)

всегда "истина", несмотря на то что в столбце указаны данные, при которых условие должно выполниться.
Где закралась ошибка?

Код

...
    for I := 0 to ListView1.Items.Count - 1 do
      begin
      if (
           (ListView1.Items.Item[I].Selected)
           AND
           (
             (copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) <> 'Зав')
             OR (copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) <> 'Отм')
           )
          ) then ShowMessage('Истина');
...


Автор: bars80080 4.6.2013, 09:37
Цитата(-Сергей- @  4.6.2013,  09:10 Найти цитируемый пост)
Где закралась ошибка?

здесь

Цитата(-Сергей- @  4.6.2013,  09:10 Найти цитируемый пост)
(copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) <> 'Зав')
  OR (copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) <> 'Отм')

это условие всегда будет истинно, потому что у тебя написано:

if(A != 10 OR A != 15)

ясно же, что A всегда будет неравно какому-то одному из этих значений

Автор: -Сергей- 4.6.2013, 10:07
Поправил.
Код

...
    for I := 0 to ListView1.Items.Count - 1 do
      begin
      if (
           (ListView1.Items.Item[I].Selected)
           AND NOT
           (
             (copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) = 'Зав')
             OR (copy(ListView1.Items.Item[I].SubItems.Strings[2],1,3) = 'Отм')
           )
          ) then ShowMessage('Истина');
...


Цитата(bars80080 @  4.6.2013,  13:37 Найти цитируемый пост)

if(A != 10 OR A != 15)
ясно же, что A всегда будет неравно какому-то одному из этих значений

Но почему? Не догоняю...

Автор: Poseidon 4.6.2013, 14:20
Цитата(-Сергей- @  4.6.2013,  10:07 Найти цитируемый пост)
Но почему? Не догоняю...
Ну вот вникай:
  • Твое выражение равно 'Зав'. Тогда первое условие не выполняется (по условию должно быть не равно 'Зав', а у нас равно 'Зав'), а второе - выполняется (должно быть не равно 'Отм', у нас так и есть 'Зав' <> 'Отм'). Раз у нас оператор or, то раз одно из условий выполняется (True), значит и все выражение выполняется.
  • Твое выражение равно 'Отм'. Первое условие выполняется ('Зав' <> 'Отм'), второе не выполняется. Но раз одно из условий True (первое), то и все выражение True
  • Твое выражение не равно ни 'Зав', ни 'Отм' (допустим там 'АБВ'). Выполняются оба условия ('АБВ' <> 'Зав' и 'АБВ' <> 'Отм').

Добавлено через 3 минуты и 14 секунд
А общем можешь в первом примере заменить or на and и будет то, что надо.

Автор: -Сергей- 5.6.2013, 04:05
Спасибо, все разжевал. Теперь все стало понятно. 
Виновато человеческое рассуждение (или это или то)
Я то рассуждаю логически как: если А не равно 10 или А не равно 15 то ...
Выходит немного неправильно.

Автор: Beltar 5.6.2013, 07:22
Через else if делай.

Автор: Poseidon 5.6.2013, 08:19
Цитата(-Сергей- @ 5.6.2013,  04:05)
Я то рассуждаю логически как: если А не равно 10 или А не равно 15 то ...

Такая логика тоже странновата. Ведь если А равно 15, то оно явно не равно 10, но все-таки оно равно 15. Т.е. уславие выполняется. То же самое и с 10. Условие выполняется т.к. 10 явно не равно 15, а у нас там "или". Ну а про все остальные варианты и говорить не стоит, они все будут не равны 10 и 15 , поэтому все выполняется. Вникни в это. Тебе надо условие "если А не равно 10 и А не равно 15 то ..."

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)