В TImageList первоначально задал widh:=256, (в TImageList 4 картинки. Используются для вкладок TpageControl) через некоторое время потребовалось увеличить widh до 285. Увеличиваю, запускаю компиляцию и все зависает. В чем здесь может быть проблема? есть ли всетаки способ увеличить ширину картинок в TImageList? Если нет, то нет ли другого компонента, который мог бы заменить TImageList для этой цели?
Код программы здесь нипричем. Гдето читал что именно сам TImageList вызывает зависание
Стоп, стоп... Пытаюсь воспроизвести глюк:
1) положил на форму ImageList, установил ему ширину в 256 пикселей, туда запихал 4 картинки размером 16*256.
2) положил PageControl с четырьмя табами, в его Images назначил этот самый ImageList
Что я должен сделать теперь, чтобы после перекомпиляции все зависло? Только увеличить ImageList.Width, или поменять там картинки на другие, еще что-то?
После увеличения размера, картинки сбросятся сами. Не важно какие картинки будут после этого, для зависания достаточно того что размер был увеличен. Даже если всего на единицу-Widh:=257 уже инициирует зависание. Хотя если уменьшать размер, никаких проблем нету
Похоже, проблема не в Дельфи, а в Виндах... Ибо
Понятно.. Значит с помощью TImageList разместить на TabSheets изображения 16х285 никаким образом не получится. Это возможно осуществить другим способом? Можно ли задать в свойстве Images PageControl чтото кроме ImageList?
P.S. Ага... Вот и нашлось
Вот описание бага в Quality Central: http://qc.embarcadero.com/wc/qcmain.aspx?d=38730
В самом низу читаем объяснение Embarcadero:
Что такое Рантайм и IDE, которые я не нашел у себя в палитре инструментов?
procedure TForm1.FormCreate(Sender: TObject);, в папке с проектом лежат еще 4 файла (p01.bmp, p02.bmp, p03.bmp и p04.bmp) размером 285*16. Все нормально создается, ничего не виснет. Не забудь удалить myImageList (при удалении формы, наверное, раз создавали при Form.Create)
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;
Спасибо! Все работает как надо). Хотел бы только уточнить, о чем здесь идет речь - (we do this in the IDE for the tool palette)? Т.е. они выполняют это в каком то IDE?
Поточная обработка получается если ImageList расположен на форме, или может возникнуть в каком-то другом случае?
И что если не удалять myImageList? К чему это может привести? Я проверял без удаления, на первый взгляд без проблем
Они в IDE в своей (ну, в смысле, в Дельфийской среде разработки) используют Stream-ы для работы с изображениями в TImageList, что (при Height > 256 или Width > 256) приводит к ошибке и зависанию среды. Ошибка может проявиться сразу по дабл-клику на иконку ImageList-а, может при сохранении проекта, или еще на каком-либо этапе. Факт тот, что Дельфи перестает работать стабильно.
Добавлено через 3 мин.
Вот, в Дельфи 2009 включил
ReportMemoryLeaksOnShutdown := True;, и попробовал запустить БЕЗ освобождения myImageList-а, вот чего получилось:
А как сделать чтобы рисунки брались из папки С:\Images\ например? У меня таким образом первая картинка на всех четырех вкладках появляется
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;