IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Проблема с увеличением ширины изображений в TImageList
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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


Гость






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


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Похоже, проблема не в Дельфи, а в Виндах... Ибо
Цитата
Значение свойства
Тип: System.Drawing..::.Size
Объект Size, который определяет высоту и ширину (в точках) изображений в списке. Размер по умолчанию равен 16 x 16. Максимальный размер равен 256 x 256.
(цитата - отсюда: MSDN -> ImageList..::.ImageSize - свойство
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Понятно.. Значит с помощью TImageList разместить на TabSheets изображения 16х285 никаким образом не получится. Это возможно осуществить другим способом? Можно ли задать в свойстве Images PageControl чтото кроме ImageList?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






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 в Рантайме, как советует разработчик.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Что такое Рантайм и IDE, которые я не нашел у себя в палитре инструментов?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата
Что такое Рантайм и 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)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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

Добавлено через 3 мин.
Цитата
И что если не удалять myImageList? К чему это может привести?
К утечке ресурсов, наверное. Попробуй то же самое сделай в Билдере (если нету - я проверю чуть позже), и включи CodeGuard, он покажет, если есть memory-leak.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






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

Добавил удаление myImageList, сообщение пропало, больше утечек нет.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

Сообщение отредактировано: 1147 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






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;
Проверил, все картинки разные, как и положено.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 31.10.2020 14:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name