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

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

В ListView строки разного цвета.... [D7, XP]


serko ©   (2007-04-11 23:50:00) 

Привет всем!
Ребят подскажите как в ListView сделать так чтобы можна было добавлять строки разного цвета. я понимаю что все делается в OnDrawItem... но у меня чето не получается!
Можна примерчик состряпать? Плиз....


{RASkov}   (2007-04-14 23:33:00) [1]

Т.е. даже лучше так переделать

procedure TForm1.ListView1DrawItem(Sender: TCustomListView;
 Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var N: Integer;
begin
with Sender.Canvas do begin
 Font.Color:=RGB(Random(255), Random(255), Random(255));
 TextOut(Rect.Left, Rect.Top, Item.Caption);
 for N:=0 to Item.SubItems.Count-1do begin
  if N=ListView1.Columns.Count-1 then Break;
  Rect.Left:=Rect.Left + ListView1.Columns[N].Width;
  Rect.Right:=Rect.Left + ListView1.Columns[N+1].Width;
  TextOut(Rect.Left, Rect.Top, Item.SubItems[N]);
 end;
end;
end;

Вообщем все это не красиво и только для примера, пораскинь мозгами, только не в прямом смысле :)


{RASkov}   (2007-04-14 23:22:00) [2]

> [8] serko ©   (14.04.07 23:14)

Ну наверное здесь эта собака зарыта:
if N<Item.SubItems.Count then TextOut(Rect.Left, Rect.Top, Item.SubItems[N-1]);
Вообщем найди где у тебя чего-то нехватает....


serko   (2007-04-14 23:14:00) [3]

Ага!
Выскакивает ошибка List index out of bounds (0)

Вот с этим и мучусь... ошибка и все...


{RASkov}   (2007-04-14 22:00:00) [4]

> [5] serko ©   (14.04.07 21:11)

Ну примерно так:

procedure TForm1.ListView1DrawItem(Sender: TCustomListView;
 Item: TListItem; Rect: TRect; State: TOwnerDrawState);
var N: Integer;
begin
 with Sender.Canvas do begin
  Font.Color:=RGB(Random(255), Random(255), Random(255));
  TextOut(Rect.Left, Rect.Top, Item.Caption);
  for N:=1 to ListView1.Columns.Count-1 do begin
   Rect.Left:=Rect.Left + ListView1.Columns[N-1].Width;
   Rect.Right:=Rect.Left + ListView1.Columns[N].Width;
   TextOut(Rect.Left, Rect.Top, Item.SubItems[N-1]);
  end;
 end;
end;


serko   (2007-04-14 21:24:00) [5]

если писать так:
with Sender.Canvas do begin
      Font.Color:=RGB(Random(255), Random(255), Random(255));
      TextOut(Rect.Left, Rect.Top, Item.Caption);
      TextOut(Rect.Left, Rect.Top, Item.SubItems.CommaText);
    end;
То добавляются две записи в СТОЛБИК.
Как то надо различать что сейчас рисуется Item или SubItem... но как?


serko   (2007-04-14 21:11:00) [6]


> TextOut(Rect.Left, Rect.Top, Item.Caption);

А для subitem как?


{RASkov}   (2007-04-12 00:40:00) [7]

> [0] serko ©   (11.04.07 23:50)

procedure TForm1.FormCreate(Sender: TObject);
var N: Integer;
begin
 ListView1.Columns.Add;
 ListView1.OwnerDraw:=True;
 ListView1.ViewStyle:=vsReport;
 ListView1.OnDrawItem:=ListView1DrawItem;
 for N:=0 to 10 do ListView1.AddItem('Строка №'+IntToStr(N), nil);
end;

procedure TForm1.ListView1DrawItem(Sender: TCustomListView;
 Item: TListItem; Rect: TRect; State: TOwnerDrawState);
begin
with Sender.Canvas do begin
 Font.Color:=RGB(Random(255), Random(255), Random(255));
 TextOut(Rect.Left, Rect.Top, Item.Caption);
end;
end;


MikePetrichenko   (2007-04-12 00:21:00) [8]

А Вы попробуйте, а вось поможет. Хотя, если чукча только писатель...


serko   (2007-04-12 00:19:00) [9]

Бу-га-га...
Вопрос был не о том как найти OnDrawItem по F1.


MikePetrichenko   (2007-04-12 00:10:00) [10]

Легко. Открываем Delphi, кидаем на форму TListView выделяем его (если он по какой-то причине не выделен) и нажимаем F1. В появившемся окне кликаем на Events потом на OnDrawItem - читаем.
Если просветление не наступило, то в окне, после F1 которое, выбираем Properties там ищем OwnerDraw и опять читаем.
Повторять до полного просветления.
Велкам....


Наверх

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