| 
| 
 | Вопрос # 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): Вопрос успешно решен. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |