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

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

Почему окно вылезает два и более раз? [D7, XP]


tort ©   (2006-04-01 11:19:00) 

День добрый! Мастера, скажите в чем ошибка?
Начинаю разбирать элементарную вещь - не доходит.
Диалоговое окно запускается столько раз, сколько букв в Edit...

var s, st: string;
   i: integer;
begin
 s:= Edit1.Text;
 for i:=0 to length(s) do
   if (s'') and (s='C')or(s='D')then
   st:=s+':\'else
   showmessage('Íåäîïóñòèìû& #233; ââîä');
 edit1.Text:=st;
end;


sniknik   (2006-04-02 01:53:00) [1]

в статье ошибка. именно for и не будет, в нем 1 раз расчитывается, вот в while /repeat пересчитывает на каждой итерации.

напиши проверку... или так поверь.


Asail   (2006-04-02 01:43:00) [2]


> Palladin ©   (02.04.06 00:03) [8]

> начинать нужно с 1

Верно.


> Zeqfreed ©   (02.04.06 00:12) [9]

> Не будет…


Будет. См. статью: http://www.delphimaster.ru/articles/optimization.html

Цитата:
Выносите инвариантный код за тело цикла. Наиболее частая ошибка – for i:=1 to length(str) do... Дело в том, что при каждой итерации будет вызываться функция length, что пагубно скажется на производительности.


Virgo_Style   (2006-04-02 00:13:00) [3]

Asail   (02.04.06 0:00) [7]

afaik, нет.


Zeqfreed   (2006-04-02 00:12:00) [4]


> Иначе одна и таже функция length будет зазря вызываться
> повтрно много раз, в зависимости от длины S

Не будет…


Palladin   (2006-04-02 00:03:00) [5]

начинать нужно с 1


Asail   (2006-04-02 00:00:00) [6]


> for i:=0 to length(s) do


Так писать, ИМХО, не есть хорошо!!!
Лучше:
k:=length(S);
for i:=0 to k do ...
Иначе одна и таже функция length будет зазря вызываться повтрно много раз, в зависимости от длины S (а функция эта тоже время занимает).
Ну, это так - замечание по-ходу...


Kolan   (2006-04-01 21:16:00) [7]

if (S='C') or (S='D') then
 DoAction
else
 ShowMessage('ВВодить можно только C или D');


EvS   (2006-04-01 20:31:00) [8]

>т.е. просто вынести?

Непонятно зачем вообще цикл нужен.


tort   (2006-04-01 17:23:00) [9]

т.е. просто вынести?


Virgo_Style   (2006-04-01 11:45:00) [10]

if (S='C') or (S='D'), то уж автоматом S<>'':-)

ну это так, мелочь. Гораздо интереснее, зачем это в цикле делается))


tort   (2006-04-01 11:42:00) [11]

Задача то какая?

Задача простая :)
Пользователь вводит символы (C или D). И если символы правильные, то выполняется "действие". Если символы не правильные, то показываем сообщение, что неправильно.


Vasiliy   (2006-04-01 11:30:00) [12]

Может быть лучше так:

var s, st: string;
  i: integer;
begin
s:= Edit1.Text;
for i:=0 to length(s) do
  if (s[i]'') and ((s[i]='C') or (s[i]='D')) then st:=s+':\'
                                                      else showmessage('Íåäîïóñòèìû&  #233; ââîä');
edit1.Text:=st;
end;

Задача то какая?


Наверх

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