Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как поступить?


BlackGrin ©   (2002-07-19 14:15:00) 

Подскажите как организовать чтото на подобе следующего: checklistbox в котором реально было из процедуры выделять записи разными цветами. И чтобы при нажатие на определеную запись она подсвечивалась определенным цветом + то что уже подсвечено не сбрасывалось. Есть ли какиенить компоненты чтобы решить такую проблему? Или как это решить с помошью cheklistbox?
Заранее спасибо!


Song   (2002-07-23 10:02:00) [1]

Изменить можно, но при следующей перерисовке он сбросится (Ваш цвет). Поэтому в вышеприведённой процедуре сделайте что-нить
With TCheckListBox(Control) Do
...

IF Index=Tag then Canvas.Brush.Color:=clGreen

....

А в тексте программы для поля Tag задавайте тот номер строки, которых хотите окрасить и будет перекрашен (возможно придётся перерисовать контрол после смены Tag для немедленной перерисовки.
А на onCreate формы поставьте Tag:=-1


BlackGrin   (2002-07-23 00:41:00) [2]

в смысле сохраняться не будет?
Мне интересно как просто из процедуры изменить допустим 4 строку на зеленый цвет


Song   (2002-07-22 09:35:00) [3]

Присвоить-то можно (TCanvas.Brush.Color), но сохраняться оно не будет, не зря же был пример с TCheckListBox.onDrawItem


BlackGrin   (2002-07-21 23:00:00) [4]

ребят спасибо! помогли! но есть еще один вопрос. Всё конечно хорошо но как просто из левой процедуры назначит определеному itom`у подсветку другого света? Просто Рефрешить каждые 2 секунды весь листбокс не очень... и если скролинг будет то он будет при рефреше сбиваться...


Song   (2002-07-19 16:07:00) [5]

То что нужно вынести проверку компонента odSelected в множестве State за пределы With это частность. Я просто хотел Вам показать как опимизировать код для улучшения удобочитаемости.


Skier   (2002-07-19 15:57:00) [6]

>Song
Твой код не будет работать !


Song   (2002-07-19 15:51:00) [7]

2Skier © (19.07.02 15:32)
Желательно не использовать прямые цвета, а использовать предопределённые константы (ClCaptionText,ClWindowText,ClHihgliht и т.д.)
Ваш отрывок был бы намного красивей, если бы Вы использовали With:

procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
With TCheckListBox(Control),TCheckListBox(Control).Canvas Do
Begin
IF (odSelected in State) then Brush.Color:=clNavy else
IF Index=0 then Brush.Color:=clGreen else Brush.Color:= ClYellow;
FillRect(Rect);
TextOut(Rect.Left+2,Rect.Top+2,Items[Index]);
End;
end;

И, в третьих, никогда не пишите готового варианта, пусть сначала человек попробует сам дойти, попробует сделать сам, а далее если у него не получится, Вы всегда ему успеете написать. Так намного полезней. С готовым вариантом программист программиста из себя не сделает.


Skier   (2002-07-19 15:32:00) [8]

>BlackGrin

cheklistbox.Style := ldOwnerDrawFixed;

или

cheklistbox.Style := ldOwnerDrawVariable;

В TCheckListBox.onDrawItem пишешь примерно так :


procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
if (odSelected in State) then
TCheckListBox(Control).Canvas.Brush.Color := clNavy
else begin
if Index = 0 then
TCheckListBox(Control).Canvas.Brush.Color := clGreen
else
TCheckListBox(Control).Canvas.Brush.Color := clYellow;
end; //else
TCheckListBox(Control).Canvas.FillRect(Rect);
TCheckListBox(Control).Canvas.TextOut(Rect.Left, Rect.Top,
TCheckListBox(Control).Items[Index]);
end;


Song   (2002-07-19 15:12:00) [9]

Ok, тогда нужно понятно, что Вы имеете ввиду под словом "подсветка". Это выделение итема (фиолетовый цвет) ?


BlackGrin   (2002-07-19 15:09:00) [10]

Это понятноно какой параментр отвечает за цвет подсветки?


Song   (2002-07-19 14:30:00) [11]

В ручную на событии TCheckListBox.onDrawItem


Наверх

Титульная страница Поиск, карта сайта Написать письмо