Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 то возникает ошибка(в цветных изображениях ошибки не возникает).

Приложение:
  1. pict.Free;
  2. pict:=TbitMap.Create;
  3. pict.LoadFromFile(s);
  4. m:=pict.Width;
  5. n:=pict.Height;
  6. x:=round(m*(imagepict.Height/n));
  7. Imagepict.Width:=x;
  8. imagepict.Canvas.StretchDraw(bounds(0,0,x,y),Pict);


SKoch92 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: SKoch92 (статус: Посетитель)
Вопрос отправлен: 4 января 2009, 22:26
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 3; последнее сообщение — 5 января 2009, 14:40; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 5 января 2009, 00:54 [#1]:

А зачем пересоздавать объект таким жестоким образом. Достаточно нарисовать там большой белый прямоугольник. И этого будет достаточно. Но если туда будет загрузаться в последствии изображение, то достаточно будет сделать размеры bitmap равным 1 и 1.
Галочка "подтверждения прочтения" - вселенское зло.
SKoch92

SKoch92 (статус: Посетитель), 5 января 2009, 13:00 [#2]:

Спасибо.

Нужно ли освобождать битовые образы при выходе из программы? Т.к. если в Pict загружался Монохромный Bmp, то при использовании операции Pict.Free возникает ошибка.
Вадим К

Вадим К (статус: Академик), 5 января 2009, 14:40 [#3]:

Есть простое правило - кто наследил, тот и убирает. Где наследил, там и убираешь. Двойная уборка вредна.
Из этого делаем вывод - если память выделили, надо освободить, причем "парным методом" (в некоторых случаях память можно выделять несколькими способами - соответственно и чистить надо парным).
Если при вызове метода free возникает ошибка, значит либо происходит двойная очистка, либо "расстрел памяти" - это когда происходит работа с памятью которая не предназначенная для этого. Например указатель на объект (а переменная bmp:TBitmap есть ничем другим, как указателем) каким то образом был модифицирован и стал указывать в другое место. А потом начинают вызываться методы.... И самое дивное, что некоторые методы отработают без проблем. И то, что проблема вывалилась на free - просто совпадение. Проблема может быть где то гораздо выше.
Как быть? В первых, рассортировать код, что бы создание/удаление объектов происходило в парных местах. Например, создание объекта в начале процедуры, удаление - в конце. Создание в FormCreate, удаление в FormDestroy и так дальше. А те случаи, где это невозможно, должны обрабатываться отдельно.
Во вторых - переделать "длинные процедуры" - процедуры, которые не вмещаются целиком на экран. Почему? да просто так легче следить за всем кодом и увидеть ошибки, которых раньше не было видно.
Если и это не поможет, надо работать следующим образом - начинать потихоньку коментировать код. Да, пусть, на коде ничего не рисуется, пусть только создается/удаляется битмап, но надо дойти до того момента, когда после комментирования одной-двух строк начинает проявляться ошибка. А потом, взяв кота за хвост, начинаем медленно тянуть:)
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 1 июня 2023, 06:02
Выполнено за 0.02 сек.
Рейтинг@Mail.ru