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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2014, 22:50   #1
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию TListBox и Canvas

Здравствуйте, при нажатии на итем в листбоксе он заполняется цветом, при нажатии на другой итем на первом всё равно остаётся выделение, как мне его убрать? Подскажите пожалуйста.



Заполняется так (перед этим загружается картинка в фон листбокса):
Код:
procedure TListbox.CNDrawItem(var Message: TWMDrawItem);
var
 State: TOwnerDrawState;
begin
  with Message.DrawItemStruct^ do
  begin
 //.... 
      if (odSelected in State) then
      begin
        Brush.Color := $00FFD2A6;
        canvas.FillRect(Rect(ItemHeight,itemid*itemheight,width,itemid*itemheight+itemheight));
      end;
//...
end;
Думал копировать кусочек картинки поверх старого выделения но по моему это бред, при Resize формы и листбокса выделение пропадает, но это не выход.
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 07.10.2014, 02:05   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,894
По умолчанию

Цитата:
Сообщение от NEoMASTERR Посмотреть сообщение
Здравствуйте, при нажатии на итем в листбоксе он заполняется цветом, при нажатии на другой итем на первом всё равно остаётся выделение, как мне его убрать? Подскажите пожалуйста.
Если выделенным всегда должен быть только один (ну прям горец какой-то), то вспомни если забыл или узнай если не знал, что у конструкции if...then есть еще необязательный блок else.
northener вне форума Ответить с цитированием
Старый 07.10.2014, 05:45   #3
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Если выделенным всегда должен быть только один (ну прям горец какой-то), то вспомни если забыл или узнай если не знал, что у конструкции if...then есть еще необязательный блок else.
Попросил не показать ваш уровень мастерства острить, а помочь.. Попробуй с else и покажи рабочий код

Программно итем не выделен, выделение остаётся потому что canvas не очищает за собой. Оно только визуальное. .refresh и .repaint в onClick не подходят

Код:
procedure TForm3.lst1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  InvalidateRect(lst1.Handle,nil,true);                // Так всё мерцает :(
end;
Здравствуйте

Последний раз редактировалось NEoMASTERR; 07.10.2014 в 05:55.
NEoMASTERR вне форума Ответить с цитированием
Старый 07.10.2014, 09:41   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Цитата:
выделение остаётся потому что canvas не очищает за собой.
FillRect это не рисование, а очистка поля перед рисованием.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.10.2014, 16:34   #5
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
FillRect это не рисование, а очистка поля перед рисованием.
Странное очищение если оно рисует (fill (анг) - заливка)...
Будем считать переделал на:
Код:
        Canvas.Rectangle(Rect(ItemHeight,itemid*itemheight,width,itemid*itemheight+itemheight));
        //canvas.FillRect(Rect(ItemHeight,itemid*itemheight,width,itemid*itemheight+itemheight));
Ничего не изменилось результат тот же, еще предложения?
Здравствуйте

Последний раз редактировалось NEoMASTERR; 07.10.2014 в 16:43.
NEoMASTERR вне форума Ответить с цитированием
Старый 07.10.2014, 16:43   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от NEoMASTERR Посмотреть сообщение
Странное очищение если оно рисует (fill (анг) - заливка)...
очищение есть рисование фона.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.10.2014, 17:10   #7
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
FillRect это не рисование
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
очищение есть рисование фона.


Помогите мне выделить (залить, зарисовать, закрасить) выделенный итем и снять выделение со старого без изменения в размере формы (пока только так сбрасывается отрисованное ранее)

Вот это тоже как вариант, но это извращение
Код:
procedure TListbox.WMMOUSEWHEEL(var Message: TWMMOUSEWHEEL);
begin
 if GetFocus = Handle then
   begin
     LockWindowUpdate(Handle);
     inherited;
     LockWindowUpdate(0);
     InvalidateRect(Handle, nil, true);
   end
 else
   inherited;
end;

procedure TForm3.lst1Click(Sender: TObject);
begin
  SendMessage(lst1.Handle,WM_MOUSEWHEEL,0,0);
end;
Здравствуйте

Последний раз редактировалось NEoMASTERR; 07.10.2014 в 17:14.
NEoMASTERR вне форума Ответить с цитированием
Старый 07.10.2014, 17:27   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Снять выделение = нарисовать фон невыделенным цветом (та самая ветка else)
и на этом невыделенном фоне нарисовать все прочее.

Все InvalidateRect как раз и делают ту самую заливку невыделенным цветом.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.10.2014, 17:33   #9
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Всё по старому, заливка остаётся
Код:
      
procedure TListbox.CNDrawItem(var Message: TWMDrawItem);
///...
if (odSelected in State) then
      begin
        Canvas.Font.Color := clred;
        Brush.Color := $00FFFF00;
       // Canvas.DrawFocusRect(rcitem);
        //Canvas.Rectangle(Rect(ItemHeight,itemid*itemheight,width,itemid*itemheight+itemheight));
        canvas.FillRect(Rect(ItemHeight,itemid*itemheight,width,itemid*itemheight+itemheight));
      end
      else
      begin
        InvalidateRect(hDC,@rcitem,true);
        //Brush.Style:=bsClear;
      end;
    end;
Неужели никто не сталкивался?
Здравствуйте

Последний раз редактировалось NEoMASTERR; 08.10.2014 в 05:46.
NEoMASTERR вне форума Ответить с цитированием
Старый 08.10.2014, 10:27   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Цитата:
InvalidateRect(hDC,@rcitem,true);
Это что? рисование фона?
Рисование-это использование тех или функций Canvas.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TListBox hatsub Работа с сетью в Delphi 4 13.03.2011 13:40
TListBox Dr.Badnezz Компоненты Delphi 3 03.02.2009 23:15
Вопрос по TListBox Rifler Помощь студентам 2 17.11.2008 22:01
Вопрос с TListBox Манжосов Денис :) Помощь студентам 11 06.04.2008 23:26
Помощь с TListBox Манжосов Денис :) Помощь студентам 12 30.03.2008 13:46