![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему окно вылезает два и более раз? [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;
Задача то какая?