|
Вопрос # 1 720/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
У меня тут возникла такая проблемка, я не знаю как проверить былали загружена картинка в форму, а из за этого у меня весь мой процесс прирывается. например у меня в форму грузятся только jpg картинки, а если фаил с именем image.jpg на самом деле является файлом image.gif то выдает ощибку: JPEG error #54
Приложение: Переключить в обычный режим- if FileName = '*.jpg' then
- begin
- !!!_Form1.Image1.Picture.LoadFromFile(cDir + SearchRec.Name);_!!!!!
-
- W := Form1.Image1.Picture.Width;
- H := Form1.Image1.Picture.Height;
 |
Вопрос задал: Mlex (статус: Посетитель)
Вопрос отправлен: 23 июня 2008, 15:50
Состояние вопроса: решён, ответов: 3.
|
Ответ #1. Отвечает эксперт: ANBsoft
Здравствуйте, Max no!
Саму загрузку картинки поместить в блок try - except.
Таким образом можно будет отследить появление ошибки и обработать ее.
Успехов.
 |
Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 23 июня 2008, 16:05
Оценка за ответ: 5
Комментарий к оценке: в блок try? а как обработать ощибку?
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, Max no!
У любого графического файла есть служебные заголовки, обычно это первые 15 байт. У JPG-файла это JFIF начиная с 7 байта включительно. Следовательно, перед тем как загрузать файл на форму можно его проверить по этому заголовку. Берете для этого TFileStream.
var
fs:TFilestream;
begin
fs := TFileStream.create("имя файла.jpg", fmOpenRead);
fs.position := 7;//спозиционировать указатель чтения на начало метки
fs.read(buffer, 5);//читать в буфер
// теперь buffer содержит эту метку, остается только ее проверить с нужной. Это я оставляю за вами...
// и если он совпадает, грузим картинку куда надо.
fs.free; //закрыть файл
end;
Желаю удачи.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 23 июня 2008, 16:10
Оценка за ответ: 5
|
Ответ #3. Отвечает эксперт: min@y™
Добавлю ещё от себя: первые 3 байта JPEG-файла - это FF D8 FF. Можно проверять их наличие.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 24 июня 2008, 08:16
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 23 июня 2008, 17:13; участников в обсуждении: 4.
|
Mlex (статус: Посетитель), 23 июня 2008, 16:08 [#1]:
в блок try? а как обработать ощибку?
|
|
Feniks (статус: Бакалавр), 23 июня 2008, 16:15 [#2]:
try
// тут выполныем нужные действия, и если будет ошибка, то выполнение прерывается и передается управление в блок except
except
// тут выполняются операторы после возникновения исключительной ситуации
end;
Все это есть в хелпе и в любой книге.
|
|
Mlex (статус: Посетитель), 23 июня 2008, 16:22 [#3]:
а надо что то в uses добавлять, а то он мне подсвиечивает ошибку: buffer ?
|
|
ANBsoft (статус: Студент), 23 июня 2008, 16:51 [#4]:
Buffer место в памяти, куда будут грузиться данные.
Идея в том, что стандартный JPG имеет определенный заголовок (с 7 позиции идет "JFIF", но это не всегда, посмотрел файлы созданные фотоаппаратами, там "c8EExif" начиная с 4 позиции (Олимпус и панасоник).
|
|
Feniks (статус: Бакалавр), 23 июня 2008, 16:53 [#5]:
TFileStream прекрастно описан в хелпе.
|
|
Мережников Андрей (статус: Абитуриент), 23 июня 2008, 17:13 [#6]:
Учтите, что призапуске программы из под Delphi, сообщение об ошибке будет все равно показываться, независимо от наличия try except. Чтобы избежать этого, надо в опциях компиляторя (Debugger Options) отключить Stop on Delphi Exception. Если запускать exe, то сообщение об ошибке (при наличии try except) не показывается
|
31 января 2011, 20:03: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|