Window.CreateComponent

var NewComp = Window.CreateComponent('CheckBox', BoolComponentName);
Component.Add(NewComp);

Достаточно медленно работает.
Когда в цикле несколько десятков таких процедур, то надолго задумывается.
Может можно копировать уже созданный элемент с другим именем?

Нравится

5 комментариев

Добрый день, Константин.

Основные задержки при создании и добавлении компонента на окно вызваны тем, что при добавлении компонента осуществляется перераспределение свободного места на форме. Необходимо подавить (отключить) события окна на время создания компонентов. Это можно сделать так:

Window.DisableEvents();
....
Window.EnableEvents();

или так:

Window.BeginUpdate();
...
Window.EndUpdate();

Копирование оконных компонентов, к сожалению, не решает проблемы, т.к. выполняется примерно столько же времени, как и создание.

Желаю успехов!

function PrepareGrid(Window) {
        Window.DisableEvents();
		var TableCode = SelectRights.TbCode;
		var GroupDataset = Services.GetSingleItemByUSI('ds_Group');
		var TableDataset = Services.GetSingleItemByUSI('ds_Table');
		ApplyDatasetFilter(TableDataset, 'Code', TableCode, true);
		TableDataset.Open();
		if (IsDatasetEmpty(TableDataset)) {
			TableDataset.Close();
			return;
		}
		var TableID = TableDataset.ValAsGUID('ID');
		TableDataset.Close();
		GroupDataset.Open();
		GroupDataset.GotoFirst();
		var Window = Self;
		var Component1 = Window.ComponentsByName('Names');
		var Component2 = Window.ComponentsByName('Read');
		var Component3 = Window.ComponentsByName('Write');
		for(var i = 0; i < GroupDataset.RecordsCount; i++) {
		    GrID = GroupDataset.ValAsGUID('ID');
				var Read = false;
				var Write = false;
				var CanDel = true;
			var TextComponentName = 'TextRights' + i;
	 		var NewComp1 = Window.CreateComponent('Label', TextComponentName);
			NewComp1.Caption = GroupDataset.Values('Name');
			NewComp1.OffsetBottom = '5';
	  		Component1.Add(NewComp1);
			var BoolComponentName1 = 'BoolRights1' + i;
	 		var NewComp2 = Window.CreateComponent('CheckBox', BoolComponentName1);
			NewComp2.IsChecked = Read;
			NewComp2.IsEnabled = !CanDel;
			Component2.Add(NewComp2);
	 		var BoolComponentName2 = 'BoolRights2' + i;
	 		var NewComp3 = Window.CreateComponent('CheckBox', BoolComponentName2);
	 		NewComp3.IsChecked = Write;
			NewComp3.IsEnabled = !CanDel;
			Component3.Add(NewComp3);
			GroupDataset.GotoNext();
		}
		GroupDataset.Close();
		Window.EnableEvents();
}

Не помогает.
серые checkbox'ы появляются со скорость 2шт в секунду.
И если я закомментирую перебор по датасету скорость не меняется.
Резко ускоряется конструкция, когда убираю Component2.Add, Component3.Add
'Names', 'Read', 'Write' - это три Framegroup.

Добрый день, Константин.
Попробовал воспроизвести на версии 3.2.0.x.
В целом, код сработал достаточно быстро, 6 компонентов были созданы за 200 мс, или по 66 мс на компонент (но вовсе не 500 мс). Полученная скорость вполне приемлема. Возможно, причиной наблюдаемого Вами эффекта является версия приложения (3.0.х) либо иное расположение компонентов в окне, при котором каждое добавление вызывает перераспределение места среди уже добавленных элементов (в моем случае добавлялись просто списком сверху вниз)
Небольшой совет - вместо RecordsCount использовать PageRecordsCount, это свойство при чтении не вынуждает набор данных каждый раз выполнять запрос на получение количества записей.
Попробуйте реализовать предельно простой пример и получить высокую скорость создания компонентов. Затем, постепенно преобразовывая окно к требуемому виду, можно выяснить, какое именно расположение компонентов приводит к более медленному их созданию. Это поможет Вам обойти это обстоятельство и реализовать создание компонентов с приемлемой скоростью.
Желаю успехов!

Здравствуйте.

Окно проще некуда

<?xml version="1.0" encoding="UTF-8"?>
<Service UID="2BC45C2CA0A64DCC87E9154684A8B3B3" USI="X15\Window Templates\SelectRights\wnd_SelectRigts" ServiceTypeCode="Window" Caption="wnd_SelectRigts" ScriptUSI="wnd_SelectRigtsScript" WindowCaption="Права доступа" Left="0" Top="0" Name="wnd_SelectRigts" Type="Window" IsClient="True">
	<EventsDispatcher>
		<Item ObjectID="btnOk" UID="306CE453948C4E82AEECC61E53831CA5">
			<Item MethodName="OnClick" UID="4D8154B77C0F47699512D37B74D4726D" ScriptMethodName="btnOkOnClick">
			</Item>
		</Item>
	</EventsDispatcher>
	<NonVisualComponents>
		<Item Name="dlData" UID="DF4C24C5658B4CE1A30769CDC5726C9A" Type="DatasetLink" ServiceUSI="ds_SelectRights">
		</Item>
	</NonVisualComponents>
	<Item Name="frmData" UID="B3BFB991DF13487DA68810BB10F4E382" Type="Frame" Size="0" IsClient="True">
		<Item Name="fgData" UID="F1BBE2DCBE6E402EBDBC688AD80E4106" Type="FrameGroup">
		</Item>
		<Item Name="fgButtons" UID="83F3B56217BE44948F9EC0CD6C058E15" Type="FrameGroup" AlignHorizontal="2" AlignVertical="1" HasSeparator="False" GroupType="3" Direction="0">
			<Item Name="btnOk" UID="FC92D777E36343A1810122C9DC0BE62C" Type="Button" Caption="OK" IsCaptionVisible="False" AlignHorizontal="1">
			</Item>
			<Item Name="btnCancel" UID="3E8CA1E7A57D466197F24B368518F634" Type="Button" Caption="Отмена" IsCaptionVisible="False" AlignHorizontal="1">
			</Item>
		</Item>
	</Item>
</Service>
[08.10.06 09.00.32.906]	(W)	TextRights0
[08.10.06 09.00.32.937]	(W)	BoolRights10
[08.10.06 09.00.32.984]	(W)	BoolRights20
[08.10.06 09.00.33.000]	(W)	TextRights1
[08.10.06 09.00.33.046]	(W)	BoolRights11
[08.10.06 09.00.33.078]	(W)	BoolRights21
[08.10.06 09.00.33.093]	(W)	TextRights2
[08.10.06 09.00.33.140]	(W)	BoolRights12
[08.10.06 09.00.33.203]	(W)	BoolRights22
[08.10.06 09.00.33.218]	(W)	TextRights3
[08.10.06 09.00.33.265]	(W)	BoolRights13
[08.10.06 09.00.33.343]	(W)	BoolRights23
[08.10.06 09.00.33.343]	(W)	TextRights4
[08.10.06 09.00.33.406]	(W)	BoolRights14
[08.10.06 09.00.33.468]	(W)	BoolRights24
[08.10.06 09.00.33.484]	(W)	TextRights5
[08.10.06 09.00.33.546]	(W)	BoolRights15
[08.10.06 09.00.33.609]	(W)	BoolRights25
[08.10.06 09.00.33.625]	(W)	TextRights6
[08.10.06 09.00.33.687]	(W)	BoolRights16
[08.10.06 09.00.33.734]	(W)	BoolRights26
[08.10.06 09.00.33.750]	(W)	TextRights7
[08.10.06 09.00.33.796]	(W)	BoolRights17
[08.10.06 09.00.33.843]	(W)	BoolRights27
[08.10.06 09.00.33.859]	(W)	TextRights8
[08.10.06 09.00.33.921]	(W)	BoolRights18
[08.10.06 09.00.33.968]	(W)	BoolRights28
[08.10.06 09.00.33.984]	(W)	TextRights9
[08.10.06 09.00.34.031]	(W)	BoolRights19
[08.10.06 09.00.34.093]	(W)	BoolRights29
[08.10.06 09.00.34.109]	(W)	TextRights10
[08.10.06 09.00.34.187]	(W)	BoolRights110
[08.10.06 09.00.34.265]	(W)	BoolRights210
[08.10.06 09.00.34.281]	(W)	TextRights11
[08.10.06 09.00.34.343]	(W)	BoolRights111
[08.10.06 09.00.34.390]	(W)	BoolRights211
[08.10.06 09.00.34.406]	(W)	TextRights12
[08.10.06 09.00.34.468]	(W)	BoolRights112
[08.10.06 09.00.34.515]	(W)	BoolRights212
[08.10.06 09.00.34.546]	(W)	TextRights13
[08.10.06 09.00.34.593]	(W)	BoolRights113
[08.10.06 09.00.34.671]	(W)	BoolRights213
[08.10.06 09.00.34.687]	(W)	TextRights14
[08.10.06 09.00.34.765]	(W)	BoolRights114
[08.10.06 09.00.34.828]	(W)	BoolRights214
[08.10.06 09.00.34.859]	(W)	TextRights15
[08.10.06 09.00.34.953]	(W)	BoolRights115
[08.10.06 09.00.35.015]	(W)	BoolRights215
[08.10.06 09.00.35.031]	(W)	TextRights16
[08.10.06 09.00.35.125]	(W)	BoolRights116
[08.10.06 09.00.35.187]	(W)	BoolRights216
[08.10.06 09.00.35.203]	(W)	TextRights17
[08.10.06 09.00.35.296]	(W)	BoolRights117
[08.10.06 09.00.35.359]	(W)	BoolRights217
[08.10.06 09.00.35.390]	(W)	TextRights18
[08.10.06 09.00.35.468]	(W)	BoolRights118
[08.10.06 09.00.35.531]	(W)	BoolRights218
[08.10.06 09.00.35.546]	(W)	TextRights19
[08.10.06 09.00.35.625]	(W)	BoolRights119
[08.10.06 09.00.35.703]	(W)	BoolRights219

Ничего не понимаю. Сейчас влёт открывается.
И с RecordsCount примерно тоже самое.
Проверю что будет днём...

Вижу простое окно, лог, в котором каждые 60 мс создается по компоненту, вроде бы все нормально и быстро работает. Причина задержек, видимо, не в создании компонентов, а в чем-то другом (СУБД или локальная машина).

Показать все комментарии