Я очень давно использую Delphi 6 , и недавно я начал использовать версию Delphi DX Rio 10.3 . Несмотря на все мои ожидания, мне кажется, что загрузка элементов на стандартные элементы управления (ComboBox, Listbox и т. Д.) в DX RIO значительно медленнее (во время выполнения), чем в D6 (оба в режиме DEBUG и RELEASE после активации всех оптимизаций). Я попытался использовать BeginUpdate / EndUpdate, не меняя разницу в скорости между средами.
Я хотел бы спросить, есть ли у кого-нибудь какие-либо предложения по улучшению производительности DX 10.3 Combobox / Listbox . Специфическая c проблема, которую я пытаюсь решить в моем реальном приложении, заключается в загрузке нескольких десятков элементов в 10-20 комбинациях / списках элементов управления в моей форме.
Я написал очень простой тест для стандарта COMBO. Одна и та же программа работает как в D6, так и в DX RIO. На моей машине разработки (Win 10 pro) программа, скомпилированная с D6, занимает около 1 секунда , в то время как программа, скомпилированная с DX RIO, занимает примерно в четыре раза больше .
Заранее большое спасибо за ваши ответы.
{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
cb: TComboBox;
txt_count: TLabel;
btn: TButton;
procedure btnClick(Sender: TObject);
end;
var Form1: TForm1;
implementation
{$R *.dfm}
var dt_start_timer : TDatetime;
procedure start_timer;
begin
dt_start_timer := now
end;
function delta_timer_msec : longint;
begin
result := round((now - dt_start_timer) * 24*60*60*1000)
end;
procedure execute(father : TForm;cb : TComboBox;txt : TLabel;bo_disable_update : boolean);
const
MAX = 100;
ITEMS_COUNT = 1000;
var i, j : integer;
begin
start_timer;
if bo_disable_update then cb.Items.BeginUpdate;
for i := 1 to MAX do begin
cb.Items.Clear;
for j := 1 to ITEMS_COUNT do cb.Items.Add('text-' + intToStr(j))
end;
if bo_disable_update then cb.Items.EndUpdate;
txt.Caption := intToStr(delta_timer_msec) + ' msecs'
end;
procedure TForm1.btnClick(Sender: TObject);
begin
execute(self, cb, txt_count, {disable_update}TRUE)
end;
end.
object Form1: TForm1
Left = -6
Top = 117
Width = 449
Height = 350
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object txt_count: TLabel
Left = 198
Top = 32
Width = 44
Height = 13
Caption = 'txt_count'
end
object cb: TComboBox
Left = 42
Top = 28
Width = 145
Height = 21
ItemHeight = 13
TabOrder = 0
Text = 'cb'
end
object btn: TButton
Left = 24
Top = 70
Width = 251
Height = 139
Caption = 'btn'
TabOrder = 1
OnClick = btnClick
end
end