Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
3-11828
yaric
2003-12-04 18:14
2004.01.05
TpFibsdatabase и Dll


14-12159
sad
2003-12-05 10:07
2004.01.05
Иероглиф светлой печали


3-11795
Мыш
2003-12-09 12:38
2004.01.05
пропадают введенные данные


14-12162
evbut
2003-11-11 10:49
2004.01.05
Perl на Delphi


1-11851
Morgan128
2003-12-18 17:14
2004.01.05
Работа с текстом





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский