Перейти к содержанию
Fire Monkey от А до Я

Камышев Александр

Пользователи
  • Постов

    235
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные Камышев Александр

  1. CBuilder XE7, приложение под андроид. 

     

    На форме есть несколько TImageControl с загруженными изображениями.

    Тестирование показало, на андроид 5.x приложение крашится на запуске, с сообщением "Приложение было остановлено".

    До 5.x все отлично работает. Пустой TImageControl приложение такой ошибки не дает, только с изображением. 

     

    Кто нибудь знает, что это за беда и какие есть варианты решения?

     

    Вот в этом обсуждении http://fire-monkey.ru/topic/159-kak-dobavit-v-svoi-komponent-timage-i-dat-vozmozhnos/?p=569

    есть 3 и 4 пункт, что вроде как можно в битмапе хранить изображение.

    Уточните, как добавить битмап в published секцию(формы я так понял?), и загрузить свое изображение?

     

     

    Добрый день,

     

    Если есть исходники FMX, то посмотрите на реализацию контрола FMX.StdCtrls.TImageControl, не стесняйтесь их изучать. Там как раз аналогичная ситуация, есть встроенный TImage, в который загружается пользовательское изображение.

     

    Общие правила такие:

    1. Решаем, где будем хранить контейнер для изображения TImage: в стиле или создавать динамически при создании нашего контрола?
    2. Любое изображение нужно где-то хранить, вариант с загрузкой по пути не самый удачный на мой взгляд. Так как пути на разных платформах будут разными, да и возникает необходимость разворачивания файлов изображений вместе с пакетом (Deployment Manager - Включение своих файлов в приложение). Единственный плюс при этом - это экономия на памяти и ускорение запуска программы, за счет отложенной загрузки изображения. Это может стать решающей причиной для хранения изображения по пути к файлу со всеми вытекающими.
    3. Изображение храним в TBitmap, который создается динамически. Доступ к нему открывается в published секции для работы в DesignTime. В этом случае пользователь сможет загрузить свое изображение в дизайн тайме и при этом оно при сохранении формы автоматически сериализуется в ресурсы формы, а в последующем и восстановится.
    4. Осталось настроить загрузку изображения непосредственно в компонент отображения. В нашем случае в TImage. Если TImage создается динамически нашим контролом и не зависит от стиля, то смело грузим картинку из TBitmap в TImage.Bitmap. Если же контейнер загружается из стиля, то грузим картинку в перекрытом методе ApplyStyle, который вызывается, когда стиль загружен для контрола

     

  2. Сделать антиалиасинг пока не получилось, но... Изначально неправильная постановка задачи, не нужен буфер для рисования, это же не GDI. Прорисовка в PaintBox на OnPaint с заливанием фона, копированием слоя подложки и иконок, рисование ломаных линий и фигур, прозрачность, антиалиасинг и т.д. абсолютно не вызывает  проблем с ресурсами и морганием, все рисуется быстро и плавно.

  3. протестировал 3 варианта:

    1. правка FMX.Graphics.pas как указано выше

    2. пишу на с++, можно исправить файл FMX.Graphics.hpp

     заменить код 

    __property TCanvasQuality Quality = {read=FQuality, nodefault};

    на 

    __property TCanvasQuality Quality = {read=FQuality, write=FQuality, nodefault};

    после этого можно 

    bmp_buf->Canvas->Quality = TCanvasQuality::HighQuality;

    3. Создать новую канву как указано выше

    TCanvas *MyCanvas = TCanvasManager::CreateFromBitmap( bmp_buf, TCanvasQuality::HighQuality );

    во всех трех случаях свойство Quality под debug имеет значение HighQuality, проверял перед DrawPath:

    bool b = MyCanvas->Quality == TCanvasQuality::HighQuality;

    и во всех вариантах эффекта не было... :(

    неспроста Quality для формы нужно ставить в design-time

    что происходит при сборке, из-чего включается антиалиасинг?

    .

  4. в разделе Антиалиасинг обсуждалось присвоение свойству Quality формы HighQuality и рисование на канве.

    если рисовать сразу к примеру в PaintBox или на канву формы, то это работает.

    по опыту GDI, стандартно отрисовывают буфер, а уже его копируют на канву визуальных компонентов.

     

    по коду, буфер:

    bmp_buf = new TBitmap();bmp_buf->Width = window_rect.Width();
    bmp_buf->Height = window_rect.Height();
    

    рисование:

    TPathData *pd = new TPathData;
    
    pd->MoveTo( Point( 100, 100 ) );
    pd->LineTo( Point( 150, 100 ) );
    pd->LineTo( Point( 100, 150 ) );
    
    bmp_buf->Canvas->Stroke->Thickness = 5;
    bmp_buf->Canvas->Stroke->Kind = TBrushKind::Solid;
    bmp_buf->Canvas->Stroke->Dash = TStrokeDash::Solid;
    bmp_buf->Canvas->Stroke->Color = (TAlphaColor)TAlphaColorRec::Black;
    
    bmp_buf->Canvas->DrawPath( pd, 1 );
    
    delete pd;

    на OnPaint копирование буфера:

    pbMap->Canvas->BeginScene();pbMap->Canvas->DrawBitmap( bmp_buf, bmp_rect, window_rect, 1, false );
    pbMap->Canvas->EndScene();

    в результате все быстро, без морганий, но антиалиасинга нет.

    у канвы буфера bmp_buf есть свойство Quality: 
    __property TCanvasQuality Quality = {read=FQuality, nodefault}; - только чтение

    принимает значения:

    enum class DECLSPEC_DENUM TCanvasQuality : unsigned int { ccSystemDefault, ccHighPerformance, ccHighQuality };

    по умолчанию ccSystemDefault

     
    вот как бы и вопрос, как создать буферный TBitmap с TCanvas, у которого Quality == ccHighQuality?
    возможно есть другие варианты рисовать ломаные линии с антиалиасинг?
  5. CBuilder XE7

     

    в StringGrid 14 StringColumn, отображаются корректно:

     

     post-1634-0-14438600-1444386800_thumb.pn

     

    до вот этого куска кода: 

     

    for ( int i = 0; i < sgVehicles->ColumnCount; i++ )

      {

        sgVehicles->Columns->Width = w;

      }

     

    после изменения ширины Column отображаются только 6 первых, с наложением полей друг на друга

    ColumnCount остается равным 14

    Column создавал динамически, пробовал в ItemEditor, эффект остается.

    Замена TStringGrid на TGrid также не помогла

     

    post-1634-0-07635800-1444386542_thumb.pn

×
×
  • Создать...