Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.02;
Скачать: CL | DM;

Вниз

TreeView   Найти похожие ветки 

 
Ann ©   (2003-05-19 11:08) [0]

Добрый день! Подскажите пожалуйста, могу ли я записи помечать разными цветами в TreeView?


 
Skier ©   (2003-05-19 11:15) [1]

OnAdvancedCustomDrawItem


 
Ann ©   (2003-05-19 11:34) [2]

помечает все одним цветом, а нужно как в гриде можно делать разными


 
Skier ©   (2003-05-19 11:38) [3]

>Ann © (19.05.03 11:34)
бррррррр...в каком таком гриде ?
И потом, посмотри ещё OnCustomDrawItem, оно с примером...


 
Ann ©   (2003-05-19 11:58) [4]

Пишу так, а все красным цветом рисует
with DBSTreeView1.Canvas do
begin
if (dm.FDS_gr_kont["delete_pr"]=True) then
begin
Font.Color := clRed;
end
else
if Focused then Font.Color := clWhite;
Font.Color := clBlack;
end;
Почему не могу понять :(


 
Skier ©   (2003-05-19 12:02) [5]

пример по TCustomTreeView.OnCustomDrawItem смотрела ?


 
Ann ©   (2003-05-19 12:07) [6]

нет, я его не нашла :(


 
Ann ©   (2003-05-19 12:08) [7]

извиняюсь, нашла :)
сейчас посмотрю. Спасибо


 
Виктор Щербаков ©   (2003-05-19 12:10) [8]


> Пишу так, а все красным цветом рисует


> Почему не могу понять :(

Очевидно потому, что логическое выражение

> (dm.FDS_gr_kont["delete_pr"]=True)

всегда принимает значение True


 
Ann ©   (2003-05-19 12:14) [9]

нет... там false есть


 
VMcL ©   (2003-05-19 14:13) [10]

>Ann © (19.05.03 11:58)

Сравнивать булево выражение с булевой константой - это новая шутка для Delphi? :))


 
Ann ©   (2003-05-19 14:34) [11]


> VMcL

не пойму что тебя смущает? проверяется значение поля. в чем проблема то?


 
evvcom ©   (2003-05-19 14:39) [12]


> if (dm.FDS_gr_kont["delete_pr"]=True) then

Достаточно написать
if dm.FDS_gr_kont["delete_pr"] then ...


 
Ann ©   (2003-05-19 14:48) [13]

