複素数を変数とストリームの間でやりたいと考えております
以下のコードで試してみましたが妥当でしょうか
また、最後に必ずエラーが出て実現できていません
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Variants,
System.VarCmplx,
System.TypInfo,
System.Classes;
var
obj: TCustomVariantType;
iv: IInterface;
ms: TMemoryStream;
v: Variant;
begin
try
{ TODO -oUser -cConsole メイン : ここにコードを記述してください }
ms:=TMemoryStream.Create;
FindCustomVariantType('TComplexVariantType',obj);
v:=VarAsComplex(6.0); //複素数の格納を目的としています
Writeln(obj.ClassName);
Readln;
iv:=obj;
IVarStreamable(iv).StreamOut(TVarData(v),ms);
v:='a'; //初期化の感じです
ms.Position:=0;
IVarStreamable(iv).StreamIn(TVarData(v),ms);
obj.Free;
Writeln(v);
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
RTTIを使って こんな感じのはどうでしょうか?
フォームにボタン1つとメモ帳を貼ってクラス定義とボタンクリックイベントにプログラムを追加
type
TTestComp = class(TComponent)
private
{ Private 宣言 }
FVValiant: Variant;
published
property VValiant : Variant read FVValiant write FVValiant;
end;
function TForm1.BinToTextOut(m: TMemoryStream): string;
var
StrStream: TStringStream;
s: string;
begin
StrStream := TStringStream.Create(s);
try
m.Seek(0, soFromBeginning);
ObjectBinaryToText(m, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
FTestComp : TTestComp;
ms: TMemoryStream;
begin
FTestComp := TTestComp.Create(Self);
FTestComp.VValiant := 1.1;
ms := TMemoryStream.Create;
try
ms.WriteComponent(FTestComp);
ms.SaveToFile('test.bin');
Memo1.Lines.Text := BinToTextOut(ms); // メモ帳に保存結果を出力
finally
ms.Free;
end;
ms := TMemoryStream.Create;
try
ms.LoadFromFile('test.bin');
ms.ReadComponent(FTestComp);
finally
ms.Free;
end;
end;
回答ありがとうございます。
検討してみます
見る向きを変えてみることでうまく理解ができました
つまづきに気が付くことができてよかったです
ツイート | ![]() |