掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
オブジェクトの動的コピーを高速化する方法は? (ID:46040)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>エディットボックスが同時に1000個以上必要なシチュエーションを >想像できないので、的をはずしているかもしれません。 私も,そのような状況が想像できなかったし,たとえ数100個としても, それを選択する,つまり利用する方の状況が何とも不思議な感じがします. ところで,一般に,コントロールの描画には時間がかかります. 描画の更新を停止しておけば,気持ちですが,速くなります. 以下のコードは Windows 7 U64(SP1) + Delphi XE で確認していますが, Delphi 2 以降,Windows 95 以降であれば動作するハズです. 描画の「更新を停止」すると速くなるという参考です. 今回の用途に応用できるかどうかは分かりません. 速いとか遅いとかを問題にしているので,当然,時間を計測しています. uses MMSystem; const Num = 1000; //-------------------------------------------------------------- // オブジェクトの生成だけなら速い //-------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); var i : Integer; StartTime : DWORD; begin for i := Panel1.ControlCount - 1 downto 0 do begin Panel1.Controls[i].Free; end; StartTime := TimeGetTime; for i := 0 to Num do begin with TEdit.Create(Panel1) do begin Visible := False; Parent :=Panel1; Left := 20; top := 50; end; Application.ProcessMessages; end; ShowMessage(IntToStr(timeGetTime - StartTime) + ' ms'); end; //-------------------------------------------------------------- // 描画の更新を停止してオブジェクトを生成すれば少しは速くなる //-------------------------------------------------------------- procedure TForm1.Button2Click(Sender: TObject); var i : Integer; StartTime : DWORD; begin for i := Panel1.ControlCount - 1 downto 0 do begin Panel1.Controls[i].Free; end; StartTime := TimeGetTime; LockWindowUpdate(Panel1.Handle); for i := 0 to Num do begin with TEdit.Create(Panel1) do begin Visible := True; Parent :=Panel1; Left := 20; top := 50; end; Application.ProcessMessages; end; LockWindowUpdate(0); ShowMessage(IntToStr(timeGetTime - StartTime) + ' ms'); end; //-------------------------------------------------------------- // 描画の更新を停止しないと遅くなる //-------------------------------------------------------------- procedure TForm1.Button3Click(Sender: TObject); var i : Integer; StartTime : DWORD; begin for i := Panel1.ControlCount - 1 downto 0 do begin Panel1.Controls[i].Free; end; StartTime := TimeGetTime; for i := 0 to Num do begin with TEdit.Create(Panel1) do begin Visible := True; Parent :=Panel1; Left := 20; top := 50; end; Application.ProcessMessages; end; ShowMessage(IntToStr(timeGetTime - StartTime) + ' ms'); end; # 私は,環境を提示しない質問は,ほとんど冗談だと思っています(笑) # 後から提示するというのは,「自分の書き込みをチェックしろ」というのと同じだと思っています.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.