Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2009, 01:30   #1
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию Выдает ошибку следующий код:

Не пойму никак в чем дело, дельфи ругается и все тут. Вот код (служит для вывода минимального значения):
Код:
uses math
....

var
sl1: TStringList;
n: integer;
mymin: real;
begin
        sl1:=TStringList.Create;
//пихаем в sl данные (берутся из другого источника, но для понятия вбил вручную)
        sl1.Add('5');
        sl1.Add('3');
        sl1.Add('НО');
        sl1.Add('4');
        sl1.Add('НО');
        sl1.Add('12');

//пробегаемся по списку и удаляем все записи с НО, что бы остались только цифры
        for n:=0 to sl1.Count-1 do begin
          if sl1.Strings[n]='НО' then
            sl1.Delete(n);
        end;

//присваиваем в переменную mymin первое значение.

        mymin:=StrToFloat(sl1.Strings[0]);

// пробегаемся по списку вновь, только теперь начиная с 1. Тут у нас mymin проверяет саму себя и с помощью min остается минимальное значение.

        for n:=1 to sl1.Count-1 do
        mymin:=Min(mymin,StrToFloat(sl1.Strings[n]));

//Не знаю точно нужно или нет?! В каких случаях это надо писать?

        sl1.Free;

// смотрим что получилось

        label1.caption:=FloatToStr(mymin);
Все это загнал в событие онклик копки, жму на кнопку и вижу эту ошибку:

http://itrash.ru/idb/cfb0fcb8ffa5759...209/o23.07.png

Выручайте плиз.
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Старый 23.07.2009, 01:45   #2
HellMercenaries
Заблокирован
 
Регистрация: 21.07.2009
Сообщений: 17
По умолчанию

Обращаешься к елементу который уже стёр Delitom.
Замени For на While
HellMercenaries вне форума Ответить с цитированием
Старый 23.07.2009, 01:58   #3
Evgeniy26
Форумчанин
 
Аватар для Evgeniy26
 
Регистрация: 29.05.2009
Сообщений: 384
По умолчанию

Код:
while sl1.IndexOf('НО') > -1 do
  sl1.Delete(sl1.IndexOf('НО'));
Код:
while sl1.Find('НО', n) do
  sl1.Delete(n);
Evgeniy26 вне форума Ответить с цитированием
Старый 23.07.2009, 09:59   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Evgeniy26 +1
это более красиво и эффективно будет в данном случае!


хотя, в принципе, когда нужно удалить строки, можно пользоваться и циклом FOR
надо только ОБЯЗАТЕЛЬНО идти снизу вверх:
Код:
//пробегаемся по списку и удаляем все записи с НО, что бы остались только цифры
        for n:=sl1.Count-1 downto 0  do begin
          if sl1.Strings[n]='НО' then
            sl1.Delete(n);
        end;
p.s. обратите внимание, что данный код я привёл в качестве образца. в данном случае лучше использовать метод поиска и удаления через while, предложенный Evgeniy26!!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.07.2009, 10:04   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Господа, а можно я ваш код уложу в одну строчку?
Код:
sl1.Text:=StringReplace(sl1.Text,'НО'#13#10,'',[rfReplaceAll]);
P.S. Может тоже на плюcик нарвусь
I'm learning to live...

Последний раз редактировалось Stilet; 23.07.2009 в 12:47.
Stilet вне форума Ответить с цитированием
Старый 23.07.2009, 12:14   #6
Tirendus
Форумчанин
 
Аватар для Tirendus
 
Регистрация: 20.03.2009
Сообщений: 272
По умолчанию

Цитата:
//Не знаю точно нужно или нет?! В каких случаях это надо писать?

sl1.Free;
убирает выделение оперативной памяти на этот процесс, писать надо

From Stilet: Не процесс а обьект (экземпляр класса)

Последний раз редактировалось Stilet; 23.07.2009 в 12:47.
Tirendus вне форума Ответить с цитированием
Старый 23.07.2009, 13:31   #7
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Всем большое спасибо.
Сразу воспользовался методом:
Код:
sl1.Text:=StringReplace(sl1.Text,'НО'#13#10,'',[rfReplaceAll]);
Цитата:
P.S. Может тоже на плюcик нарвусь
Безусловно

Цитата:
убирает выделение оперативной памяти на этот процесс, писать надо
Я так понимаю Free надо писать везде где что-то создается методом Create?!
типа:
Код:
sl1:=TStringList.Create;
Правда не совсем могу понять зачем? Что значит убирает выделение оперативной памяти на этот процесс?
Я бы изменил мир, но Бог не дает исходники...

Последний раз редактировалось Polotenchik; 23.07.2009 в 13:40.
Polotenchik вне форума Ответить с цитированием
Старый 23.07.2009, 13:38   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

для всех обьектов созданных динамически(искл есть, но их мало)
после использования то есть тогда когда они уже не нужны нужно освобождать память(free)

искл: компоненты форм, которые уничтожаются вместе с ней(форма при своем уничтожении, уничтожает и все компоненты, родителем которых является сама) и тд
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.07.2009, 13:51   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Правда не совсем могу понять зачем?
А представь что ты заказал на вечеринку 200 банок пива (Пиво.Create). Вечеринка удалась и вы с башкой-от-пяток пошли в гости к Морфею приложившись ухом к подушке... На утро что мы видим? правильно - кучугур банок, предки поубивают, значит чоб не попасть под домашний арест в своей же комнате нужно мусор убрать (Пиво.Free)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.07.2009, 14:32   #10
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А представь что ты заказал на вечеринку 200 банок пива (Пиво.Create). Вечеринка удалась и вы с башкой-от-пяток пошли в гости к Морфею приложившись ухом к подушке... На утро что мы видим? правильно - кучугур банок, предки поубивают, значит чоб не попасть под домашний арест в своей же комнате нужно мусор убрать (Пиво.Free)
Реальнее! Все ясно, как божий день
Ток надо (Пиво.Update) =)
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перевести на делфи следующий код? SkAndrew Общие вопросы Delphi 7 15.05.2009 21:48
Макрос выдает ошибку Romuald Microsoft Office Excel 2 15.04.2009 22:42
ADOQuery - выдает ошибку kiber0net0 Общие вопросы Delphi 2 02.09.2008 19:49
Windows2003 ошибку выдает Cantana Windows 11 07.12.2007 06:04
MasterSource - выдает ошибку nataly_ukr БД в Delphi 10 12.10.2007 13:49