Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.007 c
15-1217507399
ekto
2008-07-31 16:29
2008.09.21
Подскажите профайлер для D7. Басплатный.


15-1217686137
VirEx
2008-08-02 18:08
2008.09.21
знатокам SQL


1-1198155538
андр
2007-12-20 15:58
2008.09.21
Передача параметров


2-1218439749
zivan
2008-08-11 11:29
2008.09.21
FocusRect


15-1217357107
Layner
2008-07-29 22:45
2008.09.21
Загрузка программы - индикатор - на какой процесс поставить





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский