掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
オブジェクトの動的コピーを高速化する方法は? (ID:46039)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
Quest様、KHE00221様、 ご回答、情報提供いただきありがとうございます。 また、質問の背景などをご説明をしておらず大変申し訳ありません。 背景といたしまして、 ある特定の顧客様向けに開発している、業務アプリケーションの開発を行っているのですが、ある画面の入力項目だけは可変的に増やせるようにしたいという要件をいただいています。 数に関しては、制限は設けない仕様としていますが、 実際は「数1000」そこまではいくことはないと思います。 ただし、場合によっては、数100規模になる場合もあること、 また、実際はデータベースとの連携処理も入っている関係で、 1分ぐらいフリーズしてしまう状況です。 (ボトルネックがコントロールの生成処理となっています。) ご指摘いただいた通り、数100を超えるような場合も、 画面上に一度に表示せず、スクロールで表示しますので、 下の方のコントロールは、スクロールされるまで、生成しないようにする などの代案の方法も検討しております。 (ただ、できれば代案を使用せずにパフォーマンスを改善したいと思っています。) また、WriteCompnentsRes、ReadComponentsResを使用する方法に 変更したのですが、処理速度が改善が変わりませんでした。 変更後のコードを以下に記載いたします。 ■WriteCompnentsRes/RaedComponentsResを使用するコード procedure TForm1.Button1Click(Sender: TObject); var MemoryStream : TMemoryStream; Edit, Edit2 : TEdit; i, Num : Integer; begin Edit := TEdit.Create(nil); //コピー元コントロールを1つ作成 Edit := Edit1; Edit.Name:= ''; //Nameプロパティを一時的に空にする(複製時にエラーにならないようにするため //コピー元のエディットコントロールをメモリストリームにコピー MemoryStream := TMemoryStream.Create; try MemoryStream.WriteComponentRes('Edit', Edit); Num := 100; //実験として100個複製するものとする for i := 0 to Num do begin MemoryStream.Position := 0; Edit2 := TEdit.Create(nil); MemoryStream.ReadComponentRes(Edit2); with Edit2 do begin Parent :=Panel1; //複製できたか確認するため少しずらして表示する Left := TPanel(Parent).ControlCount * 2; end; end; finally MemoryStream.Free; end; Edit.Free; end; 修正前コードと処理時間が変わらない理由ですが、 ReadComponentsResの対象コントロール(Edit2)に あらかじめCreateの命令が入れているためと思います。 (あらかじめTEdit.Createをしないと ReadComponentsResの処理でアドレス違反のエラーが発生してしまうため、 直前にCreateするように記述しています。) ReadComponentsResを使用する場合も、やはりCreateを使用するしかないのでしょうか? (それとも、使い方に誤りがあるのでしょうか?) インターネットにてReadComponentsResのサンプルコードを探したのですが、 見つけることができず、使い方も不安な状況でございます… なお、Delphiのバージョンは2007となっています。(いまさらで申し訳ありません。。。) もしわかればで構いませんのでご教授いただければ幸いです。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.