Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с Draw в ListView, Ошибка :( 
:(
    Опции темы
TechBee
  Дата 19.8.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



Доброго времени суток...

Итак, решил подправить выделение в ListView, уж очень меня стандартное не устраивает. Написал код. вроде работает, но когда подергал скрол у компонента - вылетела ошибка и сразу завершилось приложение. Понять не могу в чем проблема... Ниже код. 
smile

Код

procedure TForm1.ListView1DrawItem(Sender: TCustomListView;
  Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var
 Ico:ticon;
 LRect:TRect;
begin
 LRect.Left:=Rect.Left+18;
 LRect.Top:=Rect.Top;
 LRect.Right:=Rect.Right-2;
 LRect.Bottom:=Rect.Bottom;
 ico:=ticon.Create;
 self.ImageList2.GetIcon(item.ImageIndex,ico);
 sender.Canvas.FillRect(Rect);
 sender.Canvas.Draw(1,Rect.Top,ico);
 If odFocused in State then
 begin
  sender.Canvas.Brush.Color:=clhighlight;
  sender.Canvas.Font.Color:=clwhite;
  sender.Canvas.FillRect(LRect);
  sender.Canvas.DrawFocusRect(LRect);
 end
 else
 begin
  sender.Canvas.Font.Color:=clblack;
  sender.Canvas.FillRect(LRect);
 end;
 sender.Canvas.TextOut(20,Rect.Top+1,Item.Caption);
 sender.Canvas.TextOut(Rect.Right-30,Rect.Top+1,Item.SubItems.Strings[0]);
end;

PM MAIL   Вверх
MetalFan
Дата 19.8.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(TechBee @  19.8.2007,  09:16 Найти цитируемый пост)
Item.SubItems.Strings[0]

а ты уверен, что у тебя есть хотябы один SubItem???


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Snowy
Дата 19.8.2007, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Да нет. Код рабочий, если не учитывать неоптимальность и утечку памяти.
Может у тебя у некоторых элементов нет субитемов или ImageIndex не прописан?

Добавлено через 1 минуту и 2 секунды
ЗЫ. Ошибку тоже полезно приводить в описании проблемы...
PM MAIL   Вверх
Sunvas
Дата 19.8.2007, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Приложи весь проект.
Ошибку скорее всего вызывает рисование иконки. Возможно для всех итемов ImageList-а не хватает.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
TechBee
Дата 19.8.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



К сожалению весь проект не могу выложить (в общем весит около 5 мб, Unit1 = 2800 строк).

Добавляется итем так:
Код

procedure TForm1.AddNewItem(AName, ASubName:string; AState: integer);
var
 i:integer;
 l:string;
 LI:TListItem;
begin
 l:=........................

...

(Panel1.FindComponent(l) as TListView).Items.BeginUpdate;
 for i:=0 to (Panel1.FindComponent(l) as TListView).Items.Count-1 do
 if (Panel1.FindComponent(l) as TListView).Items.Item[i].Caption=AName then
 begin
  (Panel1.FindComponent(l) as TListView).Items.Delete(i);
  break;
 end;
 LI:=(Panel1.FindComponent(l) as TListView).Items.Add;
 LI.Caption:=AName;
 LI.SubItems.Add(ASubName);
 LI.ImageIndex:=AState;

 (Panel1.FindComponent(l) as TListView).Items.EndUpdate;
 (Panel1.FindComponent(l) as TListView).CustomSort(@CustomDateSortProc, 0);
end;


Итем имеет всегда иконку и субитем[0]!
До этого (моих эксперементов с draw) все работало на отлично.

Щас попробовал поймать ошибку, дак даже не показалась - сразу приложение завершилось.
Позже еще попытаюсь.

Вот как выглядит ListView, когда скрол подергаешь:
user posted image

Может куда rapaint запихнуть надо?

Это сообщение отредактировал(а) TechBee - 19.8.2007, 16:22
PM MAIL   Вверх
MetalFan
Дата 19.8.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(TechBee @  19.8.2007,  16:22 Найти цитируемый пост)
(Panel1.FindComponent(l) as TListView)

жэсть... зачем 7!!!! раз в 20 строках кода так делать???
да и 23 и 24 строку надо бы местами поменять...



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
volvo877
Дата 19.8.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 14
Всего: 116



Цитата
Код

sender.Canvas.TextOut(20,Rect.Top+1,Item.Caption);
поменяй на
Код

sender.Canvas.TextOut(Rect.Left + 20,Rect.Top+1,Item.Caption);
Чувствуешь разницу? smile
PM MAIL   Вверх
TechBee
Дата 19.8.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 10.10.2006

Репутация: нет
Всего: нет



MetalFan

я половину кода вырезал, оставил только то что к делу относится. ;-).


volvo877

спасибо, уловил разницу. smile.


После добавления (для теста) 50 итемов - компонент тормозить жутко начинает.
Однако книжки почитаю по canvas'у.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.