Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Проблема с увеличением ширины изображений в TImageList

Автор: 1147 20.08.2009 3:47

В TImageList первоначально задал widh:=256, (в TImageList 4 картинки. Используются для вкладок TpageControl) через некоторое время потребовалось увеличить widh до 285. Увеличиваю, запускаю компиляцию и все зависает. В чем здесь может быть проблема? есть ли всетаки способ увеличить ширину картинок в TImageList? Если нет, то нет ли другого компонента, который мог бы заменить TImageList для этой цели?
Код программы здесь нипричем. Гдето читал что именно сам TImageList вызывает зависание

Автор: volvo 20.08.2009 4:32

Стоп, стоп... Пытаюсь воспроизвести глюк:
1) положил на форму ImageList, установил ему ширину в 256 пикселей, туда запихал 4 картинки размером 16*256.
2) положил PageControl с четырьмя табами, в его Images назначил этот самый ImageList
Что я должен сделать теперь, чтобы после перекомпиляции все зависло? Только увеличить ImageList.Width, или поменять там картинки на другие, еще что-то?

Автор: 1147 20.08.2009 4:55

После увеличения размера, картинки сбросятся сами. Не важно какие картинки будут после этого, для зависания достаточно того что размер был увеличен. Даже если всего на единицу-Widh:=257 уже инициирует зависание. Хотя если уменьшать размер, никаких проблем нету

Автор: volvo 20.08.2009 5:16

Похоже, проблема не в Дельфи, а в Виндах... Ибо

Цитата
Значение свойства
Тип: System.Drawing..::.Size
Объект Size, который определяет высоту и ширину (в точках) изображений в списке. Размер по умолчанию равен 16 x 16. Максимальный размер равен 256 x 256.
(цитата - отсюда: http://msdn.microsoft.com/ru-ru/library/system.windows.forms.imagelist.imagesize.aspx

Автор: 1147 20.08.2009 5:30

Понятно.. Значит с помощью TImageList разместить на TabSheets изображения 16х285 никаким образом не получится. Это возможно осуществить другим способом? Можно ли задать в свойстве Images PageControl чтото кроме ImageList?

Автор: volvo 20.08.2009 5:31

P.S. Ага... Вот и нашлось smile.gif
Вот описание бага в Quality Central: http://qc.embarcadero.com/wc/qcmain.aspx?d=38730

В самом низу читаем объяснение 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 20.08.2009 6:15

Что такое Рантайм и IDE, которые я не нашел у себя в палитре инструментов?

Автор: volvo 20.08.2009 13:15

Цитата
Что такое Рантайм и 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 20.08.2009 17:10

Спасибо! Все работает как надо). Хотел бы только уточнить, о чем здесь идет речь - (we do this in the IDE for the tool palette)? Т.е. они выполняют это в каком то IDE?
Поточная обработка получается если ImageList расположен на форме, или может возникнуть в каком-то другом случае?
И что если не удалять myImageList? К чему это может привести? Я проверял без удаления, на первый взгляд без проблем

Автор: volvo 20.08.2009 17:15

Они в IDE в своей (ну, в смысле, в Дельфийской среде разработки) используют Stream-ы для работы с изображениями в TImageList, что (при Height > 256 или Width > 256) приводит к ошибке и зависанию среды. Ошибка может проявиться сразу по дабл-клику на иконку ImageList-а, может при сохранении проекта, или еще на каком-либо этапе. Факт тот, что Дельфи перестает работать стабильно.

Добавлено через 3 мин.

Цитата
И что если не удалять myImageList? К чему это может привести?
К утечке ресурсов, наверное. Попробуй то же самое сделай в Билдере (если нету - я проверю чуть позже), и включи CodeGuard, он покажет, если есть memory-leak.

Автор: volvo 20.08.2009 17:52

Вот, в Дельфи 2009 включил

  ReportMemoryLeaksOnShutdown := True;
, и попробовал запустить БЕЗ освобождения myImageList-а, вот чего получилось:
Прикрепленное изображение

Добавил удаление myImageList, сообщение пропало, больше утечек нет.

Автор: 1147 22.08.2009 3:04

А как сделать чтобы рисунки брались из папки С:\Images\ например? У меня таким образом первая картинка на всех четырех вкладках появляется

Автор: volvo 22.08.2009 3:31

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;
Проверил, все картинки разные, как и положено.