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

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

Операции в Tstringlist!!!!! [D7, Win95/98, WinME, NT4, Win2k, WinXP]


CRACKISH ©   (2005-01-25 19:06:00) 

Есть stringlist!!!! Туда занесены строки с таким форматом: '%s=%f'!!!! В массиве имена строк (%s) повтаряються!!!! Мне надо суммировать параметры (%f) в одинаковых именах (%s) строк!!!! И чтоб имена (%s) больше не повтарялись!!!!!! Как это осуществить??? Зарание благодарен!!


Palladin   (2005-01-26 23:31:00) [1]

а может повзраслел... на чуть чуть...


CRACKISH   (2005-01-26 15:26:00) [2]

Всем спасибо! Разобрался!


CRACKISH   (2005-01-26 00:16:00) [3]

он вернулся... восклицательный мальчик... год не было... не повзраслел ни на чуть чуть...- это уже называется флейм!!!!! А у вас все гостиприимностью и не пахнет!!!!!


Palladin   (2005-01-26 00:05:00) [4]

он вернулся... восклицательный мальчик... год не было... не повзраслел ни на чуть чуть...


CRACKISH   (2005-01-25 23:34:00) [5]

Огромное спасибо! Попробывал с downto!!! Сам цыкл работает без ошибок, но результата вообще нет! Может я чето не то пишу? Помогите пожалуйста!
Сам цыкл:
DataField.Sorted:=True;

for g:=DataField.Count-1 to 1 do
begin
   DataField.Sorted:=False;
   if DataField.Names[g]=DataField.Names[g-1] then
    begin
     DataField.ValueFromIndex[g-1]:=Format('%f', [StrToFloat(DataField.ValueFromIndex[g-1])+StrToFloat(DataField.ValueFromIndex[g])]);
     DataField.Delete(g);
   end;
end;


Anatoly Podgoretsky   (2005-01-25 22:05:00) [6]

Ты в курсе, что c 1971 года существует обратный цикл, называется downto/


begin...end   (2005-01-25 21:10:00) [7]

> [10] CRACKISH   (25.01.05 20:59)

Конечно же, вылетает.

Вы же внутри цикла удаляете элементы из списка DataField. В результате количество элементов списка (значение свойства DataField.Count) уменьшается. Но минимальное и максимальное значения счётчика цикла (0 и DataField.Count-1) вычисляются только один раз- перед первым проходом цикла.

Например, изначально в списке было 10 элементов. После, скажем, восьми проходов цикла удалились 2 элемента. Теперь количество элементов равно 10 - 2 = 8. Поэтому цикл надо бы заканчивать, а он продолжается, пока счётчик не станет больше 10 - 1 = 9. В результате Вы внутри цикла обращаетесь к несуществующим элементам списка.

Выход: использовать цикл for с downto вместо to, или цикл while.


CRACKISH   (2005-01-25 20:59:00) [8]

И все равно вылетает ошибка! :-(


CRACKISH   (2005-01-25 20:57:00) [9]

DataField.Sorted:=True;

for g:=0 to DataField.Count-1 do
begin
 if g<>0 then
  begin
   DataField.Sorted:=False;
   if DataField.Names[g]=DataField.Names[g-1] then
    begin
     DataField.ValueFromIndex[g-1]:=Format('%f', [StrToFloat(DataField.ValueFromIndex[g-1])+StrToFloat(DataField.ValueFromIndex[g])]);
     DataField.Delete(g);
   end;
 end;
end;


Вот как я сделал!


CRACKISH   (2005-01-25 20:57:00) [10]

Я уже так пробываЛ!!! При удалении поля, индексы у полей меняются! И под конец цыкла вылетает ошибка!!!!


Jel   (2005-01-25 19:56:00) [11]

Ставишь Sotred := True;
Перебираешь все элементы, проверяя не равно ли следующее имя предыдущему. Если равно суммируешь значения и удаляешь лишний элемент. И так до конца списка.


CRACKISH   (2005-01-25 19:49:00) [12]


> в цикле. см TStrings.Names, TStrings.Values + F1


НЕ я это знаю!я не могу додуматься до, так сказать, до сортировки! Чтоб Удаляла повторяющиеся Names, и при этом суммыровало Values!


Jel   (2005-01-25 19:40:00) [13]


> jack128 ©   (25.01.05 19:37) [4]

Медленно краснею, посыпая голову пеплом. :( Ты прав - есть.


jack128   (2005-01-25 19:37:00) [14]

Jel ©   (25.01.05 19:30) [2]
А если таки нажать F1?


Antonn   (2005-01-25 19:37:00) [15]

CRACKISH   (25.01.05 19:06)
У тебя знаки препинания западают!!! немного раздражает!!!


Jel   (2005-01-25 19:30:00) [16]


> см TStrings.Names, TStrings.Values

Этого нет в tStrings. Только в ValueListEditor.


jack128   (2005-01-25 19:16:00) [17]

в цикле. см TStrings.Names, TStrings.Values + F1


Наверх

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