Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с увеличением ширины изображений в TImageList
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
1147
В TImageList первоначально задал widh:=256, (в TImageList 4 картинки. Используются для вкладок TpageControl) через некоторое время потребовалось увеличить widh до 285. Увеличиваю, запускаю компиляцию и все зависает. В чем здесь может быть проблема? есть ли всетаки способ увеличить ширину картинок в TImageList? Если нет, то нет ли другого компонента, который мог бы заменить TImageList для этой цели?
Код программы здесь нипричем. Гдето читал что именно сам TImageList вызывает зависание
volvo
Стоп, стоп... Пытаюсь воспроизвести глюк:
1) положил на форму ImageList, установил ему ширину в 256 пикселей, туда запихал 4 картинки размером 16*256.
2) положил PageControl с четырьмя табами, в его Images назначил этот самый ImageList
Что я должен сделать теперь, чтобы после перекомпиляции все зависло? Только увеличить ImageList.Width, или поменять там картинки на другие, еще что-то?
1147
После увеличения размера, картинки сбросятся сами. Не важно какие картинки будут после этого, для зависания достаточно того что размер был увеличен. Даже если всего на единицу-Widh:=257 уже инициирует зависание. Хотя если уменьшать размер, никаких проблем нету
volvo
Похоже, проблема не в Дельфи, а в Виндах... Ибо
Цитата
Значение свойства
Тип: System.Drawing..::.Size
Объект Size, который определяет высоту и ширину (в точках) изображений в списке. Размер по умолчанию равен 16 x 16. Максимальный размер равен 256 x 256.
(цитата - отсюда: MSDN -> ImageList..::.ImageSize - свойство
1147
Понятно.. Значит с помощью TImageList разместить на TabSheets изображения 16х285 никаким образом не получится. Это возможно осуществить другим способом? Можно ли задать в свойстве Images PageControl чтото кроме ImageList?
volvo
P.S. Ага... Вот и нашлось smile.gif
Вот описание бага в Quality Central: QC -> TImageList locks-up IDE

В самом низу читаем объяснение Embarcadero:
Цитата
From R&D: Microsofts build in imagelist streaming mechanism, which is used in the imagelist editor, fails on imagelists larger than 256x256. We cannot fix this, however we also cant limit the imagelists size to less than 256 because its valid to have an imagelist larger than that as long as your create it at runtime and never do anything to stream it (we do this in the IDE for the tool palette).
Так что... Создавай TImageList в Рантайме, как советует разработчик.
1147
Что такое Рантайм и IDE, которые я не нашел у себя в палитре инструментов?
volvo
Цитата
Что такое Рантайм и IDE
smile.gif Рантайм - это время выполнения программы. То есть, не бросаешь компонент на форму в Дизайнере, а создаешь его через myImageList := TImageList.Create(nil) где-нибудь в начале, при старте программы, устанавливаешь нужные размеры, загружаешь из какого-нибудь списка картинки, и назначаешь созданный ImageList в PageControl. Естественно, как и говорили в Embarcadero, никакой поточной обработки, это опять приведет к зависанию.

Ну, вот я попробовал:
procedure TForm1.FormCreate(Sender: TObject);
var
bm: TBitmap;
i: integer;
begin
myImageList := TImageList.CreateSize(285, 16); // эту переменную описал в классе формы
with myImageList do
begin
for i := 1 to 4 do
begin
bm := TBitmap.Create;
bm.LoadFromFile(Format('%sp0%d.bmp', [ExtractFilePath(ParamStr(0)), i]));
Add(bm, nil);
bm.free;
end;
end;
PageControl1.Images := myImageList;
end;
, в папке с проектом лежат еще 4 файла (p01.bmp, p02.bmp, p03.bmp и p04.bmp) размером 285*16. Все нормально создается, ничего не виснет. Не забудь удалить myImageList (при удалении формы, наверное, раз создавали при Form.Create)
1147
Спасибо! Все работает как надо). Хотел бы только уточнить, о чем здесь идет речь - (we do this in the IDE for the tool palette)? Т.е. они выполняют это в каком то IDE?
Поточная обработка получается если ImageList расположен на форме, или может возникнуть в каком-то другом случае?
И что если не удалять myImageList? К чему это может привести? Я проверял без удаления, на первый взгляд без проблем
volvo
Они в IDE в своей (ну, в смысле, в Дельфийской среде разработки) используют Stream-ы для работы с изображениями в TImageList, что (при Height > 256 или Width > 256) приводит к ошибке и зависанию среды. Ошибка может проявиться сразу по дабл-клику на иконку ImageList-а, может при сохранении проекта, или еще на каком-либо этапе. Факт тот, что Дельфи перестает работать стабильно.

Добавлено через 3 мин.
Цитата
И что если не удалять myImageList? К чему это может привести?
К утечке ресурсов, наверное. Попробуй то же самое сделай в Билдере (если нету - я проверю чуть позже), и включи CodeGuard, он покажет, если есть memory-leak.
volvo
Вот, в Дельфи 2009 включил
  ReportMemoryLeaksOnShutdown := True;
, и попробовал запустить БЕЗ освобождения myImageList-а, вот чего получилось:
Нажмите для просмотра прикрепленного файла

Добавил удаление myImageList, сообщение пропало, больше утечек нет.
1147
А как сделать чтобы рисунки брались из папки С:\Images\ например? У меня таким образом первая картинка на всех четырех вкладках появляется
volvo
procedure TForm1.FormCreate(Sender: TObject);
var
bm: TBitmap;
i: integer;
const
path: AnsiString = 'C:\Images\';
begin
myImageList := TImageList.CreateSize(285, 16);
with myImageList do
begin
for i := 1 to 4 do
begin
bm := TBitmap.Create;
bm.LoadFromFile(Format('%sp0%d.bmp', [path, i]));
Add(bm, nil);
bm.free;
end;
end;
PageControl1.Images := myImageList;
end;
Проверил, все картинки разные, как и положено.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.