Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 280

/ вопрос решён /

Приветствую, уважаемые эксперты!
У меня следующая ситуация. На форме имеется компонент TTreeView. Для каждого вновь добавляемого по кнопке узла указывается уникальный цвет типа TColor. Вопрос такой: Возможно ли этот цвет визуально отобразить напротив соответствующего узла в дереве и как это сделать?

IlyPavel Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: IlyPavel (статус: Посетитель)
Вопрос отправлен: 11 октября 2012, 07:31
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 18 октября 2012, 14:00; участников в обсуждении: 3.
DNK

DNK (статус: Студент), 11 октября 2012, 07:55 [#1]:

Если у тебя delphi7. Выделяешь компонент, идешь в инспектор объектов и выделяешь событие OnCustomDrawItem. Открывашь справку по F1, по ссылке Delphi example есть пример.
"Digital Networked Knight"
min@y™

min@y™ (статус: Доктор наук), 11 октября 2012, 08:16 [#2]:

Да, конечно можно и вручную рисовать, но элегантнее было бы написать компонент-потомок TCustomImageList! :) Если бы передо мной стояла подобная задача, я бы попробовал, хотя бы ради интереса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
IlyPavel

IlyPavel (статус: Посетитель), 11 октября 2012, 11:53 [#3]:

Остановился на элегантном варианте и выбрал компонент ListImage.
При создании новой пиктограммы узла использую переменную типа TBitMap и возникло два вопроса: 1) как без загрузки файла поместить в неё пиктограмму размером 16x16 и монолитно залитую цветом типа TColor?; 2) Как напротив нужного узла указать пиктограмму конкретного цвета, т.е. как установить соответствие между узлом и выбранным для него цветом?.
min@y™

min@y™ (статус: Доктор наук), 11 октября 2012, 13:25 [#4]:

Цитата (IlyPavel):

1) как без загрузки файла поместить в неё пиктограмму размером 16x16 и монолитно залитую цветом типа TColor?

Блин, никогда так не делал. Однако, поэкспериментируй: у TBitmap есть свойство Canvas, у которого есть метод Rectangle(), рисующий прямоугольники, в том числе закрашенные нужным цветом, определяющимся свойством TCanvas.Brush.Color.

Цитата (IlyPavel):

2) Как напротив нужного узла указать пиктограмму конкретного цвета, т.е. как установить соответствие между узлом и выбранным для него цветом?

Здесь проще. Как один из вариантов - создать глобальный список типа TList и хранить в нём соответствия (номер цвета в TImageList <---> значение цвета типа TColor). При добавлении нового узла поиском в этом списке находить нужный ImageIndex для этого узла. Если такой список ещё и отсортировать по возрастанию, то поиск (IndexOf()) будет работать очень быстро.

Вот как-то так я всё себе это и представляю.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 11 октября 2012, 13:34 [#5]:

Хотя, всё-таки я бы написал именно потомка TCustomImageList с методом function ImageIndexOf(const Color: TColor): Integer; т.к. есть живой пример с исходником - компонент TSysImageList.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
IlyPavel

IlyPavel (статус: Посетитель), 18 октября 2012, 14:00 [#6]:

Все решил вопрос!!! :-D
Обошелся компонентом TImageList и свойством ImageIndex компонента TTreeNode.
Кому интересно привожу код процедуры прорисовки пиктограммы для вновь добавляемого узла 2-го уровня:

procedure TDualListDlg.SetColor(Node: TTreeNode; Color: TColor);
var
varBitMap: TBitMap;
varMask: TBitMap;
varNode: TTreeNode;
IndNode: Integer;
begin
if (Node.Count <> 0) and (Node.Level = 1) then
begin
IndNode:= Node.Count-1;

varNode:= Node.Item[IndNode];
varBitMap:= TBitMap.Create;
varMask:= TBitMap.Create;
varBitMap.Width:= 16;
varBitMap.Height:= 16;
varBitMap.Canvas.Brush.Color:= Color;{цвет пиктограммы}
varBitMap.Canvas.Rectangle(3,3,13,13);
varMask.Width:= 16;
varMask.Height:= 16;
varMask.Canvas.Brush.Color:= 0; {маска чёрного цвета}
varMask.Canvas.Rectangle(1,1,16,16);

ImageListPicTag.Add(varBitMap, varMask);
varNode.ImageIndex:= indImg;
indImg:=indImg+1;
varBitMap.Free;
varMask.Free;
end;
end;

Указанная процедура вызывается в момент создания узла.

Всем спасибо за помощь !!!

18 октября 2012, 14:02: Статус вопроса изменён на решённый (изменил автор вопроса — IlyPavel): Вопрос успешно решен.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:25
Выполнено за 0.02 сек.