Выделение элементов TreeView

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Выделение элементов TreeView

Сообщение Brainenjii »

В общем, понадобилось выделить каким-либо образом отдельные элементы TreeView... Нужно сделать фильтрацию древовидной структуры, и может получиться так, что иерархия отфильтрованного получится "неровной"... Но чтобы отобразить результат в TreeView, непопавшие в фильтр элементы, как понимаю, придётся оставить... Но хочется их как-нибудь выделить - курсивом, или ещё как... Возможно ли? ^_^
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Вот столкнулся с той же проблемой. Может есть какая-то возможность выделить отдельный элемент цветом или особенным шрифтом?
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Не совсем то, но тоже про TreeView...

Вот этот код правильно не отрабатывает:

Код: Выделить всё

procedure TBookForm.ToolBtnSortClick(Sender: TObject);
begin
  UserTree.AlphaSort;
end;

Дерево перестраивается, но как-то не правильно... Где-то грабли, а где не понятно - миноискателя подходящего под рукой нет...
Изображение
Ну и вопрос:
Как добиться правильной алфавитной сортировки в tTreeView с минимальными трудозатратами? :?
Спасибо.

ps/ Если это имеет значение... Дерево строится на основании данных из БД FireBird с кодировкой NONE, данные хранятся в UTF-8
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Я вот так делаю:

Код: Выделить всё

Procedure TFormMain.TreeViewUsersCompare(Sender: TObject; Node1,
  Node2: TTreeNode; Var Compare: Integer);
Begin
  If Node1.Text > Node2.Text Then
    Compare := 1
  Else
    If Node1.Text = Node2.Text Then
      Compare := 0
    Else
      Compare := -1;
end;
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Brainenjii писал(а):Я вот так делаю:
...

Хм... А разве AlphaSort делает не то же самое?
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Вот, а потом AlphaSort ^_^ Что он делает сам - не знаю ^_^
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Brainenjii, спс. Заработало. В проекте на Дельфи описывать обработчик OnCompare не требовалось, при вызова AlphaSort и так все замечательно работало. По крайней мере у меня. Ничего... постепенно отвыкнем. :roll:

Вот. Немного усовершенствовал (если надо чтобы сортировка работала как регистро- независимая):

Код: Выделить всё

procedure TBookForm.UserTreeCompare(Sender: TObject; Node1, Node2: TTreeNode;
  var Compare: Integer);
begin
   Compare:= AnsiCompareText(AnsiUpperCase(UTF8ToAnsi(Node1.Text)), AnsiUpperCase(UTF8ToAnsi(Node2.Text)))
end;   
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

dunin
Ну тогда лучше уж так :wink:

Код: Выделить всё

procedure TBookForm.UserTreeCompare(Sender: TObject; Node1, Node2: TTreeNode;
  var Compare: Integer);
begin
   Compare:= WideCompareText(UTF8Decode(Node1.Text),UTF8Decode(Node2.Text))
end; 
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Mr.Smart, великолепно! Изображение
Хотя с ANSI оно как-то понятнее, роднее и привычнее, но взял на вооружение. :)
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

А не проще сортировать (order by) в запросе, а потом уже заполнить дерево?
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Padre_Mortius писал(а):А не проще сортировать (order by) в запросе, а потом уже заполнить дерево?

Это само собой. Но вредному юзеру завсегда надо куда-то залезть, куда программист и подумать не может. Или, например, взять мышой и перетянуть ветку дерева в другой узел и еще как-то поизголяться... ну и потом, когда все надоест, зевнуть, и одним нажатием кнопки перестроить все по алфавиту. В последнем случае проще просто ветки отсортировать, чем все заново строить. ИМХО.
Ответить