掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
オブジェクトの動的コピーを高速化する方法は? (ID:46036)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
フォーム上にエディットボックスを動的に生成するプログラムを作っています。 (ユーザーがコントロール数をテキストで指定し、その数に応じた、 動的にエディットボックスを表示するようなプログラムを作っています。) そこで、以下の様なTEdit.Createを作成するプログラムを実装しました。 (サンプル用に加工していますのでご了承ください。) ■修正前のコード //Panel1…複製したコントロールを表示するパネル procedure TForm1.Button1Click(Sender: TObject); var i, Num : Integer; begin Num := 100; //実験として100個複製するものとする for i := 0 to Num do begin with TEdit.Create(Panel1) do begin Parent :=Panel1; //複製できたか確認するため少しずらして表示する Left := TPanel(Parent).ControlCount * 2; end; end; end; しかし、上記のコードですと、 コントロール数が1000を超えるような場合に処理が遅くなってしまうため、 高速化できないか悩んでいます。 そこで、以下の様なTMemoryStreamを使用したコードを 作成したのですが効果がみられませんでした。 (修正前よりも若干遅くなってしまいました) ■修正後のコード //Panel1…複製したコントロールを表示するパネル procedure TForm1.Button1Click(Sender: TObject); var MemoryStream : TMemoryStream; Edit : TEdit; Writer : TWriter; Reader : TReader; i, Num : Integer; begin Edit := TEdit.Create(nil); //コピー元コントロールを1つ作成 Edit.Name:= ''; //Nameプロパティを一時的に空にする(複製時にエラーにならないようにするため) //コピー元のエディットコントロールをメモリストリームにコピー MemoryStream := TMemoryStream.Create; try Writer:=TWriter.Create(MemoryStream, SizeOf(Edit)); try Writer.RootAncestor := nil; Writer.Ancestor := nil; Writer.Root := Control.Owner; Writer.WriteSignature; Writer.WriteComponent(Edit); Writer.WriteListEnd; finally Writer.Free; end; MemoryStream.Position:=0; Reader:=TReader.Create(MemoryStream, SizeOf(Edit)); try Num := 100; for i := 0 to Num do begin Reader.ReadComponents(Panel1.Owner,Panel1,ReadComponentsProc); Reader.Position := 0; end; finally Reader.Free; end; finally MemoryStream.Free; end; Edit.Free; end; procedure TForm1.ReadComponentsProc(Component:TComponent); begin //複製できたか確認するため少しずらして表示する TEdit(Component).Left := TPanel(TEdit(Component).Parent).ControlCount * 2; end; 修正後のコードはメモリレベルでコピーとなりますので、 修正前より早くなることを期待していたのですが、 何か方法が悪いのか?と考えています。。。 ■質問内容 もし、上記「修正後のコード」にて、パフォーマンス的な観点で 悪い点あればご教授いただいてもよろしいでしょうか? また、もし他に良い方法(TMemoryStream以外を使用する方法など)が あればお知らせいただいてもよろしいでしょうか? 長文となってしまい申し訳ありませんが、よろしくお願いいたします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.