Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.05;
Скачать: CL | DM;

Вниз

Поиск   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
14-12111
quik
2003-12-14 13:01
2004.01.05
Компоненты


3-11793
Vick
2003-12-08 18:07
2004.01.05
Ошибка в ХП при закрытии и выполнении Select * FROM OPENROWSET...


4-12201
MaG
2003-11-04 16:32
2004.01.05
Определение имени ...


1-11937
Zav_Bars
2003-12-20 10:56
2004.01.05
TComboBox


4-12220
Senator
2003-11-05 12:04
2004.01.05
путь