|
Вопрос # 6 280/ вопрос решён / |
|
Приветствую, уважаемые эксперты!
У меня следующая ситуация. На форме имеется компонент TTreeView. Для каждого вновь добавляемого по кнопке узла указывается уникальный цвет типа TColor. Вопрос такой: Возможно ли этот цвет визуально отобразить напротив соответствующего узла в дереве и как это сделать?
 |
Вопрос задал: IlyPavel (статус: Посетитель)
Вопрос отправлен: 11 октября 2012, 07:31
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 18 октября 2012, 14:00; участников в обсуждении: 3.
|
DNK (статус: Студент), 11 октября 2012, 07:55 [#1]:
Если у тебя delphi7. Выделяешь компонент, идешь в инспектор объектов и выделяешь событие OnCustomDrawItem. Открывашь справку по F1, по ссылке Delphi example есть пример.
"Digital Networked Knight"
|
|
min@y™ (статус: Доктор наук), 11 октября 2012, 08:16 [#2]:
Да, конечно можно и вручную рисовать, но элегантнее было бы написать компонент-потомок TCustomImageList! Если бы передо мной стояла подобная задача, я бы попробовал, хотя бы ради интереса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
IlyPavel (статус: Посетитель), 11 октября 2012, 11:53 [#3]:
Остановился на элегантном варианте и выбрал компонент ListImage.
При создании новой пиктограммы узла использую переменную типа TBitMap и возникло два вопроса: 1) как без загрузки файла поместить в неё пиктограмму размером 16x16 и монолитно залитую цветом типа TColor?; 2) Как напротив нужного узла указать пиктограмму конкретного цвета, т.е. как установить соответствие между узлом и выбранным для него цветом?.
|
|
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™ (статус: Доктор наук), 11 октября 2012, 13:34 [#5]:
Хотя, всё-таки я бы написал именно потомка TCustomImageList с методом function ImageIndexOf(const Color: TColor): Integer; т.к. есть живой пример с исходником - компонент TSysImageList.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
IlyPavel (статус: Посетитель), 18 октября 2012, 14:00 [#6]:
Все решил вопрос!!!
Обошелся компонентом 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): Вопрос успешно решен.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|