Выделение элементов TreeView
Модератор: Модераторы
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Выделение элементов TreeView
В общем, понадобилось выделить каким-либо образом отдельные элементы TreeView... Нужно сделать фильтрацию древовидной структуры, и может получиться так, что иерархия отфильтрованного получится "неровной"... Но чтобы отобразить результат в TreeView, непопавшие в фильтр элементы, как понимаю, придётся оставить... Но хочется их как-нибудь выделить - курсивом, или ещё как... Возможно ли? ^_^
Вот столкнулся с той же проблемой. Может есть какая-то возможность выделить отдельный элемент цветом или особенным шрифтом?
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Не совсем то, но тоже про TreeView...
Вот этот код правильно не отрабатывает:
Дерево перестраивается, но как-то не правильно... Где-то грабли, а где не понятно - миноискателя подходящего под рукой нет...

Ну и вопрос:
Как добиться правильной алфавитной сортировки в tTreeView с минимальными трудозатратами?
Спасибо.
ps/ Если это имеет значение... Дерево строится на основании данных из БД FireBird с кодировкой NONE, данные хранятся в UTF-8
Вот этот код правильно не отрабатывает:
Код: Выделить всё
procedure TBookForm.ToolBtnSortClick(Sender: TObject);
begin
UserTree.AlphaSort;
end;Дерево перестраивается, но как-то не правильно... Где-то грабли, а где не понятно - миноискателя подходящего под рукой нет...

Ну и вопрос:
Как добиться правильной алфавитной сортировки в tTreeView с минимальными трудозатратами?
Спасибо.
ps/ Если это имеет значение... Дерево строится на основании данных из БД FireBird с кодировкой NONE, данные хранятся в UTF-8
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Я вот так делаю:
Код: Выделить всё
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;
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Вот, а потом AlphaSort ^_^ Что он делает сам - не знаю ^_^
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Brainenjii, спс. Заработало. В проекте на Дельфи описывать обработчик OnCompare не требовалось, при вызова AlphaSort и так все замечательно работало. По крайней мере у меня. Ничего... постепенно отвыкнем.
Вот. Немного усовершенствовал (если надо чтобы сортировка работала как регистро- независимая):
Вот. Немного усовершенствовал (если надо чтобы сортировка работала как регистро- независимая):
Код: Выделить всё
procedure TBookForm.UserTreeCompare(Sender: TObject; Node1, Node2: TTreeNode;
var Compare: Integer);
begin
Compare:= AnsiCompareText(AnsiUpperCase(UTF8ToAnsi(Node1.Text)), AnsiUpperCase(UTF8ToAnsi(Node2.Text)))
end; dunin
Ну тогда лучше уж так
Ну тогда лучше уж так
Код: Выделить всё
procedure TBookForm.UserTreeCompare(Sender: TObject; Node1, Node2: TTreeNode;
var Compare: Integer);
begin
Compare:= WideCompareText(UTF8Decode(Node1.Text),UTF8Decode(Node2.Text))
end; -
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
А не проще сортировать (order by) в запросе, а потом уже заполнить дерево?
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Padre_Mortius писал(а):А не проще сортировать (order by) в запросе, а потом уже заполнить дерево?
Это само собой. Но вредному юзеру завсегда надо куда-то залезть, куда программист и подумать не может. Или, например, взять мышой и перетянуть ветку дерева в другой узел и еще как-то поизголяться... ну и потом, когда все надоест, зевнуть, и одним нажатием кнопки перестроить все по алфавиту. В последнем случае проще просто ветки отсортировать, чем все заново строить. ИМХО.

