С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/120: Рейтинг темы: голосов - 120, средняя оценка - 4.86
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522

Поиск по ListBox

11.08.2010, 09:51. Показов 23745. Ответов 56
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здарова!
мне нужно произвести поиск по списку
следущий код это делает, но если ввести слово целиком. а мне нужно, чтобы темы в ListBox выделялись сразу при введениии уже первой буквы в Edit.
например если я ввел в Edit букву "а", то в ListBox выделялась тема которая начинается на букву "а" (и дальше по алфавиту (без учета регистра). алфавиты - рус и англ)

теперь код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm1.Edit1Change(Sender: TObject);
var i: integer;
begin
Memo1.Clear;
if Length(Edit1.Text) <> 0 then
   for i:= 0 to ListBox1.Items.Count - 1 do
   if ListBox1.Items.Strings[i] = Edit1.Text then
   try
   AssignFile(f, ExtractFilePath(Application.ExeName) + 'а3\' + ListBox1.Items.Strings[i] + '.txt');
    {$I-}
    Reset(f);
    {$I+}
   if IOResult = 0 then  begin
     while not EOF(f) do
          begin
               readln(f, st);
               form1.memo1.Lines.Add(st);
           end;
         closefile(f);
    end;
  except
  exit;
 end;
end;
2
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.08.2010, 09:51
Ответы с готовыми решениями:

Удаление не выделенных строк в ListBox (Поиск в ListBox)
Добрый день! Друзья, подскажите, пожалуйста, как внутри ListBox организовать поиск по записям (фильтр), чтобы остались только валидные...

поиск+listbox
имеется массив слов. выполняю поиск в массиве по букве через Contains. результат (если имеется слово с такой буквой) выводиться в...

Поиск в ListBox
Добрый день. Необходимо сделать поиск в listbox при указании текста в edit. Необходимо чтобы, было следующего плана: начинаешь вписывать...

56
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
11.08.2010, 10:14
Вот таким образом можно осуществить быстрый поиск в ListBox

Delphi
1
ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
11.08.2010, 11:26  [ТС]
Mad_Dog, разъяснения можно. напр. что за ф-я Perform, и дальше в скобках не понятно

Добавлено через 2 минуты
и куда в моем коде его втиснуть или мой код вабще не нужен?
просто с каждой строкой в листбоксе связан файл и он должен открыватся в Мемо
0
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
11.08.2010, 11:57
Посмотри пример...
Tmp.rar
1
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
11.08.2010, 13:18
Лучший ответ Сообщение было отмечено как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm1.Edit1Change(Sender: TObject);
var
  I: Integer;
begin
for I := 0 to ListBox1.Items.Count - 1 do
   begin
 
   //Åñëè íàøëè òåêñò èç edit
   if Pos(Edit1.Text, ListBox1.Items[i]) > 0 then
      begin
 
      //âûäåëÿåì íàéäåííóþ ñòðîêó â ListBox,
      //âûõîäèì èç öèêëà
      Listbox1.ItemIndex := I;
      Break;
      end;
 
   //Åñëè ñëîâî íå íàéäåíî
   if Pos(Edit1.Text, ListBox1.Items[i]) = 0 then
      begin
      //Ñíèìàåì âûäåëåíèå èç ListBox
      Listbox1.ItemIndex := -1;
      end;
 
   end;
end;
3
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
11.08.2010, 13:30
А если ListBox содержит не одну сотню строк? То при вводе каждого символа в Edit бум бегать по всем строкам листбокса и искать вхождение содержимого Эдита? Да и вхождение подстроки может начинаться с любой позиции в строке Листбокса...
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
11.08.2010, 13:36
Цитата Сообщение от Mad_Dog Посмотреть сообщение
А если ListBox содержит не одну сотню строк?
Ну я думаю это не тот случай

Цитата Сообщение от Mad_Dog Посмотреть сообщение
То при вводе каждого символа в Edit бум бегать по всем строкам листбокса и искать вхождение содержимого Эдита?
Парень молодой побегает
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
11.08.2010, 15:00  [ТС]
John_Pa9JIbHuK, -> Ну я думаю это не тот случай
это тот случай
блин знал же что ф-я Pos нужна, не смог реализовать
0
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
11.08.2010, 15:06
Ну, если уж использовать Pos(), то проверять на вхожение подстроки в строку и равенство Pos()=1...
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
11.08.2010, 15:08  [ТС]
John_Pa9JIbHuK, и как он работает?? мой хоть по словам искал, а этот вабще не реагирует
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
11.08.2010, 15:12
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
и как он работает?? мой хоть по словам искал, а этот вабще не реагирует
Ну ты вводишь буквы в едит и если он находит ее в лист боксе то строка выделяется
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
11.08.2010, 15:18  [ТС]
Mad_Dog, не обезательно Pos. то что ты дал работает (осталось только с файлами его связать). напр. в списке 2 слова - авто (инфа - иномарки, отечественные) и атом (инфа - водород, протоны ...). при вводе в Edit буквы "а" должно выделяться "авто", т.к. 2-ая буква "в", ну и т.д в этом роде.

инфа выводится в Мемо

Добавлено через 3 минуты
John_Pa9JIbHuK, нет же, не работает. на 2-ом условии ошибка

Добавлено через 1 минуту
дкмаю после первого условия, должно идти ELSE
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
11.08.2010, 15:23
Love_and_Peace, я прежде чем код выложил проверил все работает и else необязательно можно и два if сделать

Добавлено через 2 минуты
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ListBox1: TListBox;
    procedure Edit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Edit1Change(Sender: TObject);
var
  I: Integer;
begin
for I := 0 to ListBox1.Items.Count - 1 do
   begin
 
   //Если нашли текст из edit
   if Pos(Edit1.Text, ListBox1.Items[i]) > 0 then
      begin
 
      //выделяем найденную строку в ListBox,
      //выходим из цикла
      Listbox1.ItemIndex := I;
      Break;
      end;
 
   //Если слово не найдено
   if Pos(Edit1.Text, ListBox1.Items[i]) = 0 then
      begin
      //Снимаем выделение из ListBox
      Listbox1.ItemIndex := -1;
      end;
 
   end;
end;
 
end.
0
Фрилансер
 Аватар для Mad_Dog
452 / 433 / 117
Регистрация: 01.06.2010
Сообщений: 1,314
11.08.2010, 15:25
Love_and_Peace, я полагаю, что в твоем Листбоксе включена сортировка...
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
11.08.2010, 15:26  [ТС]
John_Pa9JIbHuK, и тя выделяются строки????
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
11.08.2010, 15:38
Love_and_Peace,
Попробуй так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.Edit1Change(Sender: TObject);
var
  I: Integer;
begin
ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
if Listbox1.ItemIndex <> -1 then
  begin
  AssignFile(f, ExtractFilePath(Application.ExeName) + 'à3\' + ListBox1.Items[listbox1.itemindex] + '.txt');
  Reset(f);
  if IOResult = 0 then
    begin
    while not EOF(f) do
      begin
      readln(f, st);
      form1.memo1.Lines.Add(st);
      end;
    closefile(f);
    end;
  end;
Listbox1.ItemIndex := -1;
end;
Добавлено через 7 минут
Только плохо что это будет происходить по нажатию клавиши так как постоянно будет открываться файл который возможно тебе не нужен.
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
11.08.2010, 20:54  [ТС]
Mad_Dog, если ты имеешь ввиду св-во Sorted, то оно у меня отключено (в смысле false)
John_Pa9JIbHuK, по нажатию какой клавиши.
в этом коде какую бы букву я не ввел в Мемо выходит инфа первой строки в списке

Добавлено через 42 минуты
объясните кто -нибудь (подробно!) что делает следующая строка
Цитата Сообщение от John_Pa9JIbHuK Посмотреть сообщение
ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
11.08.2010, 22:32
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
Если я правильно понимаю она выделяет в листбоксе строку в которой содержится тест из едита.
Love_and_Peace, Что конкретно не получается то?

Добавлено через 5 минут
Цитата Сообщение от John_Pa9JIbHuK Посмотреть сообщение
ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
В этой строке ты ищешь с листбоксе строку из эдита.

Цитата Сообщение от John_Pa9JIbHuK Посмотреть сообщение
if Listbox1.ItemIndex <> -1 then
Тут мы проверяем найдена ли такая строка тоесть выделен ли какой нить элемент из листбокса

Ну а дальше ты делаешь то что тебе нужно
Цитата Сообщение от John_Pa9JIbHuK Посмотреть сообщение
AssignFile(f, ExtractFilePath(Application.ExeName) + 'а3\' + ListBox1.Items[listbox1.itemindex] + '.txt');
ListBox1.Items[listbox1.itemindex]
Тут мы получаем выделенную строку из листбокса т.е в итоге мы связываем f с путем
Путь приложения + а3\ + Выделенная строка листбокса + .тхт

Добавлено через 3 минуты
Love_and_Peace, Может создать TStrings загрузить в него текст .LoadFromFile(Наш путь) и потом уже добавлять текст оттуда в мемо?
0
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
11.08.2010, 22:39  [ТС]
John_Pa9JIbHuK, когда пишешь просто вот эту ф-ю, то выделяется

Цитата Сообщение от John_Pa9JIbHuK Посмотреть сообщение
ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
, а если все остальное, то на изменения в Эдит прога никак не реагирует

а вот предыдущий код который ты давал (через Pos) выделял (и открывал инфу) только первой строки, на остальные также не реагирует

Добавлено через 4 минуты
John_Pa9JIbHuK, так придется перестраивать всю прогу. у меня вся инфа находится в текстовых файлах. ListBox связан с TreeView, при удалении элемента в TV удаляется и файл в каталоге (а3 в моем случае).

Добавлено через 1 минуту
конечно удаляется и тема в списке соответствующая элементу TV
0
Добрый самаритянин
 Аватар для John_Pa9JIbHuK
1107 / 622 / 139
Регистрация: 31.03.2009
Сообщений: 2,567
11.08.2010, 22:50
Вот попробуй так, но я непроверял так накалякал по быстрому так что могут быть ошибки.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Edit1Change(Sender: TObject);
var
  I: Integer;
  G: TStringList;
begin
G := TStringList.Create;
ListBox1.Perform(LB_SELECTSTRING,-1,longint(Pchar(Edit1.text)));
if Listbox1.ItemIndex <> -1 then
  begin
  G.LoadFromFile(ExtractFilePath(Application.ExeName) +
    'a3\' + ListBox1.Items[listbox1.itemindex] + '.txt');
  memo1.Text := memo1.Text + G.text;
  end;
Listbox1.ItemIndex := -1;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.08.2010, 22:50
Помогаю со студенческими работами здесь

Поиск в ListBox
Здравствуйте! Нужна помощь. Мне нужно реализовать поиск в listbox: Даже не знаю как написать в общем: У меня есть TextBox и...

Поиск в listbox
У меня есть listbox и там написаны имена. На какое-то событие нужно найти в listbox строку с именем и добавить к этой строке...

Поиск в ListBox
Всем привет! Я делаю поиск в LISTBOX по совпадению и вывожу совпадения в другой LISTBOX: string poisk1 = new string; ...

Поиск в Listbox
Здравствуйте! Как организовать поиск в listbox ? Например ввожу текст в textbox что бы искал-фильтровал в listbox'е?

Поиск в ListBox
Собственно такой вопрос... У мен я в ListBox ооооочень много значений. Поэтому нужен поиск по этим элементам. Сделать поиск по полному...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru