Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Вниз

Оператор if then   Найти похожие ветки 

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

Привет!!!
У меня такая проблема с оператором 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-17 20:09) [1]

> [0] lewka-serdceed   (17.05.08 20:05)
> В чем я тут ошибся?

В логике. Ибо после того, как встретилась пустая, может встретиться и непустая.


 
Джо ©   (2008-05-17 20:11) [2]

Вероятно, предполагается такое поведения?
for i:=1 to StringGrid1.RowCount-1 do
begin
 if StringGrid1.Cells[i,1]="" then
 begin
   MessageDlg (...);
   Break
 end;
end;


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

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


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

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


 
Джо ©   (2008-05-17 20:13) [5]

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

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


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

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


 
palva ©   (2008-05-17 21:17) [7]


> 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
else if StringGrid1.Cells[i,1]="" then a:=1 ;
if StringGrid1.Cells[i,1]<>"" then a:=0 end;


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


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

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;


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

Спасибо


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


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

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


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

Аватору вопроса персонально и безотносительно к его конкретному коду (просто кошмар, да и только!) и его обсуждению,  просто на будущее. К великому сожалению, у "чайников" такое безобразие сплошь и рядом:
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


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

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

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


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

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


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


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

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


 
Amoeba ©   (2008-05-18 01:16) [15]


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

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


 
{RASkov} ©   (2008-05-18 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) [17]

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

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


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


> {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] например....:)
>

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


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


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


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


 
Anatoly Podgoretsky ©   (2008-05-18 11:47) [20]

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

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


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

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


 
Sha ©   (2008-05-18 12:09) [21]

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

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

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


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


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


Тем более-)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.05 c
2-1210576078
TUser
2008-05-12 11:07
2008.06.08
Почему это до сих пор работало?


2-1210768237
F@T@L_Err0r
2008-05-14 16:30
2008.06.08
Безусловное выключение компа


2-1210916354
Opera1
2008-05-16 09:39
2008.06.08
ValueListEditor1 добавление значений


15-1209135932
@!!ex
2008-04-25 19:05
2008.06.08
Принудительная перекомпиляция модуля.


15-1209508896
BlueDragon
2008-04-30 02:41
2008.06.08
GPRS&amp;Модем





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский