Вверх ↑
Этот топик читают: Гость
Ответов: 485
Рейтинг: 86
#1: 2009-09-14 19:22:20 ЛС | профиль | цитата
Точка doInsert не срабатывает при изначально пустом списке строк. Аналогичная точка в таблице StringTableMT, например, позволяет вставить данные независимо от того пустая она или нет.
code_14940.txt
Точка doInsert понадобилась для обратной сортировки упорядоченнного списка строк, т.к. при использовании другого способа быстродействие на порядок ниже
code_14941.txt
карма: 0

0
файлы: 2code_14940.txt [1.7KB] [104], code_14941.txt [2.8KB] [92]
Разработчик
Ответов: 26163
Рейтинг: 2127
#2: 2009-09-14 21:12:55 ЛС | профиль | цитата
Тут проблема вот в этой защите


   if (ind < 0) or (ind > FList.Count - 1) then exit;

Но вполне было достаточно и вот такой


   if (ind < 0) then exit;
------------ Дoбавленo в 21.20:
filyaxxxcom писал(а):
Точка doInsert понадобилась для обратной сортировки упорядоченнного списка строк

А вот так сделать нельзя было Быстродействие еще выше, чем с doInsert



Add(MainForm,35645,263,89)
{
Width=323
Height=364
Position=1
link(onCreate,16542094:doFor,[])
}
Add(ListBox,9870300,728,169)
{
Left=10
Top=10
Width=140
Height=210
}
Add(ListBox,9135548,728,266)
{
Left=165
Top=10
Width=135
Height=210
}
Add(Button,16161122,97,266)
{
Left=10
Top=245
Width=240
Caption="Обратная сортировка используя doGetString"
link(onClick,15885844:doEvent1,[])
}
Add(StrList,3278894,430,420)
{
@Hint=#45:тут добавлена ненужная строка для возможности|29:использования точки doInsert |
Strings=#16:ненужная сторока|
Point(doInsert)
link(Str,12773655:Item,[(436,408)(315,408)(315,506)(335,506)])
AddHint(16,-54,198,39,@Hint)
}
Add(Button,11894171,98,455)
{
Left=10
Top=290
Width=240
Caption="Обратная сортировка используя doInsert"
link(onClick,294177:doEvent1,[])
}
Add(ArrayEnum,12773655,329,462)
{
link(onItem,394757:doData,[])
link(onEndEnum,9894289:doData,[(369,475)(369,503)])
link(Array,6166207:Var2,[])
}
Add(DoData,9894289,430,497)
{
link(onEventData,1044661:doEvent1,[])
link(Data,3278894:Text,[])
}
Add(DoData,394757,378,462)
{
Data=Integer(0)
link(onEventData,3278894:doInsert,[])
}
Add(StrList,13022606,371,103)
{
Point(doGetString)
Point(onGetString)
}
Add(For,16542094,308,103)
{
End=10000
link(onEvent,13022606:doAdd,[])
link(onStop,2596150:doData,[(350,116)(350,196)])
}
Add(DoData,2596150,371,190)
{
link(onEventData,9870300:doText,[])
link(Data,13022606:Text,[])
}
Add(DoData,1599264,516,280)
{
link(onEventData,9029228:doEvent1,[])
link(Data,9980251:Text,[])
}
Add(StrList,9980251,516,110)
{
}
Add(HubEx,6013925,679,287)
{
link(onEvent,9135548:doText,[])
}
Add(TimeCounter,1863297,181,224)
{
link(onStop,6303535:doText,[])
}
Add(Label,6303535,230,231)
{
Left=265
Top=250
}
Add(Label,12699063,226,427)
{
Left=264
Top=290
}
Add(Hub,15885844,139,266)
{
link(onEvent1,1863297:doStart,[(162,272)(162,230)])
link(onEvent2,16518440:doEnum,[])
}
Add(Hub,9029228,566,280)
{
link(onEvent1,1863297:doStop,[(593,286)(593,317)(171,317)(171,237)])
link(onEvent2,6013925:doWork2,[])
}
Add(Hub,1044661,476,497)
{
link(onEvent1,8648412:doStop,[(506,503)(506,539)(170,539)(170,433)])
link(onEvent2,6013925:doWork3,[(683,510)])
}
Add(Hub,294177,140,455)
{
link(onEvent1,8648412:doStart,[(162,461)(162,426)])
link(onEvent2,12773655:doEnum,[])
}
Add(TimeCounter,8648412,182,420)
{
link(onStop,12699063:doText,[])
}
Add(ArrayEnum,16518440,392,273)
{
Type=1
link(onItem,9980251:doAdd,[(470,279)(470,116)])
link(onEndEnum,1599264:doData,[])
link(Array,6166207:Var3,[(398,229)])
}
Add(GetDataEx,6166207,329,224)
{
link(Data,13022606:Array,[(335,172)(391,172)])
}

