Ага, разобрался - все дело в объявлении TagObject как "слабой" ссылки: [Weak] FTagObject: TObject, т.е. присвоение этому полю не увеличивает счетчик ссылок и объект будет жив только в пределах вашей процедуры. Грубо говоря в "слабой" мы храним объект до тех пор, пока он хранится где то еще.
Вам НЕОБХОДИМО создавать ГЛОБАЛЬНУЮ структуру для хранения этих объектов. К примеру сохранит картинки в TObjectList (модуль System.Generics.Collections), и после этого уже присваивать их в Image2.TagObject
Вот работающий вариант вашего кода:
unit copystream;
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, System.Generics.Collections;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
SaveBut: TButton;
LoadBut: TButton;
procedure SaveButClick(Sender: TObject);
procedure LoadButClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FImageStore : TObjectList<TMemoryStream>;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
FImageStore:=TObjectList<TMemoryStream>.Create;
end;
procedure TForm1.LoadButClick(Sender: TObject);
begin
if Assigned(Image2.TagObject) then
Image2.Bitmap.LoadFromStream(Image2.TagObject as TMemoryStream);
end;
procedure TForm1.SaveButClick(Sender: TObject);
Var LStream : TMemoryStream;
begin
LStream:=TMemoryStream.Create;
FImageStore.Add(LStream);
try
Image1.Bitmap.SaveToStream(LStream);
finally
Image2.TagObject:=LStream;
end;
end;
end.
С того момента, как "стал рассматривать" TGrid непосредственно как компонент отображения существующих данных, работать с ним стало проще и приятнее. В похожих ситуация работаю непосредственно с данными (выборкой). То, что FDQuery и Grid связаны через LiveBinding, значения не имеет:
FDQuery1.RecNo := Grid1.Selected+1;
... := FDQuery1.FieldByName['id'].AsInteger;
//или по порядковому номеру:
... := FDQuery1.Fields.Fields[0].AsInteger;
//или тип Variant:
... := FDQuery1['id']
//и т.д.
В зависимости от необходимого способа реакции код можно подвесить на onClick, onMouseMove и т.д. по желанию.