Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

TListView + MultiLine ???   Найти похожие ветки 

 
tytus   (2008-08-12 12:11) [0]

Доброго дня мастера.
Вот нужно в компоненте ListView выводить в строке несколько линий.
Но у него нету события OnMeasureItem как TListBox... к примеру.
Подскажите в какую сторону копать...


 
Rouse_ ©   (2008-08-12 12:44) [1]

Пример выставления стиля Tile с многострочностью.

На форму размещаешь ListView, у него создаешь 3 колонки, можно еще положить ImageList с размерами изображений 48 на 48 - для красоты но это не главное. Не забываешь добавить в приложение манифест.
Вписываешь такой код:

uses
 CommCtrl;

type
 TLVGROUP = record
   cbSize: UINT;
   mask: UINT;
   pszHeader: LPWSTR;
   cchHeader: Integer;
   pszFooter: LPWSTR;
   cchFooter: Integer;
   iGroupIdL: Integer;
   stateMask: UINT;
   state: UINT;
   uAlign: UINT;
 end;

 tagLVITEMA = packed record
   mask: UINT;
   iItem: Integer;
   iSubItem: Integer;
   state: UINT;
   stateMask: UINT;
   pszText: PAnsiChar;
   cchTextMax: Integer;
   iImage: Integer;
   lParam: lParam;
   iIndent: Integer;
   iGroupId: Integer;
   cColumns: UINT;
   puColumns: PUINT;
 end;
 TLVITEMA = tagLVITEMA;

 tagLVTILEVIEWINFO = packed record
   cbSize: UINT;
   dwMask: DWORD;
   dwFlags: DWORD;
   sizeTile: SIZE;
   cLines: Integer;
   rcLabelMargin: TRect;
 end;
 TLVTILEVIEWINFO = tagLVTILEVIEWINFO;

 tagLVTILEINFO = packed record
   cbSize: UINT;
   iItem: Integer;
   cColumns: UINT;
   puColumns: PUINT;
//    piColFmt: PInteger; // if _WIN32_WINNT >= 0x0600
 end;
 LVTILEINFO = tagLVTILEINFO;

const
 LVTVIM_TILESIZE       = $00000001;
 LVTVIM_COLUMNS        = $00000002;
 LVTVIM_LABELMARGIN    = $00000004;

 LVM_SETSELECTEDCOLUMN  = LVM_FIRST + 140;
 LVM_INSERTGROUP        = LVM_FIRST + 145;
 LVM_MOVEITEMTOGROUP    = LVM_FIRST + 154;
 LVM_ENABLEGROUPVIEW    = LVM_FIRST + 157;
 LVM_SETTILEVIEWINFO    = LVM_FIRST + 162;
 LVM_SETTILEINFO        = LVM_FIRST + 164;

 LVIF_GROUPID = $0100;

 LVGF_HEADER  = $00000001;
 LVGF_FOOTER  = $00000002;
 LVGF_ALIGN   = $00000008;
 LVGF_GROUPID = $00000010;

 LVGA_HEADER_LEFT   = $00000001;
 LVGA_HEADER_CENTER = $00000002;
 LVGA_HEADER_RIGHT  = $00000004;

 LV_VIEW_TILE = $0004;

 LVTILEColumns: array[0..1] of UINT = (1, 2);

procedure TForm1.FormCreate(Sender: TObject);
var
 LvGroup: TLVGROUP;
 LvItemA: TLVITEMA;
 LvTileViewInfo: TLVTILEVIEWINFO;
 LvTileInfo: TLVTILEINFO;
