Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
ВнизПоиск Найти похожие ветки
← →
TrollXP (2003-12-10 11:34) [0]Доброе время суток! Подскажите как реализовать отбор в ListBox, если я ввожу имя в Edit, т.е. если в ListBoxе написано один, огурец, вода и т.п., то при вводе в Edit "о" остались только один и огурец.
← →
Stas (2003-12-10 11:55) [1]Procedure SearchListBox (ListBox:TListbox;Text:String);
Var i,n:Integer;
begin
n:=length(text);
For i:=0 to listbox.Items.Count-1
do begin
if UPPERCASE(text)=uppercase(Copy(Listbox.items[i],1,n)) then
begin
listBox.ItemIndex:=i;
exit;
end;
end;
end;
← →
Тролль (2003-12-10 16:10) [2]Что-то не работает твой пример!
← →
Erik (2003-12-10 16:57) [3]Он неподставил удаление элемента.
← →
TUser (2003-12-10 17:18) [4]А ежели его поставить - то нумерация элементов поменяется. Поэтому делай так
1. вместо for пиши while и инкреминируй i только в том случае, если ничего не удалялось.
2. заноси все найденные элементы в отдельный динамический массив, но заноси туда не i, а i-length(yourindexarray)-1. Потом все удаляй.
3. в цикле for после удаления элемента проверяй вновь возникший на его месте, т.е.
for i:=0 to length(ar)-1 do
while UPPERCASE(text)=uppercase(Copy(Listbox.items[i],1,n)) do
// здесь удаляй элемент массива
Ну, можно еще какие-нибудь способы выдумать.
← →
Тролль (2003-12-15 15:52) [5]2 TUser
Вот я тут 5 дней уже мучаюсь и никак не могу понять твой алгоритм. Может, объяснишь подробнее?
← →
Palladin (2003-12-15 17:51) [6]
var
AllItems:TStringList; // хранишь исходный массив строк
procedure TForm1.Edit1Change(Sender: TObject);
var
i:integer;
begin
LockWindowUpdate(ListBox1.Handle);
ListBox1.Clear;
for i:=0 to AllStrings.Count-1 do
if AnsiUpperCase(Copy(AllStrings[i],1,Length(Edit1.Text)))=AnsiUpperCase(Edit1.Text) then
ListBox1.Items.Add(AllStrings[i]);
LockWindowUpdate(0);
end;
← →
Тролль (2003-12-18 12:58) [7]Спасибо. У меня был такой вариант, но я не смог его продумать. Тут такой вопрос: я так понял, что при добовление строк (AllItems.Add) строки не добовляются, а замещают старые. Так вот, а если использовать другой ListBox, это не повлияет на скорость?
← →
TUser (2003-12-18 13:17) [8]1. Вроде должно работать так. Берем первый элемент, если первые буквы (n = length(text)) совпадают с точностью до их заглавности, то этот элемент надо удалить. Если удалили - то на его место встанет новый элемент, следовательно опять преоверяем, пока не окажется, что на этом месте остался элемент, который не надо удалять. для этого цикл while. (Его вообще-то неплохо бы записать, как while (...) and i<ListBox1.Items.Count), а то можно нарваться на AV). как только это случилось проевереяем след. элемент списка - для этого нам for.
2. Add добавляет строки в конец. На скорость не повляет, но можно скорость работы немного увеличть, если написать with ListBox1 do ... . Хотя, много ты не выиграешь, если длина списков в пределах разумного.
← →
Тролль (2003-12-18 16:52) [9]2 TUser
Впринципе, я разобрался с кодом, который предложил Palladin. Правда, опять возникли вопросы. У меня два лист бокса: информация для одного берётся для другого. Т.е. если копию Листа (в котором ещю), то надо делать копию и второго Листа (помошника). А если, допустим, элементов более 1000 (а мож и больше) как это отразится на скорости и загруженности? Спасибо.
← →
Тимохов (2003-12-18 17:11) [10]Если у тебя 16 мГц 286, то может и отразиться.
На нормальном современном компе 1000, как и 10000, фигня.
Не фигня, когда есть время не n, а n в квадрате.
Т.е. любые линейные действия (т.е. сложности n) работают быстро.
ИМХО
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c