TListColumn * tmpCol;
tmpCol= ListView1->Columns->Add();
tmpCol->Caption="abracadabra";
tmpCol->AutoSize=true;
tmpCol= ListView1->Columns->Add();
tmpCol->Caption="абракадабра";
tmpCol->AutoSize=true;
Странный AutoSize у колонок TListView
Казалось бы тривиальная задача, но не все так просто...
Стандартный пустой проект. На форму добавлен TListView в режиме Report и кнопочка.
По ходу выполнения программы, добавляем и убираем колонки в TListView.
Если код:
Код:
добавить в конструктор формы, то все работает нормально. Колонки честно делят пространство ListView.
Но если тот же самый код добавить в обработчик нажатия кнопки, то колонки добавляются, но AutoSize не работает.
Срабатывает он только если изменять размер TListView. Ну а это не всегда выход, т.к. частенько колонки изменяются без изменения размера ListView.
Собственно, как обойти этот косяк?
Цитата: Gigahard
Задача: Сделать автоматическое масштабирование колонок у компонента TListView.
Казалось бы тривиальная задача, но не все так просто...
Стандартный пустой проект. На форму добавлен TListView в режиме Report и кнопочка.
По ходу выполнения программы, добавляем и убираем колонки в TListView.
Если код:
добавить в конструктор формы, то все работает нормально. Колонки честно делят пространство ListView.
Но если тот же самый код добавить в обработчик нажатия кнопки, то колонки добавляются, но AutoSize не работает.
Срабатывает он только если изменять размер TListView. Ну а это не всегда выход, т.к. частенько колонки изменяются без изменения размера ListView.
Собственно, как обойти этот косяк?
Казалось бы тривиальная задача, но не все так просто...
Стандартный пустой проект. На форму добавлен TListView в режиме Report и кнопочка.
По ходу выполнения программы, добавляем и убираем колонки в TListView.
Если код:
Код:
TListColumn * tmpCol;
tmpCol= ListView1->Columns->Add();
tmpCol->Caption="abracadabra";
tmpCol->AutoSize=true;
tmpCol= ListView1->Columns->Add();
tmpCol->Caption="абракадабра";
tmpCol->AutoSize=true;
tmpCol= ListView1->Columns->Add();
tmpCol->Caption="abracadabra";
tmpCol->AutoSize=true;
tmpCol= ListView1->Columns->Add();
tmpCol->Caption="абракадабра";
tmpCol->AutoSize=true;
добавить в конструктор формы, то все работает нормально. Колонки честно делят пространство ListView.
Но если тот же самый код добавить в обработчик нажатия кнопки, то колонки добавляются, но AutoSize не работает.
Срабатывает он только если изменять размер TListView. Ну а это не всегда выход, т.к. частенько колонки изменяются без изменения размера ListView.
Собственно, как обойти этот косяк?
Да, собственно, никак. Расчетами ширины колонок занимается приватная функция DoAutoSize класса TCustomListView (см. исходник), от которого происходит TListView. DoAutoSize вызывается только из CreateWnd и из обработчика WM_WINDOWPOSCHANGED. Как решение можно посылать сообщение:
Код:
WINDOWPOS p;
p.hwnd = ListView->Handle;
p.hwndInsertAfter = HWND_NOTOPMOST;
p.x=0;
p.y=0;
p.cx=0;
p.cy=0;
p.flags=SWP_SHOWWINDOW;
SendMessage(p.hwnd, WM_WINDOWPOSCHANGED, 0, (UINT) &p);
p.hwnd = ListView->Handle;
p.hwndInsertAfter = HWND_NOTOPMOST;
p.x=0;
p.y=0;
p.cx=0;
p.cy=0;
p.flags=SWP_SHOWWINDOW;
SendMessage(p.hwnd, WM_WINDOWPOSCHANGED, 0, (UINT) &p);