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

Steepe_Hare

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

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

  • Посещение

Сообщения, опубликованные Steepe_Hare

  1. 18 минут назад, Alexander сказал:

    Проверьте, что загружается в MyBitmap. Например, через savetofile. Или весь Image1 чёрный? 

    Ошибку дает при сохранении:

    ---------------------------
    Debugger Exception Notification
    ---------------------------
    Project Project1.exe raised exception class EBitmapSavingFailed with message 'Saving bitmap failed.'.
    ---------------------------
    Break   Continue   Help   
    ---------------------------

     

  2. Как ведет себя приложение, написанное для Андроид, со множеством таймеров? Не подтормаживает ли? Корректно ли считают время таймеры?

    Делаю мобильное приложение что-то вроде Фермы или Запорожья, и там многое построено на отсчетах промежутков времени.

  3. Рисует черный квадрат, а битмап не виден(

        if OpenDialog1.Execute then
        begin
          MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
          MyRect := TRectF.Create(50, 30, 65, 45);
          Image1.Bitmap.Canvas.BeginScene;
          Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 1);
          Image1.Bitmap.Canvas.EndScene;
          MyBitmap.Free;
        end;
    

     

  4. Уже который день замечаю такую ситуацию.

    Исходные данные: Windows 7 на компе, Delphi Berlin 10.1, отладка на смартфоне Samsung Galaxy S4. Запускаю сеанс Берлина. После трех-четырех запусков приложения из среды на мобильнике при старте - просто черный экран. В среде недоступна функция Program Reset (Ctrl + F2). Если попытаться закрыть среду, то сообщение "This current debug session must end before the requested operation can complete.  Please indicate how you would like to end the debug session." (Terminate, Detach, Cancel, Help) и зависание. Приходится просто снимать bds.exe в Диспетчере задач.

    Android-приложение при этом корректно создается, и если его запускать с Приложений мобильника, то оно запускается и работает нормально.

  5. Нашел причину ошибки!

    Если в самой среде на этапе дизайн-тайм загрузить картинку, то расчерчивание в ран-тайме идет корректно.

    Но если грузить картинку в битмап в OnCreate из ресурсов, то расчерчивание странным образом идет.  Часть линий как будто накладывается друг на друга.

    Как исправить во втором случае? Спасибо заранее.

  6. Объясните, пожалуйста, почему этот простой код работает по-разному в Win32 и на Андроиде? Картинка 150x200 в битмап уже загружена и нужно ее расчертить.
     

      Image1.Bitmap.Canvas.BeginScene;
      try
        Image1.Bitmap.Canvas.Stroke.Kind := TBrushKind.Solid;
        Image1.Bitmap.Canvas.Stroke.Color := TAlphaColors.Blue;
        for I := 0 to 9 do
          Image1.Bitmap.Canvas.DrawLine(TPointF.Create(I * 15, 0),
            TPointF.Create(I * 15, Image1.Bitmap.Height), 1);
    
        for J := 0 to 9 do
          Image1.Bitmap.Canvas.DrawLine(TPointF.Create(0, J * 20),
            TPointF.Create(Image1.Bitmap.Width, J * 20), 1);
    
      finally
        Image1.Bitmap.Canvas.EndScene;
      end;

    Под Виндой создается точная сетка 10x10, а под Андроид как будто другая система координат и территория делится на огромные квадраты (больше, чем надо).

  7. 3 часа назад, Brovin Yaroslav сказал:

     

    На Windows используется GDI+/Direct2D канва, которая может работать по другому. А на мобильных платформах GPU, поэтому у вас и возникает ошибка.

     

    Большое спасибо за подробное объяснение

  8. 13 минут назад, Brovin Yaroslav сказал:

    Убедитесь, что Image.Bitmap есть.

    Извиняюсь, но не совсем вас понял. Image.Bitmap пустой в дизайн-тайме (а он обязан быть заполненным??). Картинка туда грузится из ресурсов только в ран-тайме.

  9. 24 минуты назад, Brovin Yaroslav сказал:

    В какой момент создаете битмап?

    Вот этот код дает ошибку. Что в нем не так?

    var
      MemStream: TMemoryStream;
    begin
      Image1.Bitmap.Canvas.BeginScene;
      MemStream := TMemoryStream.Create;
      try
        Image1.Bitmap.Clear(0);
        with TResourceStream.Create(hInstance, PChar('territoria'), RT_RCDATA) do
          try
            SaveToStream(MemStream);
          finally
            Free;
          end;
    
        MemStream.Position := 0;
        Image1.Bitmap.LoadFromStream(MemStream);
      finally
        Image1.Bitmap.Canvas.EndScene;
        MemStream.Free;
      end;

    Image1 в дизайн-тайме пустой.

  10. 53 минуты назад, ZuBy сказал:

    ну желательно код показать

    Выбрасывает на модуль FMX.Canvas.GPU в конструктор:

     

    constructor TCanvasGpu.CreateFromBitmap(const ABitmap: TBitmap;
      const AQuality: TCanvasQuality = TCanvasQuality.SystemDefault);

    ....
    begin
      ....
      if not Bitmap.HandleAllocated then
        raise ECanvasException.Create('Handle not allocated');

  11. Под Windows 32  приложение собирается и работает отлично, под Android при запуске из RAD-среды сразу говорит: Project project1.apk raised exception class ECanvasException with message 'Handle not allocated' и отказывается работать.

    В чем может быть причина?

  12. 36 минут назад, MAD_EVAL сказал:

    Покажите пример. Opacity это single от 0 до 1....

    http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FMXTCanvasDrawFunctions_(Delphi)

    procedure TForm1.DrawLineClick(Sender: TObject);
    var
      p1, p2: TPointF;
    begin
      // sets the ends of the line to be drawn
      p1 := TPointF.Create(20, 2);
      p2 := TPointF.Create(350, 400);
      Image1.Bitmap.Canvas.BeginScene;
      // draws the line on the canvas
      Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
      Image1.Bitmap.Canvas.EndScene;
    end;
  13. 1 час назад, ZuBy сказал:

    обязательно нужно очистить

    Вот так получше?

        Image1.Bitmap.Clear(TAlphaColors.White);
        if OpenDialog1.Execute then
        begin
          MyRect := TRectF.Create(50, 30, 150, 200);
          MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
          Image1.Bitmap.Canvas.BeginScene;
          try
            Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20);
          finally
            Image1.Bitmap.Canvas.EndScene;
            MyBitmap.Free;
          end;
        end;

     

  14. Пример, взятый из Интернета:
     

      // clears the canvas
      Image1.Bitmap.Clear(TAlphaColors.White);
    
        // loads the bitmap using the TOpenDialog.
        if OpenDialog1.Execute then
          MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
        // set the  MyRect coordinates
        MyRect := TRectF.Create(50, 30, 150, 200);
        Image1.Bitmap.Canvas.BeginScene;
        // draws on the rectangle specified by MyRect the area from MyBitmap specified by MyRect
        Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20);
        Image1.Bitmap.Canvas.EndScene;

    Если мы, допустим, раз в секунду повторяем эту процедуру, постоянно загружая в Image1 новый MyBitmap, то нужно ли делать MyBitmap.Free или очистка памяти происходит сама?

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