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

Вниз

Баальшие проблемы с 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>Button3

const
 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
1-1133492829
Петр
2005-12-02 06:07
2006.01.08
Как подгрузить dll, написанную в Delphi в проект CBuilder?


14-1134584951
Gero
2005-12-14 21:29
2006.01.08
IDE для C#


4-1130938577
Piter
2005-11-02 16:36
2006.01.08
Shutdown компьютера.


14-1134710833
Pazitron_Brain
2005-12-16 08:27
2006.01.08
Все, что вы хотели знать о спутниковом Интернете


14-1134372111
Pave/\
2005-12-12 10:21
2006.01.08
Citrix