C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятное исключение при работе с TImage  (Прочитано 1329 раз)
Georg
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 4


Непонятное исключение при работе с TImage
« : 06 Сентябрь 2015, 16:05:47 »

Доброго времени суток!
Вывожу  jpeg-картинку из потока через TJPEGImage  в  TImage  на  форме.
Как работать через потоки очень хорошо рассказано в https://cbuilder.ru/index.php/topic,4903.0.html.
И все вроде работает, достаточно много ошибок отфильтровываются, но не все. Иногда(очень редко) при выводе в TImage:
.......................
TJPEGImage *jpeg;
.........................
Image1->Picture->Assign(jpeg);
возникают исключения и вылетает сообщение Error JPEG #n(n=1,2,3..... но обычно 64 или 92 ), приложение не прерывается, но всёж  нервирует .
Когда стал копать оказалось, что если запретить видимость-
Image1->Visible= false;
исключение не возникает, если запускать из под отладчика, отладчик прерывается и сообщает об исключении класса EJPEG.
Пытался у ТImage  перехватывать иключения
  try
  {
   .........................
     Image1->Picture->Assign(jpeg);
    .........................
  }
  cath(...)
  {
    MessageDlg("Ошибка", mtError, TMsgDlgButtons()   }
не помогает. Как вроде  и не  TImage генерит это сообщение, тогда кто? Если идти по шагам то исключение происходит кода, отдаем работу операционки,
то есть вроде и не приложении вовсе, ну да  приложение не прерывается. Но почему тогда у окна  сообщения в заголовке имя проекта.
Что подскажете, где копать?

 
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Непонятное исключение при работе с TImage
« Ответ #1 : 06 Сентябрь 2015, 19:40:42 »

Так как же можно TJPEG перекинуть в TPicture? Правильно ошибки сыпятся.
Записан
Georg
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 4


Re: Непонятное исключение при работе с TImage
« Ответ #2 : 07 Сентябрь 2015, 00:07:30 »

Цитата: POV от 06 Сентябрь 2015, 19:40:42
Так как же можно TJPEG перекинуть в TPicture? Правильно ошибки сыпятся.
Но они не сыпятся, а иногда возникают, прчем когда данные не корректные.
Еще раз повторюсь, задача  стоит  такая еже как у автора https://cbuilder.ru/index.php/topic,4903.0.html.. Из потока данные которые должны быть
jpeg картинкой закинуть в TImage, для простоты просмотра. И тем методом который был предложен в указаном посту задача почти решается.
Сделаем небольшую выжимку :
Есть поток
   TMemoryStream *stream = new TMemoryStream;
   куда попадают данные, которые должны быть jpeg картинкой.
есть объект TJPEGImage *jpeg = new TJPEGImage;
куда данные и помещаются, в первую очередь для проверки на вшивость.
Код
 
   bool result = true;
   try
    {
       int sz = stream->Size;
       if( sz > NULL )
       {
             stream->Seek(0,0);
             jpeg->LoadFromStream(stream);
       }else
           result = false;
    }
    catch(Exception &ex)
    {
       MessageDlg(ex.Message, mtError, TMsgDlgButtons()mbOK, 0);
       result = false;
     }

Данный фрагмент кода отфильтровывает, достаточно много некорректностей, ну если данные совсем не jpeg.

На форме есть объект TImage * Image1- = new TImage(this);
 Куда данные и  должны попадать.
 if(result)
 {
   Image1->Picture->Assign(jpeg);
 }
И при нормальных данных, можно радоваться жизни но иногда данные только похожи на jpeg, и настроение портят сообщения исключения.
причем как уже было сказано:
 try
  {
   .........................
     Image1->Picture->Assign(jpeg);
    .........................
  }
  cath(...)
  {
    MessageDlg("Ошибка", mtError, TMsgDlgButtons()   }
не помогает.

Теперь про TPicture, если через LoadFromFile можно загрузить jpeg, то почему через Assign нельзя?
Во! Через файлы надо попробовать.

Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Непонятное исключение при работе с TImage
« Ответ #3 : 07 Сентябрь 2015, 08:05:22 »

LoadFromFile - это функция загрузки. Она для того и предназначена. Assign - копирование объекта по другому адресу... тип при этом надо соблюсть!
Записан
Georg
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 4


« Ответ #4 : 07 Сентябрь 2015, 09:23:20 »

Цитата: POV от 07 Сентябрь 2015, 08:05:22
LoadFromFile - это функция загрузки. Она для того и предназначена. Assign - копирование объекта по другому адресу... тип при этом надо соблюсть!
Спорить не буду, одно скажу - работает.  Тем более задача  более определилась. Попробовал все пустить через файлы. Результат тот же. Причем если файл открывать
другими программами то открывается , части изображения нету, но не каких сообщений не появляется
Т.е если файл битый  при загрузке в  TImage, появляются исключения  которые не перехватить, вопрос кто их генерит и как перехватить, чтоб обработать ?
Код упростился до:
Код
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
  try
  {
    Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
  }
  catch(...)
  {
    MessageDlg("Error", mtError, TMsgDlgButtons()mbOK, 0);
  }
}
}
 

Вот файл для примера не смотря на то что больше 4,5 К прицепился
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.095 секунд. Запросов: 19.