Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > ImageList + Listview


Автор: darkmamba 26.11.2008, 21:03
Здравствуйте уважаемые форумчане. Есть в программе listview со списком(2 колонки - caption и subitem) , есть imagelist в котором допустим 2 иконки, как сделать чтоб при выполнение какого-нибуть условия загружалась допустим первая иконка из imagelist и помещалась во 2 колонку(subitem), если нельзя в субитем, то тогда подскажите можно ли в caption запихать 2 иконки подряд smile 

Автор: morpheyushka 27.11.2008, 11:55
В SubItem можно запихнуть иконку.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  LI: TListItem;
begin
  LI := ListView1.Items.Add;
  LI.Caption := 'Text';
  LI.ImageIndex := 0;
  LI.SubItems.Add('SubText');
  LI.SubItemImages[0] := 1;
end;



Этот код добавит в ListView итем и сабитем и добавит в каждую колонку по иконке!

Если хочешь выводить или не выводить иконки, или разные выводить в зависимости от условия - используй методы у ListView OnCustomDrawItem и OnCustomDrawSubItem. При определенных условиях выставляй нужный индекс иконки в  (ставь -1 что бы иконка не отображалась). 

ЗЫ Если что то не понятно - спрашивай... 

Автор: pseud 27.11.2008, 12:00
тебе нужны иконки для итемов листа или для заголовков колонок?

Автор: darkmamba 28.11.2008, 12:50
morpheyushka, все доходчиво и понятно, спасибо
pseud, нужно было для итемов листа, но не откажусь от примера для заголвков  smile 

Автор: pseud 28.11.2008, 16:10
©Delphi World 6.0

Иногда бывает полезно в заголовке колонки показывать стрелочку, чтобы информировать пользователя, по какой колонке идёт сортировка. Добавьте следующий код в форму: 
Код

procedure TForm1.SetColumnImage( List: TListView; Column,
Image: Integer; ShowImage: Boolean);
var
  Align, hHeader: integer;
  HD: HD_ITEM;
begin
  hHeader := SendMessage(List.Handle, LVM_GETHEADER, 0, 0);
  with HD do
  begin
    case List.Columns[Column].Alignment of
      taLeftJustify:
        Align := HDF_LEFT;
      taCenter:
        Align := HDF_CENTER;
      taRightJustify:
        Align := HDF_RIGHT;
      else
        Align := HDF_LEFT;
    end;

    mask := HDI_IMAGE or HDI_FORMAT;

    pszText := PChar(List.Columns[Column].Caption);

    if ShowImage then
      fmt := HDF_STRING or HDF_IMAGE or HDF_BITMAP_ON_RIGHT
    else
      fmt := HDF_STRING or Align;

    iImage := Image;
  end;
  SendMessage(hHeader, HDM_SETITEM, Column, Integer(@HD));
end;

Картинки берутся из списка SmallImages. Вам надо будет вызвать эту функцию для каждой колонки и установить ShowImage в TRUE для той колонки, которую Вы будете сортировать. Сделать это можно в функции OnColumnClick(): 
Код

procedure TForm1.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
var
  i: integer;
begin
  // Это Ваша собственная функция сортировки
  CustomSort( @CustomSortProc, Column.index );
  // Этот цикл отображает иконку в выбранной колонке.
  for i := 0 to ListView1.Columns.Count-1 do
    SetColumnImage( ListView1, i, 0, i = Column.index );
end;

Проблема: 
Изменение размера колонки генерирует сообщение WM_PAINT, которое стирает картинку, поэтому Вам прийдётся переопределить WM_PAINT и вызвать SetColumnImage снова.

Использовался компонент TApplicationEvents в delphi 5. 



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)