begin
 // Включаем группы
 SendMessage(ListView1.Handle, LVM_ENABLEGROUPVIEW, 1, 0);

 // Заполняем структуру для первой группы
 FillChar(LvGroup, SizeOf(TLVGROUP), 0);
 with LvGroup do
 begin
   cbSize := SizeOf(TLVGROUP);
   // указываем какие элементы структуры необходимо учитывать
   mask := LVGF_HEADER or LVGF_ALIGN or LVGF_GROUPID;
   // заголовок
   pszHeader := "ЛВС или высокоскоростной интернет";
   // и его размер
   cchHeader := Length(LvGroup.pszHeader);
   // ID группы
   iGroupIdL := 1;
   // выравнивание заголовка
   uAlign := LVGA_HEADER_LEFT;
 end;
 // добавляем группу
 SendMessage(ListView1.Handle, LVM_INSERTGROUP, 0, Longint(@LvGroup));

 // выставляем стиль "плитка"
 SendMessage(ListView1.Handle, LVM_SETVIEW, LV_VIEW_TILE, 0);

 // заполняем структуру для указания параметров стиля
 FillChar(LvTileViewInfo, SizeOf(TLVTILEVIEWINFO), 0);
 with LvTileViewInfo do
 begin
   cbSize := SizeOf(TLVTILEVIEWINFO);
   // указываем что заполнено только кол-во дополнительных строк
   dwMask := LVTVIM_COLUMNS;
   // коих количество равно двум (в сумме с заголовком = 3)
   cLines := 2;
 end;
 // выставляем дополнительные настройки стиля "плитка"
 SendMessage(ListView1.Handle, LVM_SETTILEVIEWINFO, 0, LPARAM(@LvTileViewInfo));

 // заполняем структуру для стиля "плитка" для элементов
 // в которой указывается, какие сабитемы будут участвовать в отображении
 LvTileInfo.cbSize := SizeOf(TLVTILEINFO);
 // количество подэлементов
 LvTileInfo.cColumns := 2;
 // указатель на массив индексов подэлементов
 LvTileInfo.puColumns := @LVTILEColumns;

 // добавляем первый элемент
 with ListView1.Items.Add do
 begin
   Caption := "1394-соединение";
   SubItems.Text := "Подключено" + sLineBreak + "Сетевой адаптер 1394";
 end;

 // заполняем структуру для переноса элемента в группу
 FillChar(LvItemA, SizeOf(TLvItemA), 0);
 with LvItemA do
 begin
   // указываем что учитывать нужно только ID группы
   mask := LVIF_GROUPID;
   // который равен единице
   iGroupId := 1;
   // указываем ID элемента с которым хотим произвести действие
   iItem := ListView1.Items.Count - 1;
 end;
 // переносим элемент в группу
 SendMessage(ListView1.Handle, LVM_SETITEM, 0, Longint(@LvItemA));

 // настраеваем его изображение в соответствии со стилем
 // а именно, указываем ID элемента с которым хотим произвести действие
 LvTileInfo.iItem := ListView1.Items.Count - 1;
 // и выставляем параметры
 SendMessage(ListView1.Handle, LVM_SETTILEINFO, 0, LPARAM(@LvTileInfo));

 // второй элемент по аналогии с первым
 with ListView1.Items.Add do
 begin
   Caption := "Подключение по локальной сети";
   SubItems.Text := "Подключено" + sLineBreak + "";
 end;
 FillChar(LvItemA, SizeOf(TLvItemA), 0);
 with LvItemA do
 begin
   mask := LVIF_GROUPID;
   iItem := ListView1.Items.Count - 1;
   iGroupId := 1;
 end;
 SendMessage(ListView1.Handle, LVM_SETITEM, 0, Longint(@LvItemA));

 LvTileInfo.iItem := ListView1.Items.Count - 1;
 SendMessage(ListView1.Handle, LVM_SETTILEINFO, 0, LPARAM(@LvTileInfo));
end;


Будет тебе несколько линий на каждый элемент.


 
tytus   (2008-08-12 13:12) [2]

> Rouse_ ©   (12.08.08 12:44) [1]
спасибо, хороший пример.
Я так понял, что все subitem-ы контрола собираются в группы.
но это пока... еще разбираюсь в коде...

Хотя мне нужно было немножко другое. Как в ListBox-е,
там можно для каждого элемента применить свою высоту.


 
Rouse_ ©   (2008-08-12 13:23) [3]


> Я так понял, что все subitem-ы контрола собираются в группы.

Да.

> там можно для каждого элемента применить свою высоту.

Эмн, SysListView32 конечно хорошо кастомизируется, но насколько мне известно, такой функциональности, как произвольное изменение ректа элемента, у него нет.


 
tytus   (2008-08-12 13:33) [4]

>Rouse_ ©   (12.08.08 13:23) [3]

Эмн, SysListView32 конечно хорошо кастомизируется... ну и ладно, мне он пока не нужен...

Повторюсь - пример супер!
Давно такое искал... Сейчас нужно немного другое, но сей код обязательно заюзаю ).

Спасибо!



Страницы: 1 вся ветка

Текущий архив: 2008.09.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
15-1217310112
Vlad Oshin
2008-07-29 09:41
2008.09.21
Сбылась мечта идиота :)удалось "скырть роцесс"


2-1218180575
egik
2008-08-08 11:29
2008.09.21
Как дать кооманду "восстановить" MDIChild форме?


15-1217578343
Vlad Oshin
2008-08-01 12:12
2008.09.21
интересную задачку нашел


15-1217065057
Andy BitOff
2008-07-26 13:37
2008.09.21
покупателю вернули деньги за Windows Vista


2-1218178979
3dAnatomy
2008-08-08 11:02
2008.09.21
Гиперссылка в тексте TMemo?