Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизОперации в Tstringlist!!!!! Найти похожие ветки
← →
CRACKISH (2005-01-25 19:06) [0]Есть stringlist!!!! Туда занесены строки с таким форматом: "%s=%f"!!!! В массиве имена строк (%s) повтаряються!!!! Мне надо суммировать параметры (%f) в одинаковых именах (%s) строк!!!! И чтоб имена (%s) больше не повтарялись!!!!!! Как это осуществить??? Зарание благодарен!!
← →
jack128 © (2005-01-25 19:16) [1]в цикле. см TStrings.Names, TStrings.Values + F1
← →
Jel © (2005-01-25 19:30) [2]
> см TStrings.Names, TStrings.Values
Этого нет в tStrings. Только в ValueListEditor.
← →
Antonn © (2005-01-25 19:37) [3]CRACKISH (25.01.05 19:06)
У тебя знаки препинания западают!!! немного раздражает!!!
← →
jack128 © (2005-01-25 19:37) [4]Jel © (25.01.05 19:30) [2]
А если таки нажать F1?
← →
Jel © (2005-01-25 19:40) [5]
> jack128 © (25.01.05 19:37) [4]
Медленно краснею, посыпая голову пеплом. :( Ты прав - есть.
← →
CRACKISH (2005-01-25 19:49) [6]
> в цикле. см TStrings.Names, TStrings.Values + F1
НЕ я это знаю!я не могу додуматься до, так сказать, до сортировки! Чтоб Удаляла повторяющиеся Names, и при этом суммыровало Values!
← →
Jel © (2005-01-25 19:56) [7]Ставишь Sotred := True;
Перебираешь все элементы, проверяя не равно ли следующее имя предыдущему. Если равно суммируешь значения и удаляешь лишний элемент. И так до конца списка.
← →
CRACKISH (2005-01-25 20:57) [8]Я уже так пробываЛ!!! При удалении поля, индексы у полей меняются! И под конец цыкла вылетает ошибка!!!!
← →
CRACKISH (2005-01-25 20:57) [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:59) [10]И все равно вылетает ошибка! :-(
← →
begin...end © (2005-01-25 21:10) [11]> [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.
← →
Anatoly Podgoretsky © (2005-01-25 22:05) [12]Ты в курсе, что c 1971 года существует обратный цикл, называется downto/
← →
CRACKISH (2005-01-25 23:34) [13]Огромное спасибо! Попробывал с 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;
← →
Palladin © (2005-01-26 00:05) [14]он вернулся... восклицательный мальчик... год не было... не повзраслел ни на чуть чуть...
← →
CRACKISH (2005-01-26 00:16) [15]
он вернулся... восклицательный мальчик... год не было... не повзраслел ни на чуть чуть...
- это уже называется флейм!!!!! А у вас все гостиприимностью и не пахнет!!!!!
← →
CRACKISH (2005-01-26 15:26) [16]Всем спасибо! Разобрался!
← →
Palladin © (2005-01-26 23:31) [17]а может повзраслел... на чуть чуть...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c