да ладно вам издеваться то :( я же помощь просила


 
Roma ©   (2003-05-19 15:30) [14]

> Ann © (19.05.03 11:08)

Чисто просто пример:

procedure TForm1.TreeViewCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if {нужно красным} then
Sender.Canvas.Font.Color := clRed
else
Sender.Canvas.Font.Color := clBlack;
with Node.DisplayRect(True) do
Sender.Canvas.TextOut(Left, Top, Node.Text);
end;


 
Roma ©   (2003-05-19 15:35) [15]

Да, там бы еще надо проверять cdsSelected in State...


 
evvcom ©   (2003-05-19 15:42) [16]


> Ann © (19.05.03 14:48)
> да ладно вам издеваться то :( я же помощь просила

Я не издевался. До этого был еще вопрос

> Ann © (19.05.03 14:34)
>
> > VMcL
>
> не пойму что тебя смущает? проверяется значение поля. в
> чем проблема то?

Вот на него и было разъяснение. Просто действительно глаз режет код if BoolValue = True then ...


 
_Narayan_   (2003-05-19 21:04) [17]

2 Roma
Ты сам-то свой пример пробовал ?


 
Song ©   (2003-05-19 21:13) [18]

Надо сначала FillRect() сделать, чтобы очистить рабочую область. А потом - хоть чёрта с рогами.


 
Roma ©   (2003-05-20 10:44) [19]

Удалено модератором
Примечание: Если "Ну да забыл" не стоит пальцы гнуть


 
Ann ©   (2003-05-20 13:08) [20]


> Roma

да вопрос-то казалось бы простой. Пишу так же как ты написал, но проблема вот в чем.
Когда переходишь на тот элемент где выполняется условие, помечается и тот на который перешла и тот с которого перешла.
Может подскажешь как с этим бороться?
Заранее благодарна



 
Ann ©   (2003-05-20 14:02) [21]

help!!! :(


 
Roma ©   (2003-05-20 14:33) [22]

Если можно, приведи код своего обработчика OnCustomDrawItem...


 
Ann ©   (2003-05-20 14:37) [23]

procedure TFr_gr_kont.DBSTreeView1CustomDrawItem(Sender: TCustomTreeView;
Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
Вот:


begin
if dm.FDS_gr_kont["delete_pr"] then
if Fr_gr_kont.DBSTreeView1.Selected.Text=dm.FDS_gr_kont["name"] then
Sender.Canvas.Font.Color := clRed
else
if not (cdsSelected in State) then Sender.Canvas.Font.Color := clBlack
else Sender.Canvas.Font.Color := clWhite;

end;


вроде ж все правильно, но почему "раскрашивает парами"..


 
Skier ©   (2003-05-20 14:48) [24]

А если так : ?

begin

if dm.FDS_gr_kont["delete_pr"] then begin
if Fr_gr_kont.DBSTreeView1.Selected.Text=dm.FDS_gr_kont["name"] then
Sender.Canvas.Font.Color := clRed;
end //if
else begin
if cdsSelected in State then Sender.Canvas.Font.Color := clWhite
else Sender.Canvas.Font.Color := clBlack;
end; //else

end;



 
Ann ©   (2003-05-20 14:51) [25]


> Skier

неа... все равно помечает красным и тот с которого перешла (без признака)


 
Skier ©   (2003-05-20 14:53) [26]

begin

if dm.FDS_gr_kont["delete_pr"] then begin
if Fr_gr_kont.DBSTreeView1. Node.Text=dm.FDS_gr_kont["name"] then
Sender.Canvas.Font.Color := clRed;
end //if
else begin
if cdsSelected in State then Sender.Canvas.Font.Color := clWhite
else Sender.Canvas.Font.Color := clBlack;
end; //else

end;


 
Ann ©   (2003-05-20 14:56) [27]

а он на Node ругается.


 
Skier ©   (2003-05-20 14:59) [28]

>а он на Node ругается.
Извини, ошибся.

1)

begin

if dm.FDS_gr_kont["delete_pr"] then begin
if Node.Text=dm.FDS_gr_kont["name"] then
Sender.Canvas.Font.Color := clRed;
end //if
else begin
if cdsSelected in State then Sender.Canvas.Font.Color := clWhite
else Sender.Canvas.Font.Color := clBlack;
end; //else

end;






 
Ann ©   (2003-05-20 15:09) [29]

спасибо! :) а то давно мучалась.. никак не получалось..
вот только получается что помечаются записи красным цветом при подсветке, а как сделать чтобы нужные записи даже не ввыбранном состоянии были помечены?


 
Skier ©   (2003-05-20 15:21) [30]

>Ann © (20.05.03 15:09)

> , а как сделать чтобы нужные записи даже не ввыбранном состоянии
> были помечены?

Что значит "нужные" и что значит "помечены" ?


 
Ann ©   (2003-05-20 15:27) [31]

ну в данный момент в красный цвет окрашивается запись тогда, когда на ней стоит курсор, как только перемещаем курсор на другую запись пометки красным цветом почему-то уже нет.
"нужные" записи, это я так просто обозвала те записи у который delete_pr=true, их я помечаю красным цветом, а остальные черным.
Так вот не получается то, чтобы при активизации формы записи были либо красного цвета (если delete_pr= true) либо черного (delete_pr=false) и не зависили от того, стоит на них курсор или нет.


 
Skier ©   (2003-05-20 15:30) [32]

>Ann © (20.05.03 15:27)
А не "краснеют" записи из-за того что не выполняются
условия
или if dm.FDS_gr_kont["delete_pr"] then, или
if Node.Text=dm.FDS_gr_kont["name"] then


 
Ann ©   (2003-05-20 15:32) [33]

а почему "краснеют" на момент подсветки курсор? почему без нее теряют красноту? :)


 
Skier ©   (2003-05-20 15:34) [34]

>Ann © (20.05.03 15:32)
А условия красноты при при активизации формы выполняются ? Проверяла ?


 
Ann ©   (2003-05-20 15:41) [35]

а процедура CustomDrawItem в момент "прорисовки" элементов дерева разве не срабатывает?
И еще вопрос, почему, при перемещении курсора не сохраняется красный цвет у записи которая была только что активна и имела красный цвет?


 
Ann ©   (2003-05-20 15:48) [36]

:) и спасибо тебе большое за то что помогаешь:)


 
Skier ©   (2003-05-20 15:57) [37]

>Ann © (20.05.03 15:41)
срабатывает...но видимо не выполняются условия красноты (у тебя их 2). Тебе нужно это проверить ! Прогони в отладчике...что будет
в dm.FDS_gr_kont["delete_pr"] и в dm.FDS_gr_kont["name"] ?


 
Ann ©   (2003-05-20 16:03) [38]

прогнала в отладчике.. он гоняет там только первую запись.
Добавила при активизации формы
dm.FDS_gr_kont.first;
while not (dm.FDS_gr_kont.eof) do begin
dm.FDS_gr_kont.next;
end;
после этого стал помечать только одну последнюю запись. А помечена красным цветом должна быть не одна..


 
Ann ©   (2003-05-20 16:10) [39]


> dm.FDS_gr_kont.first;
> while not (dm.FDS_gr_kont.eof) do begin
> dm.FDS_gr_kont.next;
> end;

это не помогло, потому что он сначала прогнал датасет, а уж потом зашел в CustomDrawItem


 
Ann ©   (2003-05-20 16:12) [40]

ура! получилось
написала так
dm.FDS_gr_kont.first;
while not (dm.FDS_gr_kont.eof) do begin
if dm.FDS_gr_kont["delete_pr"] then begin
if Node.Text=dm.FDS_gr_kont["name"] then
Sender.Canvas.Font.Color := clRed;
end //if
else
begin
if cdsSelected in State then Sender.Canvas.Font.Color := clWhite
else Sender.Canvas.Font.Color := clBlack;
end; //else }
dm.FDS_gr_kont.next;
end;

И все работает!!
Спасибо тебе ОГРОМНОЕ, за то что помогал мне :)


 
Skier ©   (2003-05-20 16:15) [41]

>Ann © (20.05.03 16:12)
Ну ? видишь ? Не выполнялись условия твоей красноты по сему и
не работала...:))


 
Roma ©   (2003-05-20 16:16) [42]

Как-то все уже запуталось... Давайте подойдем к вопросу академически... ;)

Есть условие, назовем его RedCondition, при выполнении которого текст ноды должен выводится красным шрифтом. Обработчик вызывается всегда, когда надо (и при активизации, и при экспанде, и при селекте, и т.д.).

Тогда:

var
RedCondition: Boolean;
begin
RedCondition := {подставить, что надо; одно или несколько булевых выражений, или отдельная функция... не используя Selected!};

if RedCondition then
Sender.Canvas.Font.Color := clRed // выводить красным независимо от выделения
else
if cdsSelected in State then // нода выделена?
Sender.Canvas.Font.Color := clWhite // выводить белым
else
Sender.Canvas.Font.Color := clBlack; // выводить черным

with Node.DisplayRect(True) do
Sender.Canvas.TextOut(Left, Top, Node.Text);
end;


Это должно работать, залягай меня слон... ;)

PS: Пока писал, увидел, что уже все работает... Тогда есть правило: работает - не трогай... ;) Похоже, все было именно в функции вычисления условия "красноты"...


 
Ann ©   (2003-05-20 16:21) [43]


> Roma

PS у тебя замечательный - работает не трогай :)

нет, правда спасибо большое.. я бы сама еще столько долбилась бы с этой краснотой,тем более когда делаешь что-то долго и упорно, голова варит хуже и делаешь ошибки всякие глупые. :)



Страницы: 1 2 вся ветка

Текущий архив: 2003.06.02;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.021 c
1-2953
Vulko
2003-05-15 19:12
2003.06.02
Как создать папку...


14-3047
DDDeN
2003-05-13 13:51
2003.06.02
DelphiX для Delphi 6


14-3067
Laxer
2003-05-16 11:08
2003.06.02
Сумма столбца DBGrid


1-2867
NewN
2003-05-22 10:18
2003.06.02
Чтение, просмотр файла, алгоритм.


1-2906
leonidus
2003-05-19 01:11
2003.06.02
Высота меню PopUp