Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск в ListBox [D7, WinXP]


Страницы:   1 2

kodov ©   (2007-03-19 16:22:00) 

Здравствуйте!
Помогите пожалуйста разобраться с проблемой.
Есть код:
var
i: integer;
flag: boolean;
begin
if personslist.Items.Count=0 then
begin
showmessage('There are no elements to find');
mainform.Show;
end
else if edit1.Text='' then begin
showmessage('Enter something to find');
mainform.Show;
end;
i:=0;
flag:=false;
repeat
if Pos(LowerCase(Edit1.Text),LowerCase(personslist.Items.Strings[i]))<>0 then
begin
personslist.Selected[i]:=true;
n:=i;
flag:=true;
end;
inc(i);
until (i=personslist.Count-1) or (flag=true);
end;
Этот код работает, но когда в списке более 300 элементов,то
поиск подглючивает. Он никак не хочет находить последние несколько элементов.
Заранее спасибо.


SCz   (2007-03-29 15:17:00) [1]

With lbFl do
begin
 for i := 0 to (Items.Count - 1) do
   begin
   if Pos(AnsiUpperCase(eSearch.Text), AnsiUpperCase(Items[i])) <> 0 then
     begin
     ItemIndex := i;
     lbFl.SetFocus;
     Exit;
     end;
   end;
end;


kodov   (2007-03-26 15:40:00) [2]

Всё получилось.
Я выбрал предыдущий вариант Raskov'а.
А Ричэдит - это просто для себя узнать, интересно, просто у меня уже ничего не получалось и я подумал, что это тоже вариант.


RASkov   (2007-03-26 14:35:00) [3]

> [37] _Knight_   (26.03.07 11:07)

Он пока выбирает, на чем-же лучше остановиться - RichEdit или ДБ...
:))
ЗЫ Не в обиду автору. Просто я таких извращений еще не видел :)


_Knight_   (2007-03-26 11:07:00) [4]

Хоть бы поделился результатом.. :)


kodov   (2007-03-23 19:33:00) [5]

Спасибо всем за ответы.


Knight   (2007-03-23 00:52:00) [6]


> [33] RASkov   (22.03.07 16:56)
> [21] переведи ;)

Так… на скорую руку без блокировок и проверок… но даже вроде работает %)))))))
На форме Query1 (BDE), ListBox1, Edit1, SpeedButton1-5 с тегами 0-4.

procedure TForm1.FormCreate(Sender: TObject);
begin
 if FileExists(ExtractFilePath(Application.ExeName)+'PList.db') then DeleteFile(ExtractFilePath(Application.ExeName)+'PList.db');

 Query1.DatabaseName:=ExtractFilePath(Application.ExeName);
 Query1.SQL.Text:='CREATE TABLE PList (ID INTEGER, P_NAME VARCHAR(255))';
 Query1.ExecSQL;
end;

//------ — Заполнение списка и таблицы… где-то — ------------
 Query1.SQL.Text:='INSERT INTO PList (ID,P_Name) VALUES (:ID,:P_NAME)';
 Query1.Prepare;
// Какой-то цикл
   Query1.Params.ParamByName('ID').AsInteger:=ListBox1.Items.Add('234324');
   Query1.Params.ParamByName('P_NAME').AsString:='234324';
   Query1.ExecSQL;
// Конец какого-то цикла
//-----------------------------------------------------------

procedure TForm1.Button2Click(Sender: TObject);
var k:Integer;
begin
 if Sender is TSpeedButton then begin
   k:=(Sender as TSpeedButton).Tag;
   if k=0 then begin       // выборка по клавише «FIND»
     Query1.SQL.Text:='SELECT * FROM PList WHERE P_NAME LIKE «%» || :P_Name || «%» ORDER BY ID';
     Query1.Prepare;
     Query1.Params.ParamByName('P_NAME').AsString:=Edit1.Text;
     Query1.Open;
     if Query1.RecordCount>0 then k:=1;
   end;
   case k of
     1: Query1.First; // первая подходящая строка
     2: Query1.Prior; // предыдущая
     3: Query1.Next;  // следующая
     4: Query1.Last;  // последняя
   end;
   if k in [1,2,3,4] then begin
     Panel1.Caption:=IntToStr(Query1.RecNo)+'/'+IntToStr(Query1.RecordCount);
     ListBox1.ItemIndex:=Query1.FieldByName('ID').AsInteger;
   end;
 end;
end;


Knight   (2007-03-22 17:08:00) [7]

Перевёл бы, да идтить надо... мож вечером :)


RASkov   (2007-03-22 16:56:00) [8]

> [32] Knight ©   (22.03.07 16:45)
> просто перевёл свой пост в код

[21] переведи ;)


Knight   (2007-03-22 16:45:00) [9]

> [31] RASkov   (22.03.07 16:41)
> нечто похожее


Чтоб варианты были.. я просто перевёл свой пост в код :)


RASkov   (2007-03-22 16:41:00) [10]

> [30] Knight ©   (22.03.07 16:34)

Не... это не то, нечто похожее ему было уже предложено... следом рич'едит :(


Knight   (2007-03-22 16:34:00) [11]

> [29] RASkov   (22.03.07 16:25)
> Правильно наверное замечено в "прочих" в ветке про давание
> кода....


Точно..

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
 if PersonsList.Items.Count=0 then ShowMessage('There are no elements to find')
 else if Edit1.Text='' then ShowMessage('Enter something to find')
 else begin
   i:=PersonsList.ItemIndex+1;
   while (i<PersonsList.Items.Count) and (Pos(AnsiLowerCase(Edit1.Text),AnsiLowerCase(PersonsList.Items[i]))=0) do Inc(i);
   if i<PersonsList.Items.Count then PersonsList.ItemIndex:=i
   else ShowMessage('Больше ничего не найдено');
 end;
end;


RASkov   (2007-03-22 16:25:00) [12]

> [28] Knight ©   (22.03.07 16:18)
> Если с искать далее, то цикл тотде, только поиск не с нуля, а с номера текущей строки... и делов.

> а так уже все исходные варианты даны

Правильно наверное замечено в "прочих" в ветке про давание кода....
Код нужно давать тот, и только тот, который нужен автору вопроса... :)
Иначе начинается [19], [21]..
- [21] - не удивляйся, щас и реализация пойдет...:)


Knight   (2007-03-22 16:18:00) [13]

Если с искать далее, то цикл тотде, только поиск не с нуля, а с номера текущей строки... и делов.


RASkov   (2007-03-22 16:07:00) [14]

> [25] kodov   (22.03.07 15:40)
> Значит мой вариант не очень?

Какой... [19]? Что значит не очень? Нет, он очень... очень... ну очень.. очень извращенный. :)

> Ну а всё-таки, как это осуществить?

Что? Уже о БД для поиска задумался?
:)


Knight   (2007-03-22 15:54:00) [15]

> [25] kodov   (22.03.07 15:40)
> Значит мой вариант не очень?
> Ну а всё-таки, как это осуществить?

Повтори ещё раз.. чё-то я уже нить вопроса потерял.. то одно надо, то другое... а так уже все исходные варианты даны... даже с базой :)


kodov   (2007-03-22 15:40:00) [16]

Значит мой вариант не очень?
Ну а всё-таки, как это осуществить?


RASkov   (2007-03-22 11:47:00) [17]

> [23] Knight ©   (22.03.07 10:17)
> Ну это-ж надо до такого додуматься....:)
> А чё.. если уж через ричедит можно, то пусть уж BDE ищет

Это вобще-то о [19] по большей части сказано :)) ну и [21] просто в тему. Супер. :)


Knight   (2007-03-22 10:17:00) [18]

> [22] RASkov   (22.03.07 01:02)
> Ну это-ж надо до такого додуматься....:)


А чё.. если уж через ричедит можно, то пусть уж BDE ищет.. у него башка большая %)))


RASkov   (2007-03-22 01:02:00) [19]

> Только как это осуществить?
> Может кто поможет?

Лучше копай в сторону [21] :) шутка. Ну это-ж надо до такого додуматься....:)


Knight   (2007-03-21 23:52:00) [20]

Есть ещё вариант… создать динамически создать бд с одной таблицей, например, Paradox… Занести туда все значения из лист бокса под номерами строк… делать выборку посредством TQuery по условию и посредством кнопок к_первой-вперёд-назад-к_последней перемещаться по выборке и позиционировать листбокс на нужной строке… %)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо