С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58

Условия не работают как хотелось бы

01.10.2019, 09:02. Показов 2119. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Пожалуйста помогите нормализовать выполнение условий, проблема в том, что если при создании формы:
edit1.Text=Чтение значения из файла
и
Button2.Caption:='ENG'
то при выполнении процедуры, срабатывают два первых условия, хотя казалось бы Если у них разные по логике.
Подскажите, где моя ошибка.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.Button2Click(Sender: TObject);
begin
IniF := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'config.ini');
  with IniF do begin
    if ((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) or (Button2.Caption='ENG')) then begin
     WriteString('Языковые настройки', 'Язык приложения', 'ENG');
     Button1.Caption:='Save...';
     Button2.Caption:='РУС';
     showmessage('1'); end;
       if ((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) or (Button2.Caption='РУС')) then begin
        WriteString('Языковые настройки', 'Язык приложения', 'RUS');
        Button1.Caption:='Сохранить...';
        Button2.Caption:='ENG';
             showmessage('2'); end;
          if Edit1.Text='Укажите' then begin
           WriteString('Языковые настройки', 'Язык приложения', 'ENG');
           Button1.Caption:='Save...';
           Button2.Caption:='РУС';
           Edit1.Text:='Specify';
                showmessage('3');  end;
             if Edit1.Text='Specify' then begin
              WriteString('Языковые настройки', 'Язык приложения', 'RUS');
              Button1.Caption:='Сохранить...';
              Button2.Caption:='ENG';
              Edit1.Text:='Укажите';
                   showmessage('4'); end;
  {      end;
      end;
    end;
  end;}
end;
IniF.Free;
 
end;

Благодарю.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.10.2019, 09:02
Ответы с готовыми решениями:

Как работают условия в среде Dev-C++?
Я умоляю, подскажите, как работают условия - if - в среде DEV-C++. Не дублируйте вопросы в разных темах.

Не работают условия
Здравствуйте!Почему то не работают условия И в javascript Если задаю их то ничего не выдает вообще.Хотя переменные принимают значение то...

Не работают условия
Пишу игру на дельфи. Сейчас делаю инвентарь, и вот делают условия - (на клике) если вещь1 = шлем тада напялить ее на "слот...

29
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 09:11
Айстин, там стоит операция or:
Delphi
1
((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) or (Button2.Caption='ENG'))
То есть, условие в IF выполняется, если хотя бы одно из условий выполняется.

Надо поменять на 'and'
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 09:20  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
То есть, условие в IF выполняется, если хотя бы одно из условий выполняется.
Надо поменять на 'and'
Заменил на and, таже самая ситуация
P.S мне казалось что 'and', наоборот является или. Так как в одном из условий у меня есть 'and', и выполняется одно из условий, а вот если поставить or, то условие выполнится только если оба условия положительные
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 09:31
Айстин, таблица истинности:
false and false = false
false and true = false
true and false = false
true and true = true

false or false = false
false or true = true
true or false = true
true or true = true

Результат or истина, если хотя бы один из операндов либо оба истина. Результат and истина, если оба операнда истинны.

Добавлено через 8 минут
Айстин, всё правильно. В первом if при выполнении условия меняется название кнопки и сохраняется параметр, следующее условие проверяет уже изменённые параметры. Нужно после end первого условия поставить else без двоеточия. Тогда, в принципе, и эти условия ещё раз проверять не нужно будет.
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 09:34  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Айстин, таблица истинности:
false and false = false
false and true = false
true and false = false
true and true = true
false or false = false
false or true = true
true or false = true
true or true = true
Результат or истина, если хотя бы один из операндов либо оба истина. Результат and истина, если оба операнда истинны.
Это понятно, но как бы это абсурдно не звучало, у меня наоборот, кстати на этом форуме я встречал уже же тему с путаницей по поводу условий, и там у ТС тоже всё было наоборот вот сейчас я у обоих условий поставил 'and' , и всё равно выполняются оба. Видите там после появления
Delphi
1
showmessage('1');
нажимаем ок, потом появляется
Delphi
1
showmessage('2');
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 09:38
Айстин, сделал вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
    if ((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) and (Button2.Caption='ENG')) then begin
      WriteString('Языковые настройки', 'Язык приложения', 'ENG');
      Button1.Caption:='Save...';
      Button2.Caption:='РУС';
      showmessage('1');
    end else begin
      WriteString('Языковые настройки', 'Язык приложения', 'RUS');
      Button1.Caption:='Сохранить...';
      Button2.Caption:='ENG';
      showmessage('2');
    end;
и параметры меняются нормально.

Добавлено через 1 минуту
Зачем нужна эта проверка?
Delphi
1
(edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,381
01.10.2019, 09:43
Цитата Сообщение от AzAtom Посмотреть сообщение
Зачем нужна эта проверка?
Delphi
1
(edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)
не знаю, зачем она в коде TC, но вообще этот код позволит проверить наличие параметра, отличного от Edit1 в инифайле.
хотя, на мой взгляд, лучше
Delphi
1
2
s := ReadString('Раздел', 'Название параметра', '');
if s='' then // тут делаем что надо, если параметра в ини нет и нужно брать по умолчанию. например, s := Edit1.Text;
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 09:48
Это понятно, что позволяет проверить. А у него получается, что если значение параметра совпадает, то с OR будут выполнены оба условия, а если значение отличается, то с AND условия не будут выполнены. Не совсем понятно зачем ему это, потому и спрашиваю.
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 10:13  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Зачем нужна эта проверка?
Потому что:
edit1.Text может принять одно из трёх значений:
1. ReadString('Раздел', 'Название параметра', edit1.Text //принимает его при создании формы, если в .ini есть соответствующие записи
2. 'Укажите' //принимает его при нажатии кнопки, если в .ini нет соответствующих записей и язык приложения установлен на РУС
3. 'Specify' //принимает его при нажатии кнопки, если в .ini нет соответствующих записей и язык приложения установлен на ENG

1../2.. Соответственно при нажатии на языковую кнопку, если значение читается из файла, то меняется только caption кнопок и записывается значение языка в .ini
3../4.. При нажатии на языковую кнопку, если значений в файле нет, и значение Edit1.Text равно 'Specify', или равно 'Укажите', то меняется caption кнопок, значение edit1.Text, и записывается значение языка в .ini
P.P.S. - в свою очередь начальное значение edit1.Text определяется при создании формы.

Сейчас у меня вот что получилось (ужас, выполняется 1 условие, 3 и 4):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    if ((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) and (Button2.Caption='ENG')) then begin
     WriteString('Языковые настройки', 'Язык приложения', 'ENG');
     Button1.Caption:='Save...';
     Button2.Caption:='РУС';
     showmessage('1');
         end else begin
      WriteString('Языковые настройки', 'Язык приложения', 'RUS');
      Button1.Caption:='Сохранить...';
      Button2.Caption:='ENG';
      showmessage('2');
    end;
          if Edit1.Text='Укажите' then begin
           WriteString('Языковые настройки', 'Язык приложения', 'ENG');
           Button1.Caption:='Save...';
           Button2.Caption:='РУС';
           Edit1.Text:='Specify';
                showmessage('3');  end;
             if Edit1.Text='Specify' then begin
              WriteString('Языковые настройки', 'Язык приложения', 'RUS');
              Button1.Caption:='Сохранить...';
              Button2.Caption:='ENG';
              Edit1.Text:='Укажите';
                   showmessage('4'); end;
В итоге ((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) and (Button2.Caption='ENG')) определяется как или, ибо почему тогда оно выполняется.

Добавлено через 4 минуты
Цитата Сообщение от Айстин Посмотреть сообщение
В итоге ((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) and (Button2.Caption='ENG')) определяется как или, ибо почему тогда оно выполняется.
P.S - Я удалил из .ini значение, поэтому должно выполняться 3
Delphi
1
 if Edit1.Text='Укажите' then begin
или 4
Delphi
1
if Edit1.Text='Specify' then begin
условие, но выполняется всё равно 1, 3 и 4
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 10:21
Айстин, навскидку, в последнем сообщении в строках 16 и 18 такая же ошибка - текст в edit устанавливается в Specify и потом следующее условие срабатывает, хотя этого не нужно.

Добавлено через 1 минуту
Решение: В 17 строке после end написать else без двоеточия.

Добавлено через 2 минуты
Айстин,
1. ReadString('Раздел', 'Название параметра', edit1.Text //принимает его при создании формы, если в .ini есть соответствующие записи
Тут не понятно. Если нет параметра, то значение в Edit просто не изменится. Оно изначально пустое?

Добавлено через 2 минуты
Вообще, Edit обычно используют для ввода. Пользователь там что-то сам должен писать? Если нет, то лучше использовать Label.
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 10:48  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Айстин, навскидку, в последнем сообщении в строках 16 и 18 такая же ошибка - текст в edit устанавливается в Specify и потом следующее условие срабатывает, хотя этого не нужно.
Так это же кнопка смены языка, соответственно, если Edit1.Text='Укажите', то выполняется 16 строка, а также, если Edit1.Text='Specify', то выполняется 22 строка

Цитата Сообщение от AzAtom Посмотреть сообщение
Решение: В 17 строке после end написать else без двоеточия.
Поставил, теперь выполняется 1 условие, при повторном нажатии выполняется 2 условие

Цитата Сообщение от AzAtom Посмотреть сообщение
Тут не понятно. Если нет параметра, то значение в Edit просто не изменится. Оно изначально пустое?
Оно изначально принимает значение 'Укажите', значение просто установлено в свойстве caption, т.е. при создании формы, значение Edit1 проверяется в .ini, если в .ini есть значение, то Edit1 принимает его. Если значения нет, то опять же проверяем .ini, если там есть значение языковых настроек, то берём его от туда, если нет языковых настроек (например при открытии приложения первый раз), то значение устанавливается 'Укажите', то самое которое было установлено в свойствах Edit1

Цитата Сообщение от AzAtom Посмотреть сообщение
Вообще, Edit обычно используют для ввода. Пользователь там что-то сам должен писать? Если нет, то лучше использовать Label.
Пользователь что сам должен писать, например первый раз он открыл форму и вписал туда настройку, сохранил, закрыл. Далее какое то время спустя, пользователь опять запустил приложение, Edit1 ему показывает какое значение в данный момент имеет настройка

Добавлено через 6 минут
Цитата Сообщение от mr-Crocodile Посмотреть сообщение
не знаю, зачем она в коде TC, но вообще этот код позволит проверить наличие параметра, отличного от Edit1 в инифайле.
хотя, на мой взгляд, лучше
Мне же нужно проверять несколько значений, значение свойста Edit1.Text и значение свойства Button1.Caption, и только при положительной проверке обоих значений, условие должно выполняться. Получается я опять должен буду использовать and (и), и and (и) в свою очередь опять будет интерпретироваться в or (или)
0
453 / 177 / 31
Регистрация: 04.08.2018
Сообщений: 709
01.10.2019, 12:04
Цитата Сообщение от Айстин Посмотреть сообщение
edit1.Text может принять одно из трёх значений:
1. ReadString('Раздел', 'Название параметра', edit1.Text //принимает его при создании формы, если в .ini есть соответствующие записи
2. 'Укажите' //принимает его при нажатии кнопки, если в .ini нет соответствующих записей и язык приложения установлен на РУС
3. 'Specify' //принимает его при нажатии кнопки, если в .ini нет соответствующих записей и язык приложения установлен на ENG
Пользователь по вашей задумке что-то может вводить в edit1? Или значение edit1.Text формируется только из кода?
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 12:14  [ТС]
Цитата Сообщение от Rayvenor Посмотреть сообщение
Пользователь по вашей задумке что-то может вводить в edit1? Или значение edit1.Text формируется только из кода?
Пользователь что то сам должен писать, например первый раз он открыл форму и вписал туда настройку, сохранил, закрыл. Далее какое то время спустя, пользователь опять запустил приложение, Edit1 ему показывает какое значение в данный момент имеет настройка.
По умолчанию, значение Edit1 равно 'Укажите', или 'Specify'. Т.е. как бы указывает пользователю что настроек нет, укажите их введя в Edit1.
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 12:24
Айстин, что он вписывает туда? Название "профиля", что ли? Вот я запускаю программу и просто выбираю язык, не понимаю, зачем мне туда ещё что-то вписывать?
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 12:31  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Айстин, что он вписывает туда? Название "профиля", что ли? Вот я запускаю программу и просто выбираю язык, не понимаю, зачем мне туда ещё что-то вписывать?
Туда необходимо вписать значение параметра, к примеру есть один параметр, данный параметр использует значение которое ввёл пользователь, т.е. если пользователь ничего не ввёл, то в поле будет явно указываться что 'Укажите'.
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 12:32
Цитата Сообщение от Айстин
edit1.Text может принять одно из трёх значений:
Если только 3 значения, то там не нужен Edit. Лучше Radobutton поставить, и чтобы изначально они оба были не активны и если есть настройка в файле, то активируется соответствующая кнопка.
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 12:37  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Если только 3 значения, то там не нужен Edit. Лучше Radobutton поставить, и чтобы изначально они оба были не активны и если есть настройка в файле, то активируется соответствующая кнопка.
В том то и дело, что настройка может принимать разное значение, соответственно его нужно вводить в поле. Так значений может быть много, Вы ввели 234, кто то другой ввёл 9734, а я введу 9... понимаете?
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 12:38
Цитата Сообщение от Айстин
если пользователь ничего не ввёл, то в поле будет явно указываться что 'Укажите'.
Но тогда если пользователь введёт что-то отличное от "Укажите" или "Specify", то третье и четвёртое условия не будут выполняться. Да и зачем нужны эти действия, если они же выполняются выше?

В общем, мы разобрались, почему выполняются оба условия и как это побороть. Будут ещё вопросы - задавайте.
0
2 / 2 / 1
Регистрация: 11.11.2016
Сообщений: 58
01.10.2019, 13:01  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
если они же выполняются выше?
Где? при создании формы? Хорошо, следующая ситуация, пользователь не использует данную настройку, и он не вводит что-то отличное от "Укажите", или "Specify"? Но зато он хочет изменить язык, и что тогда?

Цитата Сообщение от AzAtom Посмотреть сообщение
В общем, мы разобрались, почему выполняются оба условия и как это побороть. Будут ещё вопросы - задавайте.
Есть 4 условия, логика у них разная, соответственно они не должны выполняться все сразу, сейчас то что вы предложили, это выкинуть два из четырёх условий.
Не согласен, решения так и не было найдено, да и в любом случае остаётся непонятным почему, почему не работает and , собственно из за этого все проблемы.
0
Модератор
4115 / 2347 / 807
Регистрация: 15.11.2015
Сообщений: 9,352
01.10.2019, 13:14
Цитата Сообщение от Айстин
почему не работает and
Работает!

решения так и не было найдено,
А это что?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
    if ((edit1.Text = ReadString('Раздел', 'Название параметра', edit1.Text)) and (Button2.Caption='ENG')) then begin
      WriteString('Языковые настройки', 'Язык приложения', 'ENG');
      Button1.Caption:='Save...';
      Button2.Caption:='РУС';
      showmessage('1'); 
    end else // здесь добавлен else!
    if ((edit1.Text=ReadString('Раздел', 'Название параметра', edit1.Text)) and (Button2.Caption='РУС')) then begin // Здесь заменён на and
      WriteString('Языковые настройки', 'Язык приложения', 'RUS');
      Button1.Caption:='Сохранить...';
      Button2.Caption:='ENG';
      showmessage('2');
    end;
Добавлено через 1 минуту
А само условие с and не сработает, если в файле найден параметр со значением, не равным значению в Edit.

Добавлено через 2 минуты
Лично я так и не понял логики смены языка. Стоит РУС, я нажимаю кнопку и если в Edit записано что-то отличное от значения в настройках, то язык не меняется, так что ли?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2019, 13:14
Помогаю со студенческими работами здесь

Условия не работают
почему условия if (((x-x1)||(x1-x))<10) или if (((x-x1)<10)||((x1-x)<10)) неработают ? Как быть?

Почему не работают условия?
Господа, вопрос простой, но я не вижу на него ответа У меня часто не работает условия. задаю, например if () { } else { } ...

Не работают условия Combobox1
Ничего сложного, но уже пол часа не пойму что к чему... procedure TForm1.Button1Click(Sender: TObject); begin if...

Python 3. Не работают условия
Здравствуйте! Начал изучать python и столкнулся с проблемой - не работает конструкция if/elif/else написал вот такой код (код в аттаче)...

некорректно работают условия
#include "stdafx.h" #include "stdio.h" #include "locale" #include "stdlib.h" int main() { int q; float a, b, r; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru