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