|
Вопрос # 2 264/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Из файла (путь - S) я загружаю картинку формата BMP в битовый образ pict, для просмотра картинки на форме есть ImagePict, у которого постоянна высота, а ширина вычисляется в соответствии с соотношениями сторон картинки в pict. На Image вывожу с помощью StrechDraw. Когда, не выходя из программы, загружаю другую картинку и если ширина Imagepict новой картинки шире, чем та, которую загружали первой, то ширина ImagePict остаётся как у перовой(часть новой картинки обрезается), но значение ImagePict.Width соответствует новой(проверяю в Timer (вывожу в Label)).Как это можно исправить?
Для 'обнуления' pict использую:
pict.Free;
pict:=TbitMap.Create;
Можно ли другим способом 'обнулить' битовый образ?
Когда в pict загружаю монохромный BMP, то когда выполняется операция Pict.free то возникает ошибка(в цветных изображениях ошибки не возникает).
Приложение: Переключить в обычный режим- pict.Free;
- pict:=TbitMap.Create;
- pict.LoadFromFile(s);
- m:=pict.Width;
- n:=pict.Height;
- x:=round(m*(imagepict.Height/n));
- Imagepict.Width:=x;
- imagepict.Canvas.StretchDraw(bounds(0,0,x,y),Pict);
 |
Вопрос задал: SKoch92 (статус: Посетитель)
Вопрос отправлен: 4 января 2009, 22:26
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 5 января 2009, 14:40; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 5 января 2009, 00:54 [#1]:
А зачем пересоздавать объект таким жестоким образом. Достаточно нарисовать там большой белый прямоугольник. И этого будет достаточно. Но если туда будет загрузаться в последствии изображение, то достаточно будет сделать размеры bitmap равным 1 и 1.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SKoch92 (статус: Посетитель), 5 января 2009, 13:00 [#2]:
Спасибо.
Нужно ли освобождать битовые образы при выходе из программы? Т.к. если в Pict загружался Монохромный Bmp, то при использовании операции Pict.Free возникает ошибка.
|
|
Вадим К (статус: Академик), 5 января 2009, 14:40 [#3]:
Есть простое правило - кто наследил, тот и убирает. Где наследил, там и убираешь. Двойная уборка вредна.
Из этого делаем вывод - если память выделили, надо освободить, причем "парным методом" (в некоторых случаях память можно выделять несколькими способами - соответственно и чистить надо парным).
Если при вызове метода free возникает ошибка, значит либо происходит двойная очистка, либо "расстрел памяти" - это когда происходит работа с памятью которая не предназначенная для этого. Например указатель на объект (а переменная bmp:TBitmap есть ничем другим, как указателем) каким то образом был модифицирован и стал указывать в другое место. А потом начинают вызываться методы.... И самое дивное, что некоторые методы отработают без проблем. И то, что проблема вывалилась на free - просто совпадение. Проблема может быть где то гораздо выше.
Как быть? В первых, рассортировать код, что бы создание/удаление объектов происходило в парных местах. Например, создание объекта в начале процедуры, удаление - в конце. Создание в FormCreate, удаление в FormDestroy и так дальше. А те случаи, где это невозможно, должны обрабатываться отдельно.
Во вторых - переделать "длинные процедуры" - процедуры, которые не вмещаются целиком на экран. Почему? да просто так легче следить за всем кодом и увидеть ошибки, которых раньше не было видно.
Если и это не поможет, надо работать следующим образом - начинать потихоньку коментировать код. Да, пусть, на коде ничего не рисуется, пусть только создается/удаляется битмап, но надо дойти до того момента, когда после комментирования одной-двух строк начинает проявляться ошибка. А потом, взяв кота за хвост, начинаем медленно тянуть
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|