• 0
kuldiegor

access violation TImage

Вопросы

Всем доброго времени суток! Обнаружил проблему, связанную с загрузкой изображения в TImage.

Если загружать изображения с хард диска очень быстро, то как будто TImage не поспевает и вываливает access violation. Delphi xe7 Fire Monkey 64 bit Windows.

val:=round(360*value/max); //узнаём какова часть байт в градусах 
improgressbar.Bitmap.LoadFromFile(ExtractFilePath(paramstr(0))+'Pictures\ProgressBar\'+inttostr(val)+'.png');  
labprogressbar.Text:=strtool.intbytetostr(value,1)+'Б'+#$D#$A+'/'+#$D#$A+strtool.intbytetostr(max,1)+'Б';
Application.ProcessMessages; 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 ответов на этот вопрос

  • 0

Brovin Yaroslav, могу только догадываться...

Видимо там цикл по Value до max, поэтому чтоб надпись выводилась во время работы цикла. 

Этот отрывок кода не даёт представления где возникает ошибка.

kuldiegor, отладчиком проходили код? в какой строке ошибка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
uldiegor, отладчиком проходили код? в какой строке ошибка?

 

Да, ошибка в модуле FMX.Canvas.D2D. строка 2342 post-816-0-81902500-1455698970_thumb.png

В общем история такая отправляю файл через idhttp1 в событии OnIdHTTP1Work делаю прогрессбар сделанный из своих картинок. Всего 361 картинка (0-360) формата PNG. Провел небольшое тестирование в цикле ошибок нет, а вот с  idhttp1 вываливает. Похоже на то что bitmap не поспевает за idhttp1. Подскажите в чем может проблема и как её решить.

P.S. На VCL работает отлично.

P.S.S. 

 

 

Зачем здесь Application.ProcessMessages?

Что бы прога не подвисала. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

OnIdHTTP1Work случайно не в отдельном потоке работает?

Откажитесь от Indy, переходите на System.Net.*.pas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

OnIdHTTP1Work случайно не в отдельном потоке работает?

Откажитесь от Indy, переходите на System.Net.*.pas

Точно сказать не могу, в общем, лежит на form1 idhttp компонент, а картинки грузятся на другой форме (form2)

P.S. У меня тоже такие подозрения были, возможно, без Synchronize вызывается событие

Изменено пользователем kuldiegor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Попробуйте сделать просто:

improgressbar.Bitmap.Canvas.BeginScene;
try
  improgressbar.Bitmap.LoadFromFile(........................
finally
  improgressbar.Bitmap.Canvas.EndScene;
end;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

А с инди сейчас все так плохо?

Пардон, а когда с ними было хорошо?

до 10 версии - постоянные проблемы с версиями OpenSSL.

В отличие от других компонентов влезть в код Indy, покопаться чтобы понять где возникает глюк - практически нереально, слишком много всего наворочено.

Да и взять самое простое - на кой idHTTP (который клиент) возбуждает исключение на коды 400-599 вместо того, чтобы просто отдать HTTPStatusCode  в ответе? В результате приходится городить многоэтажные конструкции try-except, что явно не способствует читабельности уже собственного кода.

Единственный плюс (который значим для меня, т.е. читать как имхо) у http-компонентов Indy - более-менее нормальная работа с multipart-form-data. В System.Net.Mime это немного недоработано, пришлось делать собственную надстройку.

 

P.S. на RadStudio Seattle Tour в СПб неофициально рекомендовали не использовать Indy, а действовать через System.Net.HttpClient

Изменено пользователем kami

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

Попробуйте сделать просто:

improgressbar.Bitmap.Canvas.BeginScene;
try
  improgressbar.Bitmap.LoadFromFile(........................
finally
  improgressbar.Bitmap.Canvas.EndScene;
end;

Огромное спасибо! Только вот теперь выяснилось что глючит в довесок TLabel. Но это удалось решить костылём sleep(10);

И еще такой вопрос: как убрать мерцание?

Изменено пользователем kuldiegor

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

 

Попробуйте сделать просто:

improgressbar.Bitmap.Canvas.BeginScene;
try
  improgressbar.Bitmap.LoadFromFile(........................
finally
  improgressbar.Bitmap.Canvas.EndScene;
end;

Огромное спасибо! Только вот теперь выяснилось что глючит в довесок TLabel. Но это удалось решить костылём sleep(10);

И еще такой вопрос: как убрать мерцание?

 

С TLabel ситуация точно та же.

Сначала BeginUpdate, потом EndUpdate.

А если проблема не в этом - тогда все (вывод в GUI) загнать в

TThread.Syncronize(TThread.CurrentThread, procedure
begin
 .................
end);

С мерцанием - не понял, что именно и когда мерцает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

 

 

 

Попробуйте сделать просто:

improgressbar.Bitmap.Canvas.BeginScene;
try
  improgressbar.Bitmap.LoadFromFile(........................
finally
  improgressbar.Bitmap.Canvas.EndScene;
end;

Огромное спасибо! Только вот теперь выяснилось что глючит в довесок TLabel. Но это удалось решить костылём sleep(10);

И еще такой вопрос: как убрать мерцание?

 

С TLabel ситуация точно та же.

Сначала BeginUpdate, потом EndUpdate.

А если проблема не в этом - тогда все (вывод в GUI) загнать в

TThread.Syncronize(TThread.CurrentThread, procedure
begin
 .................
end);

С мерцанием - не понял, что именно и когда мерцает?

 

Огромнейшие спасибо! Всё работает и мерцание исчезло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Похожий контент

    • От Tumaso
      Столкнулся со следующей проблемой - TImage игнорирует установленные значения XRadius и YRadius у TRectangle (10.1 Berlin with update 2)
       
      Суть - мне необходимо, чтобы у TRectangle углы были немного скругленные, для этого я устанавливаю XRadius и YRadius. Внутри TRectangle расположен TImage (левый верхний угол 0,0, ширина и высота совпадают с размерами TRectangle). Когда я загружаю картинку в TImage (что в дизайнере, что программно), получается что TImage отображается с прямыми углами, игнорируя XRadius и YRadius своего родителя. Свойство ClipChildren у TRectangle установлен.
      Как сделать так, чтобы TImage скруглялся по углам? Что интересно, TCircle в этом плане работает, обрезая TImage.
    • От Роман Фил
      Привет ребят, созрел такой вопрос который меня мучает ! Вобщем пытаюсь загрузить картинку по прямой слыке с сервера. Картинка не грузится, не сохраняется не отображается. 
      Конечная платформа - Андроид. Пишу на Delphi xe 10 seatle.
      Что я делаю? при нажатии на сам компонент TImage (созданный динамически), должна грузится картинка по адресу преждевременно записанное в hint (TImage) при создании вида (http://блаблабла.jpg)
      Раньше код ниже работал сейчас нет не пойму что не так. Почему стал ковырять? потому что форма встает колом при загрузке изображений.
       
      var s: string; fs: TFileStream; begin fs := TFileStream.Create(tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'), fmCreate); NetHTTPClient1.Get((Sender as TImage).Hint, fs); fs.Free; (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromFile (tpath.Combine(tpath.GetDownloadsPath, 'load.jpg')); подключал еще pas нашел на этом форуме FMX.Features.Bitmap.Helpers.pas
      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromUrl ((Sender as TImage).Hint); как проще сделать посоветуете чтоб и грузилось и форма не висла?
    • От Anasazi
      Всем доброго времени суток. Возникла необходимость решить такую задачу: в таблице базы MySQL хранится список изображений и их URL. Необходимо получить этот список массивом. Затем загрузить изображения и поочередно с интервалом показать их в TImage.
      Понимаю, что получить список изображений правильнее при помощи PHP скрипта, но в каком виде скрип должен вернуть данные, чтобы в Delphi получить из них массив не знаю.
      Раньше для получения изображений использовал такую процедуру. Но вопрос, где хранить изображения перед демонстрацией их в TImage? Создавать несколько MemoryStream?
      procedure LoadWebImage(url: string; image: TBitmap);
      var
        idhttp : TNetHTTPClient;
        ms : TMemoryStream;
      begin
       IdHTTP := TNetHTTPClient.Create(nil);
        ms := TMemoryStream.Create;
        try
          idhttp.Get(url, ms);
          ms.Position := 0;
          image.LoadFromStream(ms);
        finally
          ms.Free;
          idhttp.Free;
        end;
      end;
    • От denprox
      Доброго времени суток! Подскажите, как узнать оригинальный размер картинки, загруженной в TImage ?
    • От Satellite
      Возможно ли вывести 9-patch в Timage? Если нет, то куда можно импортировать изображение такого формата? 
    • От AlexG
      Возник следующий вопрос:
      Допустим есть "сложная" форма, внешний вид которой должен быть нестандартным и на которой расположено N-ное количество компонент (исходим из того, что их много, некоторые из них - динамические, например - вывод видео с камеры).
      "Нестандартный вид" подразумевает: наличие тени у формы, измененный внешний вид, отличный от вида по умолчанию в любой ОС.
      Непосредственно вопрос звучит так.
      Какая из двух следующих реализаций будет работать быстрее (отрисовка/обновление этой формы при обновлении компонент: текста, списков, вывод видео и т.д.):
      Оба вида форм предопределяются в стиле.
      ВАРИАНТ 1.
      - Тень формы реализована в виде компонента TImage с подгруженным PNG изображением.
      - Контур формы реализован компонентом TRectangle с "окантовкой" и заливкой прямоугольника заданным цветом (все без градиентов)
      - Шапка формы реализована вторым прямоугольником TRectangle без "окантовки", но с заливкой другим цветом (без градиента)
      ВАРИАНТ 2. Вся форма задана одним объектом TStyleObject в котором в качестве свойств установлены:
      - SourceLookup - ссылка на PNG-изображение в данном стиле
      - SourceLink - создан TBitmapLink, у которого заданы свойства CapInsets и SourceRect
      Внешний вид у них будет практически одинаковый (хотя во втором случае он будет более корректным на любой ОС и при использовании любой видео-карты, чего не скажешь о первом варианте).
      Однако, интересует именно СКОРОСТЬ отрисовки в обеих случаях!
      Интересует именно теория, с точки зрения реализации самой FMX.
      З.Ы. Предполагаю, что вопрос больше к разработчикам FMX, но возможно у кого-то уже есть опыт работы с подобными задачами...
    • От umkes
      Добрый день, возникла проблема при работе с TImage;
      У меня компонент TImage - imgRing и есть в TImageList. 
      Я динамически формирую Bitmap из копий картинки из TImageList и асайню его в TImage. На Windows все работает прекрасно, а на андроиде картинка все время пустая... Может кто-то подскажет, где я не прав
      //============================================================================== procedure TMainForm.DrawRing; //------------------------------------------------------------------------------ var bmp1, bmp2 : TBitmap; i : integer; str : TMemoryStream; begin bmp2 := TBitmap.Create; bmp2.Assign(ImageList.Source.Items[3].MultiResBitmap.Items[0].Bitmap); bmp1 := TBitmap.Create; bmp1.Assign(bmp2); bmp1.Width := ClientWidth + bmp2.Width * 10; i := 0; bmp1.Canvas.BeginScene(); while (i * bmp2.Width) < bmp1.Width do begin bmp1.Canvas.DrawBitmap(bmp2, RectF(0, 0, bmp2.Width, bmp2.Height), RectF(i * bmp2.Width, 0, (i + 1) * bmp2.Width, bmp2.Height), 1 ); inc(i); end{ while }; bmp1.Canvas.EndScene; str := TMemoryStream.Create; bmp1.SaveToStream(str); str.Position := 0; imgRing.BeginUpdate; imgRing.Bitmap.CreateFromStream(str); imgRing.EndUpdate; end{ procedure TMainForm.DrawRings }; Делаю такое потому-что TImage.WrapMode.Tile не подходит для моей задачи.
    • От Евгений Корепов
      На незначительном количестве устройств, менее 0,1%, получаю ошибку "Bitmap size too big" при AImage.Bitmap.LoadFromStream(AMemoryStream). Подозреваю что ошибка происходит на слабых устройствах. Картинка 250х250 png. Код выполняется в основном потоке (в интернетах были упоминания что глючит эта операция в отдельном потоке на каких то версиях Delphi).
      Как предотвратить подобное? Можно как то определить максимальный размер картинки для текущего устройства? Или может дело не в свободной памяти, а в чем то еще?
    • От ivadimos
      Кто-нибудь делал картинку, которая преобразуется в круглую?
    • От Dozent
      Добрый день. Столкнулся с проблемой правильного отображения. есть картинка.
      Которая должна вращаться по принципу часовой стрелки, но при изменении свойства RotationAnge происходит смещение  стрелки от своего центра вокруг которого она должна вращаться. Как правильно поворачивать стрелку?


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу