Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.01 c
3-2776
paxer
2003-05-13 17:20
2003.06.02
query


3-2771
ArtemB
2003-05-13 07:01
2003.06.02
Нумерация записей


1-2994
Пубертанец
2003-05-21 16:28
2003.06.02
Как в OnShow формы уничтожать ее при определенных условиях?


14-3168
copyr25
2003-05-09 10:41
2003.06.02
---|Ветка была без названия|---


3-2794
moore
2003-05-14 15:17
2003.06.02
пример БД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский