Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
ВнизБаальшие проблемы с TListView :( Найти похожие ветки
← →
kami © (2005-12-16 20:45) [0]Суть проблемы :)
В ListView содержится много элементов (2263, если быть точным - файлы и папки Windows\System32). Иконки элементов - в 2-х ImageList-ах (получил хендлы системных ImageList-ов). В общем, ситуация: нажимаем кнопку "обновить", затем - переводим ListView из vsIcon в vsList и опять нажимаем "обновить".
Вот, если после этой комбинации попробовать вывести другое окно, или подвигать компоненты (например, сплиттер), то в лучшем случае вылезает OutOfSystemResources или Canvas does not allow drawing, в худшем - просто зависание программы (почему-то с отображением окон программ, висящих в трее, заглючиванием(недорисовыванием) popup меню во всех программах и др)...
Почитал, что написал и сам плохо понял... Может, из кода яснее будет?
Последовательность нажатия кнопок: Button1>Button2>Button3const
SHGFI_ADDOVERLAYS=$20;
Flag = SHGFI_ADDOVERLAYS or
SHGFI_ICON or
SHGFI_SYSICONINDEX or
SHGFI_USEFILEATTRIBUTES;
procedure TForm1.Button1Click(Sender: TObject);// кнопка "Обновить"
var
SearchRec:TsearchRec;
fi: _SHFILEINFOA;
CurrFileName:string;
begin
ListView1.Items.BeginUpdate;// вносим все файлы и папки из Windows\System32 в ListView
ListView1.Items.Clear;
FindFirst("c:\windows\system32\*.*",faAnyFile,SearchRec);
repeat
if SearchRec.Name[1]<>"." then
With ListView1.Items.Add do
begin
Caption:=SearchRec.Name;
if (SearchRec.Attr and faDirectory)<>0 then
CurrFileName:=".folder"
else
CurrFileName:=SearchRec.Name;
SHGetFileInfo(@CurrFileName[1],FILE_ATTRIBUTE_NORMAL,
fi,SizeOf(TSHFileInfo),Flag or SHGFI_LARGEICON or SHGFI_TYPENAME);// получаем ассоциированную иконку
ImageIndex:=fi.iIcon;
SubItems.Add("");
SubItems.Add(fi.szTypeName);
SubItems.Add("неизвестно");
end;
until FindNext(SearchRec)<>0;
FindClose(SearchRec);
ListView1.Items.EndUpdate;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
i:=integer(ListView1.ViewStyle);
inc(i);
if i>3 then
i:=0;
if i=1 then
i:=2;// не получается нормально отобразить стиль vsSmallIcon,
// длинный текст ListItem`ов налезает друг на друга :(
ListView1.ViewStyle:=TViewStyle(i);
Button1.Click; // можно закомментировать эту строчку, но тогда нужно нажать Button1>Button2>Button1>Button3
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage(" Вот ерундень !");
end;
procedure TForm1.FormCreate(Sender: TObject);
var
fi: _SHFILEINFOA;
begin
// получение хендлов системных Image list -ов, с подсказки Eraser-a
// SystemLargeImageList - TImageList: SharedImages=True; 32x32
// SystemSmallImageList - TImageList: SharedImages=True; 16x16
SystemLargeImageList.Handle:=SHGetFileInfo(PChar(""),0,fi, SizeOf(TSHFileInfo),Flag or SHGFI_LARGEICON);
SystemSmallImageList.Handle:=SHGetFileInfo(PChar(""),0,fi, SizeOf(TSHFileInfo),Flag or SHGFI_SMALLICON);
end;
end.
Привел полный код модуля.
Ну, само собой, вопрос заключается в том, что я опять перенедоделал :) ?
← →
palva © (2005-12-17 09:55) [1]А вы посмотрите в диспетчере задач, сколько памяти употребила ваша программа. Подозреваю, что ваш компьютер прилежно делает то, что вы ему поручили - обменивается данными с файлом подкачки.
← →
kami © (2005-12-17 12:21) [2]palva © (17.12.05 9:55) [1]
Занимает 6 метров, указателей в программе 18405 (с заполненным TListView), остального - по мелочи. MemProof утечек не находит.
Да и причем здесь обмен с файлом подкачки, я же нажимаю кнопки не сразу, а даю отработать предыдущей функции полностью. Просто не могу уловить взаимосвязи - сейчас изменил немного код - в ImageList-s загоняю "реальные" иконки файлов и папок (то есть, всего 2263 иконки в каждом ImageList-е) - глюка не стало, но зато работает еще дольше. В чем может быть причина, и как от нее избавиться?
← →
kami © (2005-12-17 20:11) [3]ммм...понятно, что никому не охота экспериментировать с таким глюком, но может кто-то знает, в чем собс-но проблема?
Up в смысле :)
← →
Ritter (2005-12-18 16:11) [4]...зависание программы (почему-то с отображением окон программ, висящих в трее, заглючиванием(недорисовыванием) popup меню во всех программах и др)...
Я сталкивался с подобной проблемой, но несколько в другом контексте - при работе с системным ListView из Delphi5 + KOL c использованием собственной процедуры отрисовки (по событию OnLVCustomDraw).
В первоначальном варианте получал хэндлы иконок ф-ей SHGetFileInfo и сразу после этого рисовал на Canvas"e ListView (ф-ей DrawIconEx). Описанная Вами каша на экране начинала появляться при прокрутке, особенно если в списке большое числое элементов (например, с той же системной папкой win32)
Во втором варианте хэндлы заранее складывались в массив, но иконки рисовались той же функцией. Проблема стала появляться заметно реже, но окончательно не исчезла.
Думал, что дело в неправильных параметрах, передаваемых функции DrawIconEx. Напр., иногда могли передаваться (и в действительности передавались) отрицательные координаты. Запретил вызов ф-ии, если заданные координаты не видимы - не помогло.
kami, интересно, что в Вашем случае не используется собственная отрисовка, похоже ошибка зарыта либо в VCL, либо в Common Controls Library(что более вероятно). Особенно странно, что это отражается на окнах других приложений.
Дальше я это не исследовал, т.к. решил использовать собственный аналог ListView, напрямую работающий с WinAPI (и не только по этой причине).
Однако, также интересна причина такого поведения системного компонента. Баг действительно серьезный.
Обнаружено на Win 2k 5.2195, comctl32.dll версии 5.81 (File/Product version: 5.81.4704.1100 / 5.50.4704.1100), при др. условиях не тестировалось.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c