More problems with FMX, writing to images. Here is the programme in text form (needs 4 buttons and a memo), with comments as to which attempt does what.
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects, FMX.Memo.Types,
FMX.ScrollBox, FMX.Memo;
type
TForm1 = class(TForm)
ButtonGo: TButton;
ButtonExit: TButton;
ButtonN1: TButton;
Image1: TImage;
ButtonN2: TButton;
Memo1: TMemo;
ButtonN3: TButton;
procedure ButtonExitClick(Sender: TObject);
procedure ButtonGoClick(Sender: TObject);
procedure DoIt(Form : tForm; var Image1 : tImage);
procedure ButtonN1Click(Sender: TObject);
procedure ButtonN2Click(Sender: TObject);
procedure ButtonN3Click(Sender: TObject);
private
{ Private declarations }
ImageTop : tImage;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.ButtonExitClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.ButtonGoClick(Sender: TObject);
begin
//Briefly flashes the image.
DoIt(Form1, ImageTop);
end;
procedure TForm1.ButtonN1Click(Sender: TObject);
var
rect : tRectF;
brush : tBrush;
begin
//Briefly flashes the image
brush := tBrush.Create(tBrushKind.Solid, tAlphaColorRec.Springgreen);
if Image1.Bitmap = nil then Image1.Bitmap := tBitmap.Create(200, 200);
rect := tRectF.Create(50, 50, 100, 100);
try
Image1.Canvas.BeginScene;
Image1.Canvas.FillRect(rect, 1, brush);
Image1.Canvas.EndScene;
except
Memo1.Lines.Add('Error on N1');
end;
Memo1.GoToTextEnd;
brush.Destroy;
end;
procedure TForm1.ButtonN2Click(Sender: TObject);
var
rect : tRectF;
brush : tBrush;
begin
//Comes up with Handle noit allocated, then access violation reading address 8
brush := tBrush.Create(tBrushKind.Solid, tAlphaColorRec.Springgreen);
if Image1.Bitmap = nil then Image1.Bitmap := tBitmap.Create(200, 200);
rect := tRectF.Create(50, 50, 100, 100);
try
Image1.Bitmap.Canvas.BeginScene;
Image1.Bitmap.Canvas.FillRect(rect, 1, brush);
Image1.Bitmap.Canvas.EndScene;
except
Memo1.Lines.Add('Error on N2');
end;
Memo1.GoToTextEnd;
brush.Destroy;
end;
procedure TForm1.ButtonN3Click(Sender: TObject);
var
rect : tRectF;
brush : tBrush;
begin
//Comes up with accessv violation reading address 20
brush := tBrush.Create(tBrushKind.Solid, tAlphaColorRec.Springgreen);
if Image1.Bitmap = nil then Image1.Bitmap := tBitmap.Create(200, 200);
rect := tRectF.Create(50, 50, 100, 100);
try
Image1.Canvas.Bitmap.Canvas.BeginScene;
Image1.Canvas.Bitmap.Canvas.FillRect(rect, 1, brush);
Image1.Canvas.Bitmap.Canvas.EndScene;
except
Memo1.Lines.Add('Error on N3');
end;
Memo1.GoToTextEnd;
brush.Destroy;
end;
procedure tForm1.DoIt(Form : tForm; var Image1 : tImage);
var
rect : tRectF;
brush : tBrush;
begin
// Trying to see if I can do all this via a subroutine.
brush := tBrush.Create(tBrushKind.Solid, tAlphaColorRec.Springgreen);
if Image1 = nil then
begin
Image1 := tImage.Create(Form);
Image1.Bitmap := tBitmap.Create(200, 200);
Image1.Parent := Form;
Image1.BringToFront;
end;
rect := tRectF.Create(50, 50, 100, 100);
try
Image1.Canvas.BeginScene;
Image1.Canvas.FillRect(rect, 1, brush);
Image1.Canvas.EndScene;
except
Memo1.Lines.Add('Error on DoIt');
end;
Memo1.GoToTextEnd;
brush.Destroy;
end;
end.