Variant変数のデータをTMemoryStreamに格納したいのですがこれだとやりすぎでしょうか

解決


jiro  2022-04-13 09:32:24  No: 150172  IP: [192.*.*.*]

複素数を変数とストリームの間でやりたいと考えております
以下のコードで試してみましたが妥当でしょうか
また、最後に必ずエラーが出て実現できていません

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.

編集 削除
take  2022-04-13 22:58:23  No: 150173  IP: [192.*.*.*]

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;

編集 削除
jiro  2022-04-14 22:05:04  No: 150178  IP: [192.*.*.*]

回答ありがとうございます。
検討してみます

編集 削除
jiro  2022-04-16 10:32:24  No: 150179  IP: [192.*.*.*]

見る向きを変えてみることでうまく理解ができました
つまづきに気が付くことができてよかったです

編集 削除