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

Наверх





Память: 0.48 MB
Время: 0.008 c
2-1134862647
Neiroman
2005-12-18 02:37
2006.01.08
Memo и строки


2-1134927056
Silica
2005-12-18 20:30
2006.01.08
Что означает данный код?


2-1134833592
dude
2005-12-17 18:33
2006.01.08
что в Delphi называется словом ?


14-1134647613
Хинт
2005-12-15 14:53
2006.01.08
Оптимизация и/или защита DLL


10-1111148607
va
2005-03-18 15:23
2006.01.08
Регистрация СОМ-сервера





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский