名前 題名 ▼ takiさん > コンポーネントを文字列化し、文字列からコンポーネントを生成しているのですが、 > TMemoの文字列からコンポーネントを生成する過程で > 「Memo99は親ウィンドウを持っていません」というエラーが発生します。 > TEdit、TLabelはエラーは出ません。 > それぞれコメントアウトしたり外したりして試しました。 > > Windows7 Pro+DelphiXE4 Starter Update 1 > Windows10 Pro+Delphi10.2 Starter > 同じ内容のエラーがMemoだけに出ます。 > > 以下が試したコードです。 > 大元は > http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Classes_TStream_ReadComponent.html > > > unit Unit1; > > interface > > uses > Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, > Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids; > > type > TForm1 = class(TForm) > Button1: TButton; > Button2: TButton; > Button3: TButton; > Memo1: TMemo; > procedure Button1Click(Sender: TObject); > procedure Button2Click(Sender: TObject); > procedure Button3Click(Sender: TObject); > private > { Private 宣言 } > public > { Public 宣言 } > published > > end; > > var > Form1: TForm1; > Memo99 : TMemo; > Edit99 : TEdit; > Label99 : TLabel; > > > implementation > > {$R *.dfm} > > function ComponentToStringProc(Component: TComponent): string; > var > BinStream:TMemoryStream; > StrStream: TStringStream; > s: string; > begin > BinStream := TMemoryStream.Create; > try > StrStream := TStringStream.Create(s); > try > BinStream.WriteComponent(Component); > BinStream.Seek(0, soFromBeginning); > ObjectBinaryToText(BinStream, StrStream); > StrStream.Seek(0, soFromBeginning); > Result:= StrStream.DataString; > finally > StrStream.Free; > end; > finally > BinStream.Free > end; > end; > > function StringToComponentProc(Value: string): TComponent; > var > StrStream:TStringStream; > BinStream: TMemoryStream; > begin > StrStream := TStringStream.Create(Value); > try > BinStream := TMemoryStream.Create; > try > ObjectTextToBinary(StrStream, BinStream); > BinStream.Seek(0, soFromBeginning); > Result:= BinStream.ReadComponent(nil); > finally > BinStream.Free; > end; > finally > StrStream.Free; > end; > end; > > // コンポーネントを文字列化 > procedure TForm1.Button1Click(Sender: TObject); > begin > Memo1.Text := ComponentToStringProc(Memo99); > // Memo1.Text := ComponentToStringProc(Edit99); > // Memo1.Text := ComponentToStringProc(Label99); > end; > > // 文字列からコンポーネントを生成 > procedure TForm1.Button2Click(Sender: TObject); > begin > if Assigned(Memo99) then Memo99.Free; > Memo99 := (StringToComponentProc(Memo1.Text) as TMemo); // <- ここでエラー > Memo99.Parent := Form1; > Memo99.Left := 200; > Memo99.Visible := true; > // > { > if Assigned(Edit99) then Edit99.Free; > Edit99 := (StringToComponentProc(Memo1.Text) as TEdit); // <- 大丈夫 > Edit99.Parent := Form1; > Edit99.Left := 200; > Edit99.Visible := true; > } > // > { > if Assigned(Label99) then Label99.Free; > Label99 := (StringToComponentProc(Memo1.Text) as TLabel); // <- 大丈夫 > Label99.Parent := Form1; > Label99.Left := 200; > Label99.Visible := true; > } > end; > > // 動的にコンポーネントを生成 > procedure TForm1.Button3Click(Sender: TObject); > begin > > Memo99 := TMemo.Create(Self); > Memo99.Parent := Self; > Memo99.Name := 'Memo99'; > Memo99.Top := 100; > Memo99.Left := 100; > Memo99.Width := 200; > Memo99.Height := 20; > // > { > Edit99 := TEdit.Create(Self); > Edit99.Parent := Self; > Edit99.Name := 'Edit99'; > Edit99.Top := 100; > Edit99.Left := 100; > Edit99.Width := 200; > Edit99.Height := 20; > } > // > { > Label99 := TLabel.Create(Self); > Label99.Parent := Self; > Label99.Name := 'Label99'; > Label99.Top := 100; > Label99.Left := 100; > Label99.Width := 200; > Label99.Height := 20; > } > end; > > > initialization > > RegisterClass(TEdit); > RegisterClass(TMemo); > RegisterClass(TLabel); > > end. > > エラーの原因が全く分かりません。 > 同じような文字列ができているのですが、Memoだけがダメです。 GIF,JPEG,PNG画像ファイル及びLZH,ZIPファイルをアップロードできます.600 x 1200 ピクセルを超える画像は縮小表示されます(画像クリックで拡大表示). (上限122000(120k)バイト) 削除キー Link