FireMonkey Canvas.DrawLine в Windows XP

#delphi #delphi-xe2 #firemonkey

#delphi #delphi-xe2 #firemonkey

Вопрос:

Как я могу нарисовать линию? Этот код ничего не отображает :

 var my_point_1, my_point_2: tPointF;

Canvas.Stroke.Color := claBlue;
Canvas.Stroke.Kind:= tBrushKind.bkSolid;

my_point_1.X:= 100;
my_point_1.Y:= 100;
my_point_2.X:= 120;
my_point_2.Y:= 150;

Canvas.BeginScene;
Canvas.DrawLine(my_point_1, my_point_2, 1.0);
Canvas.EndScene;
  

Windows XP с пакетом обновления 3 (TOSVersion.toString — это «Версия 5.1, сборка 2600, 32-разрядная версия», установлено обновление Delphi XE2 1)

Комментарии:

1. Я тестирую ваш код в Win 7 x64 и работает нормально, но на виртуальной машине с Win XP сбой. используете ли вы виртуальную машину для тестирования кода?

2. Кстати, добро пожаловать в StackOverflow, я надеюсь, что вы останетесь здесь на некоторое время, чтобы поделиться своими знаниями. 🙂

3. RRUZ: спасибо за приветствие. О XP, нет, это простой ПК с XP square на нем

4. @Ken Я [delphi] снова добавляю тег, чтобы вопрос был более наглядным, я знаю, что FireMonkey связан только с Delphi-xe2, но также принадлежит [delphi] 🙂

5. @RRUZ: Достаточно справедливо. 🙂 Я удалил его, потому что он бесполезен для тех, кто использует Delphi 1 — Delphi XE, что составляет подавляющее большинство пользователей Delphi.

Ответ №1:

Вы ожидаете, что это будет легко — как я и сделал. Однако это не так. Для FireMonkey это первые дни, и Embarcadero, похоже, перегружен отзывами.

При использовании canvas непосредственно в TForm вы должны признать, что результат является изменчивым, т. Е. Он исчезнет при первом перерисовке (изменение размера, перекрытие других окон и т. Д.).).

Это работает для меня на нескольких машинах:

Создайте новый проект FM-HD, добавьте кнопку и обработчик:

 procedure TForm1.Button1Click(Sender: TObject);
var pt0,pt1 : TPointF;
begin
  pt0.Create(0,0);
  pt1.Create(100,50);
  Canvas.BeginScene;
  Canvas.DrawLine(pt0,pt1,1);
  Canvas.EndScene;
end;
  

Запустите, нажмите кнопку и (надеюсь): вуаля!

Однако на временном холсте это немного сложнее (читай: глючит?)

Создайте новый проект, на этот раз с двумя TButtons и TImage — установите (слева, вверху) что-то вроде (150,150), чтобы отличить его холст от холста TForm.

Добавьте этот код и назначьте обработчикам (дважды щелкните форму и кнопки):

 procedure TForm1.FormCreate(Sender: TObject);
begin
  // Without this, you normally get a runtime exception in the Button1 handler
  Image1.Bitmap := TBitmap.Create(150,150);
end;

procedure TForm1.Button1Click(Sender: TObject);
var pt0,pt1 : TPointF;
begin
  pt0.Create(0,100);
  pt1.Create(50,0);
  with Image1.Bitmap do begin
    Canvas.BeginScene;
    Canvas.DrawLine(pt0,pt1,1);
    BitmapChanged;  // without this, no output 
    Canvas.EndScene;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
// This demonstrates that if you try to access the Canvas of the TImage object (and NOT its bitmap)
// you are sometimes defaulted to the Canvas of the Form (on some configurations you get the line directly on the form).
var pt0,pt1 : TPointF;
begin
  pt0.Create(0,100);
  pt1.Create(50,0);
  with Image1 do begin
    Canvas.BeginScene;
    Canvas.DrawLine(pt0,pt1,1);
    Canvas.EndScene;
  end;
end;
  

Последнее замечание: как только вы начнете играть со свойством ScanLine растрового изображения, убедитесь, что вы делаете это ВНЕ раздела BeginScend / EndScene, а после того, как вы закончите, создайте «фиктивный» раздел BeginScend / EndScene, чтобы убедиться, что ваши изменения не будут потеряны:-(
Я мог бы иногда возвращаться к этому, если это необходимо; o)

Удачи! Carsten

Комментарии:

1. Спасибо, BitmapChanged следует поместить после EndScene (XE2 Update4).