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

Лидеры

Популярный контент

Показан контент с высокой репутацией 03.01.2014 во всех областях

  1. Добрый вечер В моей статье, я описывал способ работы с TBitmap. В вашем же случае, вы работаете с канвой. У канвы формы нету Bitmap. Поэтому ваш код падает при попытке вызывать Map у не существующего объекта. Для решения вашей задачи, нужно: Помнить о самое главной вещи при работе с канвой в FMX. Это то, что выполнять отрисовку можно только в определенный моменты времени (в отличии от VCL). Непосредственно, когда получен системный запрос на отрисовку сцены (формы), а именно в событиях OnPaint, OnPainting (в вашем случае у панели). Знать, что канва существует в единственном экземпляре в рамках одной формы (опять же в отличии от VCL, где свою канву имеет каждый оконный контрол). Резюмирую, все выше сказанное. procedure TForm4.Panel1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var X, Y: Integer; PixelRegion: TRectF; begin Canvas.Stroke.Color := TAlphaColorRec.Red; for X := 0 to Floor(Panel1.Width) - 1 do for Y := 0 to Floor(Panel1.Height) - 1 do begin PixelRegion := TRectF.Create(TPointF.Create(X, Y), 1, 1); Canvas.DrawRect(PixelRegion, 0, 0, AllCorners, 1); end; end; Задаем обработчик на событие TPanel.OnPaint. Используя канву переданную через параметры, задаем цвет кисти и отрисовываем логические пиксели. Для закраски пикселей, я воспользовался обычной отрисовкой квадрата с шириной в 1 логический пиксель. Если речь идет об андроиде, то из-за возможного наличия экрана с повышенной плотностью пикселей (Screen Scale) это код для экранов со Scale отличных от 1 и не кратных 2, будет рисовать сдвоенные/размазанные линии. Чтобы этого избежать, нужно перед отрисовкой выполнить округление региона до физических пикселей при помощи метода TCanvas.AlignToPixel. procedure TForm4.Panel1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); var X, Y: Integer; PixelRegion: TRectF; PixelPos: TPointF; begin Canvas.Stroke.Color := TAlphaColorRec.Red; for X := 0 to Floor(Panel1.Width) - 1 do for Y := 0 to Floor(Panel1.Height) - 1 do begin PixelPos := Canvas.AlignToPixel(TPointF.Create(X, Y)); PixelRegion := TRectF.Create(PixelPos, 1, 1); Canvas.DrawRect(PixelRegion, 0, 0, AllCorners, 1); end; end;
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...