• 0
Freezer_86

TGrid и картинка из TBlobField на Android

Вопросы

Пишу кроссплатформенное приложение. Результат поиска отображается в TGrid. Стал вопрос отображения картинки в одной из колонок.

На Windows все ок, но на планшете происходят просто чудеса: при первом отображение все корректно, но если простоколить вверх-вниз как картинки одни перетираются другими, часть вообще отображается вверх ногами.

Код для сохранение картинки(jpg) в базу:

if Assigned(sm) then begin
  sm.Position := 0;
  //TBlobField(dmData.cdsPlayerData.FieldByName('Photo')).LoadFromStream(sm);

  vImage := TImage.Create(nil);

  try
    sm.Position := 0;
    vImage.Bitmap.LoadFromStream(sm);

    vKoef := vImage.Bitmap.Height / 64;

    vImage.Bitmap.Resize(Trunc(vImage.Bitmap.Width / vKoef), Trunc(vImage.Bitmap.Height / vKoef));

    sm.Free;
    sm := TMemoryStream.Create();

    try
      vImage.Bitmap.SaveToStream(sm);
      TBlobField(dmData.cdsPlayerData.FieldByName('SmallPhoto')).LoadFromStream(sm);
    finally
      sm.Free;
    end;
  finally
    vImage.Free;
  end;

end{if};

До скрола:

Screenshot_20170725-183545.thumb.png.4698c66d810bf6345198966e41784b6f.png

После скрола:

Screenshot_20170725-183501.thumb.png.c861639ace51cb6ac8d2d03ebfffc9ea.png

Пробовал и LiveBinding, и ручную прорисовку - результат один и тот же. Есть идеи что не так?

P.S. Знаю что нужно делать через TListView, но заказчик хочет «сеточку как в старой программе», так как на android будет работать только на планшетах – я согласился.

 

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


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

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

  • 0

Хорошо, если упростить по-максимуму сделать без Resize, например?
Сделать не TImage, а TBitmap...

 

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


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

не пробовал, но если на Windows все ок, значит TBitmap коректный. Или не всегда?

Подготовил тестовый проект который иллюстрирует проблему: GridBlobTest.rar

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


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

Как я вижу есть несколько возможных причин: неверный формат данных, неверная реализация TGrid под Android, неподдерживаемая комбинация компонентов, ошибки в моем коде реализации (что маловероятно поскольку кода почти нет, Live Binding).

Неужели никто не сталкивался с подобными проблемами?

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


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

Как оказалось - проблемы были в самой Delphi. После обновления на 10.2.1 - тот же код работает без каких либо проблем.

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


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

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

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

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

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

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

Войти

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

