Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2012, 22:16   #1
Karych
Пользователь
 
Регистрация: 17.12.2011
Сообщений: 49
Восклицание listbox - изменение цвета выделеной строки(drawitem)

нужно изменить цвет выделяемой строки в листбоксе

пишим так:
Код:
procedure TMainF.sListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
  var
  z,i:integer;

  begin
  i:=strtoint(sLabel3.Caption);
  if i<0 then exit else
  begin
  with slistbox1 do begin
     if selected[i]=true then   begin
       sListBox1.Canvas.Font.Color := clWhite;
       sListBox1.Canvas.Brush.Color := clBlack;
       Canvas.FillRect(Rect);
       Canvas.TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[index]);
     end;
     end;

     for z:=0 to sListBox1.Items.Count-1 do
         if sListBox1.selected[z]=false then
          begin
       sListBox1.Canvas.Font.Color := clBlack;
       sListBox1.Canvas.Brush.Color := clWhite;
       sListBox1.Canvas.FillRect(Rect);
       sListBox1.Canvas.TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[index]);
       end;
end;
end;
код работает полность не коректно - при открытии список белый, букв не видно. при выборе записи в листбоксе, шрифт меняется на черный - но посути при выборе следующей строки остается не изменым(те список прорисуется если прогнать выбор по всему списку)

как быть? что у мня не правильно-с рисованием ваще не дружу...
Karych вне форума Ответить с цитированием
Старый 07.01.2012, 22:24   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Анализируйте State. Не понял причем здесь sLabel3 и зачем цикл по всем строкам бокса. Событие вызывается при прорисовке каждой строки бокса и не один раз
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.01.2012, 23:39   #3
Karych
Пользователь
 
Регистрация: 17.12.2011
Сообщений: 49
По умолчанию

sLabel3 хранит у меня выбраную строку(проста там заморочка с ЛистБоксом-нельзя было просто получить итем индекс)

как понять state?

Код:
....
i:=strtoint(sLabel3.Caption);
  sListBox1.Canvas.Font.Color := clBlack;
  sListBox1.Canvas.Brush.Color := clWhite;
  sListBox1.Canvas.FillRect(Rect);
  sListBox1.Canvas.TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[index]);
  with slistbox1 do begin
  if (i>-1) and (selected[i]=true) then
  begin
  sListBox1.Canvas.Font.Color := clWhite;
  sListBox1.Canvas.Brush.Color := clBlack;
  sListBox1.Canvas.FillRect(Rect);
  sListBox1.Canvas.TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[index]);
  end;
  end;
....
я так переделал, получилось что список сразу прорисовывается, но выбраная строка так и останется черной если выберешь другую(выбрав поочередно все строки, список становиться весь черный) как заставить заново перерисовываться после смены выбраной строки?
Karych вне форума Ответить с цитированием
Старый 07.01.2012, 23:50   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

odSelected in State означает, что это выделенная строка. Именно для нее и делать фон и цвет отличным от основного фона и цвета. И sLabel3 не нужно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2012, 00:11   #5
Karych
Пользователь
 
Регистрация: 17.12.2011
Сообщений: 49
По умолчанию

Вы имеете ввиду
Код:
if odSelected in State then
begin
  Canvas.Font.Color := clWhite;
  Canvas.Brush.Color := clBlack;
  Canvas.FillRect(Rect);
  Canvas.TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[index]);
end;
Так листбокс нечего не отображает и не выбирает...
Ксати есть маленький ньюанс - Листбокс не получает фокуса!
Karych вне форума Ответить с цитированием
Старый 08.01.2012, 00:52   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Листбокс не получает фокуса
Не важно, он все равно прорисовывается. Вы хоть гляньте на стандартный листбокс, какими цветами прорисовываются обычные его строки и выделенная строка, когда фокус на нем. И прорисовывать нужно КАЖДУЮ строку, а не только с odSelected in State. Для этой строки еще можно манипулировать цветом в зависимости от наличия фокуса ввода на контроле
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2012, 00:56   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

http://programmersforum.ru/showthrea...hlight=ListBox
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.01.2012, 12:26   #8
Karych
Пользователь
 
Регистрация: 17.12.2011
Сообщений: 49
Радость

спасибо за разъяснения все заработало, только почемуто не могу вам в репу благодарность поставить...
Karych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение цвета шрифта надписи в ListBox Lokos Общие вопросы Delphi 2 20.02.2013 22:58
Координаты выделеной строки ListBox maloun Общие вопросы Delphi 3 09.01.2011 19:35
различные цвета в ListBox-e Romarius Помощь студентам 4 25.12.2010 00:24
Изменение цвета XFR Microsoft Office Excel 6 28.11.2010 13:32
Строки разного цвета в ListBox Viteef Компоненты Delphi 1 09.05.2007 20:19