#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).