Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите правильно составить условие 
:(
    Опции темы
-Сергей-
Дата 4.6.2013, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



Имеется 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('Истина');
...


--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
bars80080
Дата 4.6.2013, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



Цитата(-Сергей- @  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 всегда будет неравно какому-то одному из этих значений
PM MAIL WWW   Вверх
-Сергей-
Дата 4.6.2013, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



Поправил.
Код

...
    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 всегда будет неравно какому-то одному из этих значений

Но почему? Не догоняю...
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
Poseidon
Дата 4.6.2013, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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

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

Это сообщение отредактировал(а) Poseidon - 4.6.2013, 14:22


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
-Сергей-
Дата 5.6.2013, 04:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



Спасибо, все разжевал. Теперь все стало понятно. 
Виновато человеческое рассуждение (или это или то)
Я то рассуждаю логически как: если А не равно 10 или А не равно 15 то ...
Выходит немного неправильно.
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
Beltar
Дата 5.6.2013, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



Через else if делай.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Poseidon
Дата 5.6.2013, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.