карма: 22

1
Голосовали:filyaxxxcom
Ответов: 485
Рейтинг: 86
#3: 2009-09-14 22:09:18 ЛС | профиль | цитата
nesco писал(а):
Но вполне было достаточно и вот такой
Недостаточно. При такой правке StrList дает Runtime Error в code_14940.txt при индексе больше 0. И попутно выяснилось, что таблица тоже вываливается в Runtime Error, если индекс больше количества строк.
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#4: 2009-09-14 22:16:14 ЛС | профиль | цитата
filyaxxxcom писал(а):
Недостаточно

Да, действительно, наблюдается фигня с вылетанием при индексах отличных от нуля
------------ Дoбавленo в 22.41:
Короче, надо делать так, тогда будет добавляться нормально


   if (ind < 0) or (ind > FList.Count) then exit;

Insert при ind=FList.Count эквиваленто Add
карма: 22

0
Ответов: 485
Рейтинг: 86
#5: 2009-09-14 23:09:17 ЛС | профиль | цитата
или так?
if (ind <> 0) and ((ind < 0) or (ind > FList.Count - 1)) then exit;

тогда при ind=FList.Count не будет добавлять
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#6: 2009-09-14 23:14:02 ЛС | профиль | цитата
filyaxxxcom писал(а):
ind=FList.Count

Ну я же написал, что это эквивалетно Add. Ты проверил условие, которое я привел, чем оно не устраивает, или выдает ошибку
карма: 22

0
Ответов: 485
Рейтинг: 86
#7: 2009-09-14 23:49:40 ЛС | профиль | цитата
nesco писал(а):
Ты проверил условие, которое я привел, чем оно не устраивает, или выдает ошибку
Ошибок не выдает. Но. Логика работы точки doInsert это "вставить строку перед строкой с индексом из потока". Другими словами, "сдвинуть строки, индекс которых больше или равен индексу из потока, вниз и на освободившееся место вставить новую строку" При несуществующем индексе строка ИМХО вставляться не должна (как и сделано в оригинальном коде).
Такая (или подобная) правка
if (ind <> 0) and ((ind < 0) or (ind > FList.Count - 1)) then exit;
делает исключение только для пустого списка при индексе = 0.
А такая
if (ind < 0) or (ind > FList.Count) then exit;
и для пустого списка, и для заполненого.
А это может повлечь проблемы совместимости и(или) будет вызывать вопросы почему при несуществующем индексе строка то не вставляется, то вставляется (при ind=FList.Count)
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#8: 2009-09-15 00:17:45 ЛС | профиль | цитата
Подождем ответа начальника транспортного цеха
карма: 22

0
Ответов: 485
Рейтинг: 86
#9: 2009-09-15 00:46:02 ЛС | профиль | цитата
nesco писал(а):
Подождем ответа начальника транспортного цеха
Ага.
filyaxxxcom писал(а):
И попутно выяснилось, что таблица тоже вываливается в Runtime Error, если индекс больше количества строк.

А с этим как?

карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#10: 2009-09-15 00:50:16 ЛС | профиль | цитата
filyaxxxcom писал(а):
А с этим как?

Исправлено
карма: 22

1
Голосовали:filyaxxxcom
Администрация
Ответов: 15295
Рейтинг: 1519
#11: 2009-09-15 00:56:16 ЛС | профиль | цитата
filyaxxxcom писал(а):
При несуществующем индексе строка ИМХО вставляться не должна (как и сделано в оригинальном коде).

должна. В идеале строка вставляется в начало списка всегда при index < 0 и в конец списка всегда при index>= count

в vcl же сделано следующим образом:
- при index < -1 или index > count выкидывает ошибку
- при index = -1 или index = count метод работает аналогично add

выбирать надо один из этих вариантов, а не нечто промежуточное
карма: 27
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#12: 2009-09-15 01:06:07 ЛС | профиль | цитата
Dilma писал(а):
выбирать надо один из этих вариантов, а не нечто промежуточное

Для нас больше подходит последний, но в KOL'e -1, вроде, не поддерживается в качестве активного индекса
карма: 22

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)