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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2009, 14:49   #1
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию Поиск - дальше, назад в TTreeView

Здравствуйте, есть функция :

Код:
function TVSearch(T: TTreeView; S: string): TTreeNode;
var
  I: Integer;
  Find: string;
begin
  if (T = nil) or (S = '') then
     Exit;
  for I := 0 to T.Items.Count - 1 do
  begin
       Find := T.Items[I].Text;
       if S = Find then
       begin
          Result := T.Items[I];
          Exit;
       end
       else           
          Result := nil;
  end
end;
Но она ищет только самый первый элемент в дереве. А если дальше есть элементы с таким же именем она их уже не найдет. Как сделать такую функцию которая будет искать - дальше, назад. Как в блокноте Я пробовал так, запоминал где сейчас стоит выделение и начинал цикл с того места и в правду работает, но только тогда когда в дереве всего один уровень, а если их много, то есть в каждом пункте вложены еще подпункты. Тогда этот метод не работает
RIO вне форума Ответить с цитированием
Старый 12.12.2009, 15:55   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
var mycounter: integer;
...
function TVSearch(T: TTreeView; S: string): TTreeNode;
var
  I: Integer;
  Find: string;
begin
  if (T = nil) or (S = '') then
     Exit;
  for I := mycounter to T.Items.Count - 1 do
  begin
       Find := T.Items[i].Text;
       if S = Find then
       begin
          Result := T.Items[i];
          mycounter:=i+1;
          Exit;
       end
       else           
          Result := nil;
  end
end;
mihali4 вне форума Ответить с цитированием
Старый 13.12.2009, 15:34   #3
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Спасибо Но не почему-то не работает. Вот мой код :

Код:
var
  SearchBox: TSearchBox;
  K: Integer;

implementation

uses Main;

{$R *.dfm}

function TVSearch(T: TTreeView; S: string): TTreeNode;
var
  I: Integer;
  Find: string;
begin
  if (T = nil) or (S = '') then
     Exit;
     for I := K to T.Items.Count - 1 do
     begin
         Find := T.Items[I].Text;
         if S = Find then
         begin
            Result := T.Items[I];
            K := I + 1;
            Exit;
         end
         else
            Result := nil;
     end
end;

procedure TSearchBox.SearchButtonClick(Sender: TObject);
begin
  if Box.TreeView1.Selected.Index = -1 then
     K := 0
  else
     K := Box.TreeView1.Selected.Index + 1;
  Box.TreeView1.Selected := TVSearch(Box.TreeView1, SearchEdit.Text);
end;

end.
RIO вне форума Ответить с цитированием
Старый 13.12.2009, 16:52   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от RIO Посмотреть сообщение
Спасибо Но не почему-то не работает. Вот мой код
Вы правы - не работает... ваш код не работает...
А мой - работает...
mihali4 вне форума Ответить с цитированием
Старый 13.12.2009, 18:11   #5
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Мой же код ничем не отличается от вашего Только название переменной поменял. Или проблема не в функции, а в событии на кнопке ?
RIO вне форума Ответить с цитированием
Старый 13.12.2009, 18:58   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от RIO Посмотреть сообщение
Мой же код ничем не отличается от вашего Только название переменной поменял. Или проблема не в функции, а в событии на кнопке ?
Еще как отличается... Что за строка
K := Box.TreeView1.Selected.Index + 1;
И где это у вас меняется TreeView1.Selected ?

Вот вам вариант с вашими переменными:
Код:
procedure TForm1.Button9Click(Sender: TObject);
var
  Find,S: string;
begin
S:='12';
  for I := K to TreeView1.Items.Count - 1 do
  begin
       Find := TreeView1.Items[i].Text;
       if S = Find then
       begin
          TreeView1.Items[i].Selected:=True;
          TreeView1.SetFocus;
          Application.ProcessMessages;
          K:=i+1;
          exit;
       end;
  end;
  K:=0;
end;
Хоитите, переделывайте его в функцию...
mihali4 вне форума Ответить с цитированием
Старый 13.12.2009, 22:14   #7
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Огромное спасибо, все работает

О ! Еще вопрос. Переменная K перед циклом же должна задаваться, чему присвоить K ? То есть, это нужно для того, что бы выделить элемент в дереве и начать поиск именно с этого места. А не сначала.

Последний раз редактировалось Stilet; 14.12.2009 в 10:39.
RIO вне форума Ответить с цитированием
Старый 13.12.2009, 23:44   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Изначально у меня она приравнивается нулю при FormCreate.
Далее идет последовательный поиск с этого самого нуля.
Вы можете после задания S (у меня S:='12') задать и значение К...
mihali4 вне форума Ответить с цитированием
Старый 14.12.2009, 00:12   #9
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Хочется сделать что-то типа :
Код:
K := Box.TreeView1.Selected.Index;
Что бы поиск начинался с того места где стоит выделение. Но так ничего не работает. Не работает скорее всего из-за того, что есть еще подпункты
RIO вне форума Ответить с цитированием
Старый 14.12.2009, 00:18   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Нет, не работает из-за того, что тут же натыкается на эту же ноду.
А вот если сделать
Код:
K := Box.TreeView1.Selected.AbsoluteIndex+1;
тогда будет работать...
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Откат макроса назад Chelentano Microsoft Office Excel 11 12.04.2016 18:02
Возвращение назад в меню K[Lanc]N Помощь студентам 5 22.02.2009 11:14
TTreeView поиск по имени Родион Компоненты Delphi 6 05.05.2008 14:07
Назад в прошлое Repz О форуме и сайтах клуба 4 14.08.2007 12:56
на шаг назад... malevich Общие вопросы Delphi 9 01.04.2007 20:50