![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в ListBox [D7, WinXP]
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 по условию и посредством кнопок к_первой-вперёд-назад-к_последней перемещаться по выборке и позиционировать листбокс на нужной строке %)