Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2011, 15:37   #1
Афанасий[vedma]
Вечнодумающий
Форумчанин
 
Аватар для Афанасий[vedma]
 
Регистрация: 14.07.2011
Сообщений: 161
По умолчанию Поиск одноименных узлов TreeView1

Привет=) я ищу узлы в TreeView1 таким образов:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to TreeView1.Items.Count - 1 do
    if Pos(AnsiUpperCase(Edit1.Text),AnsiUpperCase(TreeView1.Items[i].Text)) <> 0 then
    begin
      TreeView1.Selected := TreeView1.Items[i];
      TreeView1.SetFocus;
      Edit1.Text := '';
      break;
    end;
end;
ищет хорошо, НО! я в Edit пишу слово "Intel" и первое слово находит, а в TreeView1 разбросаны много таких слов. Как сделать так чтоб при каждом нажатии находил все "Intel"?
Из лоскутов Добра, шьется полотно Зла
Афанасий[vedma] вне форума Ответить с цитированием
Старый 25.11.2011, 16:11   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Нашли вы первое вхождение слова, сделали найденный узел текущим, распахнув его, если он был скрыт. Как вы себе представляете поиск сразу всех? Распахнуть их можно, но текущим сделаете только один. Что вы визуально увидите для достаточно большого дерева? И толку с такого поиска. Лучше уж поиск следующего делать.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.11.2011, 16:43   #3
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Как вариант при нахождении не ставить на узел фокус, а сбрасывать информацию в листбокс както так
Код:
 ListBox1.Items.AddObject(TreeView1.Items[i].Text +' '+inttostr( TreeView1.Items[1].Level) (ну или какуюто другую информацию о узле),TObject(TreeView1.Items[i]));
поиск естественно вести "до упора"

а потом при клике в листбоксе ставить фокус на этот узел
примерно так
Код:
TreeView1.Selected := (ListBox1.Items.Objects[ListBox1.ItemIndex] as TTreeNode);
      TreeView1.SetFocus;
vovk вне форума Ответить с цитированием
Старый 25.11.2011, 16:53   #4
Афанасий[vedma]
Вечнодумающий
Форумчанин
 
Аватар для Афанасий[vedma]
 
Регистрация: 14.07.2011
Сообщений: 161
По умолчанию

не все узлы - надо одноименные узлы по одиночке, т.е. при каждом клике
Из лоскутов Добра, шьется полотно Зла
Афанасий[vedma] вне форума Ответить с цитированием
Старый 25.11.2011, 16:59   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так это и есть поиск следующего. Просто при переборе узлов перебирать индекс не с нуля, а с индекса следущего узла от последнего найденного или плясать от следующего за текущим узлом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.11.2011, 03:14   #6
Афанасий[vedma]
Вечнодумающий
Форумчанин
 
Аватар для Афанасий[vedma]
 
Регистрация: 14.07.2011
Сообщений: 161
По умолчанию

А как реализовать поиск следующего слова? Я пытался что-то писать но не вышло
Из лоскутов Добра, шьется полотно Зла
Афанасий[vedma] вне форума Ответить с цитированием
Старый 27.11.2011, 06:27   #7
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Код:
procedure TForm1.Button4Click(Sender: TObject);
var
  i, y: integer;
begin
   if TreeView1.Selected = nil then
   y:=0 else
   y:=  TreeView1.Selected.AbsoluteIndex+1;
  for i := y to TreeView1.Items.Count - 1 do
    if Pos(AnsiUpperCase(Edit1.Text),AnsiUpperCase(TreeView1.Items[i].Text)) <> 0 then
    begin
      TreeView1.Selected := TreeView1.Items[i];
      TreeView1.SetFocus;
      break;
    end;
end
Это если приделать к вашему коду поиск от текущего узла.
vovk вне форума Ответить с цитированием
Старый 27.11.2011, 07:17   #8
Афанасий[vedma]
Вечнодумающий
Форумчанин
 
Аватар для Афанасий[vedma]
 
Регистрация: 14.07.2011
Сообщений: 161
По умолчанию

Спасибо вам большое Я решил поправить как то код - работает при двойном шелчке мыши
Из лоскутов Добра, шьется полотно Зла
Афанасий[vedma] вне форума Ответить с цитированием
Старый 28.11.2011, 03:20   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Смотрим тему
http://programmersforum.ru/showthread.php?t=174479
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарный поиск с определением ближайших узлов k281092 Паскаль, Turbo Pascal, PascalABC.NET 4 20.11.2011 21:30
Поиск узлов TreeView1 Афанасий[vedma] Компоненты Delphi 1 07.11.2011 02:10
Обход невозможности экспорта одноименных процедур Alex Cones Общие вопросы Delphi 2 10.11.2010 07:37
Поиск узлов в TreeView Ko$tello Компоненты Delphi 1 14.11.2006 17:18