Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оператор if then [D7, XP]


Страницы:   1 2

lewka-serdceed ©   (2008-05-17 20:05:00) 

Привет!!!
У меня такая проблема с оператором if вот листинг:
for i:=1 to StringGrid1.RowCount do begin
if StringGrid1.Cells[i,1]='' then a:=1 ;
if StringGrid1.Cells[i,1]<>'' then a:=0 end;
if a=1 then begin MessageDlg('Ошибка',mtError, mbOKCancel, 0);end;

при выполнении этого кода всегда не зависимо заполнена ячейка или нет появляется это сообщение. В чем я тут ошибся?


Умище   (2008-05-18 12:23:00) [1]


> бывает, что ни if ни else не нужны, а достаточно


Тем более-)


Sha   (2008-05-18 12:09:00) [2]

> Умище   (18.05.08 11:33) [19]

бывает, что ни ifни elseне нужны, а достаточно

a:=(StringGrid1.Cells[i,1]='');


Anatoly Podgoretsky   (2008-05-18 11:47:00) [3]

> Умище  (18.05.2008 11:33:19)  [19]

Так не надо бесконечных else надо множество, хорошо множестов хорошо струтированых else if


if ... then ...
else if ... then ...
...
else if ... then ...
else ...

Это если case of использовать нельзя, что и является его эквивалентом.


Умище   (2008-05-18 11:33:00) [4]


> Amoeba ©   (18.05.08 01:16) [15]
> > {RASkov} ©   (18.05.08 00:46) [12]Это я прекрасно знаю
> и понимаю что пишу заведомый offtop. Поясняю, что реплика
> моя была абсолютно вне контекста данного вопроса, но наболело.
>  Просто достало, когда вываливают штабель if ... then без
> else между ними (к данному коду напрямую это не отностися,
>  но нечто аналогичное в нем присутствует).


Хотя подобный подход (if .. then ..; if .. then ..;) и увеличивает длительность выполнения кода, зато повышает читабельность и прозрачность программы.
В отличие от бесконечных else.


Германн   (2008-05-18 02:07:00) [5]


> {RASkov} ©   (18.05.08 01:38) [16]
>
> > [14] Германн ©   (18.05.08 00:59)
> > Вот тут ты скорее всего неправ. Читай [6].
>
> begin
> for i:=1 to StringGrid1.RowCount-1 do
> begin
>  if StringGrid1.Cells[i,1]='' then // если есть пустая ячейка
>  begin
>    MessageDlg (...);  //  Нужно выдать сообщение,
>    Exit;             //  И ни чего дальше не делать,
>  end;
> end;
> .... // а если все ячейки заполнены, то выполнять следующие
> действия
> end;
> ?
> В принципе в [8] почти тоже самое же....
> Зы: Не обращаем внимания на нестыковки в коде автора...
> указанные в [10] например....:)
>

Теперь ты скорее всего прав.


{RASkov}   (2008-05-18 01:42:00) [6]

> [15] Amoeba ©   (18.05.08 01:16)
> > {RASkov} ©   (18.05.08 00:46) [12]
> Это я прекрасно знаю и понимаю что....

:)
А это[12] вообщето было автору вопроса адресовано ;)


{RASkov}   (2008-05-18 01:38:00) [7]

> [14] Германн ©   (18.05.08 00:59)
> Вот тут ты скорее всего неправ. Читай [6].

begin
for i:=1 to StringGrid1.RowCount-1 do
begin
 if StringGrid1.Cells[i,1]='' then // если есть пустая ячейка
 begin
   MessageDlg (...);  //  Нужно выдать сообщение,
   Exit;             //  И ни чего дальше не делать,
 end;
end;
.... // а если все ячейки заполнены, то выполнять следующие действия
end;

?
В принципе в [8] почти тоже самое же....
Зы: Не обращаем внимания на нестыковки в коде автора... указанные в [10] например....:)


Amoeba   (2008-05-18 01:16:00) [8]


> {RASkov} ©   (18.05.08 00:46) [12]

Это я прекрасно знаю и понимаю что пишу заведомый offtop. Поясняю, что реплика моя была абсолютно вне контекста данного вопроса, но наболело. Просто достало, когда вываливают штабель if ... then без else между ними (к данному коду напрямую это не отностися, но нечто аналогичное в нем присутствует).


Германн   (2008-05-18 00:59:00) [9]


> {RASkov} ©   (18.05.08 00:51) [13]
>
> и переменная "а" тоже скорее не нужна вовсе.... в [2] вместо
> Break; - нужно Exit;
>

Вот тут ты скорее всего неправ. Читай [6].


{RASkov}   (2008-05-18 00:51:00) [10]

и переменная "а" тоже скорее не нужна вовсе.... в [2] вместо Break; - нужно Exit;


{RASkov}   (2008-05-18 00:46:00) [11]

> Если первое условие (if) выполнено, то нефиг раз за разом
> проверять альтернативные варианты. Соответственно используем
> конструкцию с else.
> if StringGrid1.Cells[i,1]='' then a:=1 else
> if StringGrid1.Cells[i,1]<>'' thena:=0

подчеркнутое не нужно...
это раз, и второе - см. [1], [2] и [10].... Это я автору вопроса если что :)


Amoeba   (2008-05-18 00:32:00) [12]

Аватору вопроса персонально и безотносительно к его конкретному коду (просто кошмар, да и только!) и его обсуждению,  просто на будущее. К великому сожалению, у "чайников" такое безобразие сплошь и рядом:
if StringGrid1.Cells[i,1]='' then a:=1 ;
if StringGrid1.Cells[i,1]<>'' then a:=0;

Если первое условие (if) выполнено, то нефиг раз за разом проверять альтернативные варианты. Соответственно используем конструкцию с else.
if StringGrid1.Cells[i,1]='' then a:=1 else
if StringGrid1.Cells[i,1]<>'' then a:=0


Германн   (2008-05-17 21:44:00) [13]


> lewka-serdceed   (17.05.08 21:22) [9]

А вообще то изначально в сабже чушь. Счётчик цикла работает по количеству строк, а в самом цикле перебираются столбцы Cells[i,1]


lewka-serdceed   (2008-05-17 21:22:00) [14]

Спасибо


Германн   (2008-05-17 21:20:00) [15]

a:=0;
for i:=1 to StringGrid1.RowCount-1 do
begin
if StringGrid1.Cells[i,1]='' then
begin
  a:=1;
  Break
end;
end;
if a = 1 then MessageDlg('Ошибка',mtError, mbOKCancel, 0)
else begin
 ... //выполнять следующие действия
end;


palva   (2008-05-17 21:17:00) [16]


> for i:=1 to StringGrid1.RowCount do begin
> if StringGrid1.Cells[i,1]='' then a:=1 ;
> if StringGrid1.Cells[i,1]<>'' then a:=0 end;

Скорее всего здесь пропущено else

for i:=1 to StringGrid1.RowCount do begin
elseif StringGrid1.Cells[i,1]='' then a:=1 ;
if StringGrid1.Cells[i,1]<>'' then a:=0 end;


Но все равно код будет излишне сложным. Наверно, вам подойдет код из [2]


lewka-serdceed   (2008-05-17 20:53:00) [17]

Нужно выдать сообщение, если есть пустая ячейка. И ни чего дальше не делать, а если все ячейки заполнены, то выполнять следующие действия


Джо   (2008-05-17 20:13:00) [18]

> [4] lewka-serdceed   (17.05.08 20:13)
> А как тогда мне переписать код? подскажите

Опиши простыми словами, что нужно.


lewka-serdceed   (2008-05-17 20:13:00) [19]

А как тогда мне переписать код? подскажите


Джо   (2008-05-17 20:12:00) [20]

Тьфу, совсем я запутался с таким оформлением и цель замысла осталась для меня осталась темной.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо