Форум: "Основная";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
ВнизКак поступить? Найти похожие ветки
← →
BlackGrin (2002-07-19 14:15) [0]Подскажите как организовать чтото на подобе следующего: checklistbox в котором реально было из процедуры выделять записи разными цветами. И чтобы при нажатие на определеную запись она подсвечивалась определенным цветом + то что уже подсвечено не сбрасывалось. Есть ли какиенить компоненты чтобы решить такую проблему? Или как это решить с помошью cheklistbox?
Заранее спасибо!
← →
Song (2002-07-19 14:30) [1]В ручную на событии TCheckListBox.onDrawItem
← →
BlackGrin (2002-07-19 15:09) [2]Это понятноно какой параментр отвечает за цвет подсветки?
← →
Song (2002-07-19 15:12) [3]Ok, тогда нужно понятно, что Вы имеете ввиду под словом "подсветка". Это выделение итема (фиолетовый цвет) ?
← →
Skier (2002-07-19 15:32) [4]>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:51) [5]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:57) [6]>Song
Твой код не будет работать !
← →
Song (2002-07-19 16:07) [7]То что нужно вынести проверку компонента odSelected в множестве State за пределы With это частность. Я просто хотел Вам показать как опимизировать код для улучшения удобочитаемости.
← →
BlackGrin (2002-07-21 23:00) [8]ребят спасибо! помогли! но есть еще один вопрос. Всё конечно хорошо но как просто из левой процедуры назначит определеному itom`у подсветку другого света? Просто Рефрешить каждые 2 секунды весь листбокс не очень... и если скролинг будет то он будет при рефреше сбиваться...
← →
Song (2002-07-22 09:35) [9]Присвоить-то можно (TCanvas.Brush.Color), но сохраняться оно не будет, не зря же был пример с TCheckListBox.onDrawItem
← →
BlackGrin (2002-07-23 00:41) [10]в смысле сохраняться не будет?
Мне интересно как просто из процедуры изменить допустим 4 строку на зеленый цвет
← →
Song (2002-07-23 10:02) [11]Изменить можно, но при следующей перерисовке он сбросится (Ваш цвет). Поэтому в вышеприведённой процедуре сделайте что-нить
With TCheckListBox(Control) Do
...
IF Index=Tag then Canvas.Brush.Color:=clGreen
....
А в тексте программы для поля Tag задавайте тот номер строки, которых хотите окрасить и будет перекрашен (возможно придётся перерисовать контрол после смены Tag для немедленной перерисовки.
А на onCreate формы поставьте Tag:=-1
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c