Войти

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

    • От SIARHEI RAHOUSKI
      Здравствуйте, у меня возник вопрос Как базу данных подключить к TGrid? Я использую Delphi XE3 и База данных Accsess: ADOConnection + ADOQuery + DataSource. И вот как отобразить в TGrid Таблицу бд ?
    • От Niddarun
      На форме стоит tgrid при прокрутке есть заддержка. не большая но все равно не приянто. программа под windows. И еще при прокрутке идет нагрузка на процессор. 
    • От GoldenEalge
      Всем привет, подскажите как организовать MultiSelect в grid
      Нашел статью ,но как понимаю она уже не очень актуальна
      Поиск по форуму тоже не дал результатов
    • От x11
      Можно ли получить TBitmap из TBitmapImage? Конвертировать.
    • От Clio
      Добрый день !
      В приложении я использую базу SQLite (полt, содержащие дату и время тип REAL) . В TFDQuery я описал это поле - тип Float и через LiveBindings подключил к TGrid (Date Column). 
      Но в гриде отображается только год, а не полное время. 
      Подскажите, пожалуйста, как необходимо настроить поле в Query и TGrid, чтобы дата и время отображалась правильно.
    • От Barbanel
      Здравствуйте!
      Стоит задача загружать фотографии и отображать их в списке. Казалось бы, как два пальца, но...
      Код работал долгое время, все грузилось и отображалось. Спустя какое-то время, фото грузиться перестали. Дебаггинг выявил, замкнутый бесконечный цикл в этой процедуре:
      procedure TBitmap.AssignFromSurface(const Source: TBitmapSurface); var BitmapData: TBitmapData; MaxSize: Integer; ResampledSurface: TBitmapSurface; I: Integer; SourceRect: TRectF; begin MaxSize := CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize); <-- MaxSize = 0 if (Source.Width > MaxSize) or (Source.Height > MaxSize) then begin SourceRect := TRectF.Create(0, 0, Source.Width, Source.Height); SourceRect.Fit(TRectF.Create(0, 0, MaxSize, MaxSize)); ResampledSurface := TBitmapSurface.Create; try ResampledSurface.StretchFrom(Source, Trunc(SourceRect.Width), Trunc(SourceRect.Height), PixelFormat); AssignFromSurface(ResampledSurface); <-- infinity loop here finally ResampledSurface.Free; end; end else begin SetSize(Source.Width, Source.Height); if Map(TMapAccess.Write, BitmapData) then try for I := 0 to TBitmapSurface(Source).Height - 1 do Move(TBitmapSurface(Source).Scanline[I]^, BitmapData.GetScanline(I)^, BitmapData.BytesPerLine); finally Unmap(BitmapData); end; end; end; В самом начале процедуры MaxSize получает значение 0 (ноль!), размеры картинки больше нуля и процедура влетает в бесконечный цикл на строке
            AssignFromSurface(ResampledSurface);
       
      Кто-то сталкивался? Есть мысли как лечить?
      Всем спасибо!
    • От ENERGY
      Нужно сделать компонент TGrid. Стандартный Grid не подходит, потому что нужно чтобы строки (raws) были разной высоты, а также чтобы была возможность соединять (сливать) ячейки.
      Я решил сделать его на основе TListView и его DynamicAppearance. Использовать кастомные объекты, отнаследованные от TListItemObject + возможность рисовать на Canvas каждого ListItem, например прямоугольники.
      Т.к. колонки он не поддерживает, есть идея использовать THeader и подстраивать их под размер своих колонок. Также важно быстродействие компонента.
      Как вы думаете есть ли в этом смысл?
      Возможно кто-то уже занимался подобным, и может что-нибудь посоветовать.
      Спасибо.
       
    • От ENERGY
      1. Можно ли установить разную высоту у ячеек (точнее raws)?
      2. Можно ли объединять ячейки?
      3. Если писать свой компонент, и отнаследоваться от ScrollBox - то при отрисовке всех ячеек, будут ли отрисовываться невидимые ячейки или TscrollBox игнорирует и не отрисовывает невидимую часть?  Или лучше стоит отнаследоваться от TScrollContent и высчитывать самостоятельно? Компонент не будет связан со стилями. Как будет быстрее в плане производительности компонента?
      4. Что лучше для этого случая TScrollContent или TScrollBox?
      4. Если 1 и 2 - нет, то придется писать свой компонент - возможно у вас будут какие то рекомендации на этот счет.
      Спасибо. Очень жду ваш ответ.
      @RoschinSpb
    • От hryasch
      Добрый день. Существует одна проблема, с которой уже несколько недель не могу справиться. Есть старый код под WinAPI, его нужно переделать под Android через firemonkey. И главная проблема - есть код, который из собственного формата делает HBITMAP из WinAPI. Фактически это структура, где последнее поле - указатели на биты. Это переделать легко, создав собственную копию такой структуры. Но теперь мне нужно перевести ее в TBitmap, и я не очень понимаю как это сделать.
       
    • От Mazzay
      Есть хоть какая-нибудь возможность зафиксировать первый столбец, чтобы он не прокручивался?
      То есть нужен аналог свойства FixedCols из VCL,
  • Последние посетители   0 пользователей онлайн

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