Доброго времени суток!
Возникла проблема. Иногда при работе с разделом Контрагенты, при открытии карточки редактирования, размеры окна этой карточки становится настолько малы, что видно только часть заголовка. На сколько часто это происходит сказать не могу. С чем это может быть связано? Жду ваших мнений.

Нравится

3 комментария

Здравствуйте, Дмитрий.

Укажите, пожалуйста, используемую Вами версию бинарных файлов, а также выгрузите и предоставьте сервис карточки редактирования контрагентов (wnd_AccountEdit) для анализа.

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

Версия бинарников: 3.4.0.92
Сервис прилагаю.

Доброе утро.

С сервисом карточки все хорошо.
Попробуйте обновится на более новую версию бинарных файлов и протестировать работу. Ссылку на скачивание отправил Вам в личном сообщении.

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

Здравствуйте!
Возникает ошибка в следующих действиях. Когда заходим в детали "Трудозатраты" и создаем новую /удаляем запись для "Работы" в разделе проекты. Возникает ошибка "ParentID is undefined".

function ds_ProjectOnDatasetBeforePost(Dataset, DoPost) {
        InitializeActionsObjectByDataset(Dataset);
        Project.IsAppend = (Dataset.State == dstInsert);
        Project.ParentID = Dataset.Values('ParentID'); //Ошибка
        var HasChilds = Dataset.Values('HasChilds');
        var ProjectID = Dataset('ID');
        if (Project.IsAppend) {
                SetProjectElementDefaultValues(Dataset);
                Dataset.Values('SortOrder') = GetProjectMaxSortOrder() + 1;
        } else {
                if ((HasChilds) && (Dataset.DataFields('StateID').ValueIsChanged)) {
                        if (!IsStateAllowedByChildElements(ProjectID, Dataset('StateID'))) {
                                DoPost.Value = false;
                                return;
                        }

При созданий значений для других деталий ошибка не возникает.
Еще ко всему прочему при закрытии Terrasoft XRM стала возникать ошибка "Access violation at address in module 'vcl70.bpl'. Read of address 0C528834".
Версия системы Terrasoft XRM 3.3.2.254.
Подскажите, в чем может быть проблема?
Благодарю заранее.

Нравится

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

Здравствуйте, Валентина!

Данные два сбоя, вероятнее всего, не связаны между собой. Access violation, как правило, указывает на то, что не зарегистрированы бинарные файлы системы. Иногда может появляться, если ядру передана неверная информация.

Что касается сбоя при удалении работы, уточните, пожалуйста, вносились ли изменения в базовую логику раздела? Если да, тогда необходима отладка программного кода.

Здравствуйте, Анна!
На счет Access violation, перерегистрация не помогла. Помогла очистка cache и profile.
Но ошибка появляется при совершении следующих действий:

Первый вариант: Создаю "Проект". К этому проекту в детали "Трудозатраты" создаю новую запись. Ошибка "ParentID is undefined" не возникает. Но возникает ошибка Access violation при закрытии.
Второй вариант: Создаем "Стадию". К этой стадии, в детали "Трудозатраты" создаю новую запись.
Ошибка "ParentID is undefined" не возникает. Но возникает ошибка Access violation при закрытии.
Третий вариант:Создаем "Работу". К этой работе, в детали "Трудозатраты" создаю новую запись. Ошибка "ParentID is undefined" возникает. И возникает ошибка Access violation при закрытии.
Но новые записи создаются по трудозатратам, в любом случаи.

Думаю эти ошибки взаимосвязаны. При удалении новых записей по трудозатратам и очиски cache profile, ошибка Access violation, не возникает.

На счет того, что мы изменяли или нет что-то в террасофте не могу точно сказать. Т.к. до меня были другие сотрудники. Но проверив, бэкап за 2010 год. Это самый ранний период. Возникают те же ошибки. Ну сомневаюсь, что были совершены изменения в те времена. Может при создании трудозатрат нужно соблюсти какие-то определенные действия, которые я нарушаю. По докумету TSClient UG, вроде не имеет значение начну создавать новую запись по трудозатратам в "Проекте", а потом в "Задачах" или наоборот.
Можно у ли у вас запросить исходные файлы по разделу "проекты"? Я бы заменила файлы на тестовой версии и попробовала реализовать возможности создание новых записей по "Трудозатратам" для проектов.
Благодарю заранее за помощь!

Здравствуйте, Валентина!

В таком случае технической поддержке необходима резервная копия базы данных для того, чтобы протестировать сбой и произвести отладку. Если ли у Вас возможность предоставить скриншот окна отладчика Call Stack?

Здравствуйте, Анна!
Предоставляю Вам скриншот, каким образом возникает ошибка. Call Stack не вызывается. Хорошо, я сделаю backup базы данных. И пришлю письмо наверное в support (support@terrasoft.ru) с необходимой информацией для доступа к backup через ftp (если нужно Вам прислать письмо, то оставьте пожалуйста свою почту).

Валентина, попробуйте в запросе sq_Project установить галочку "всегда выбирать в запросе" для колонки ParentID:

parentID

Да, Анна я тоже думала, что ошибка связанна с запросом. Галочка уже установлена.

Валентина, а в датасете установлены галочки енерировать запрос на вставку и Генерировать запрос на удаление?

"Alimova Anna" написал:

Валентина, а в датасете установлены галочки енерировать запрос на вставку и Генерировать запрос на удаление?

С уважением, Анна Алимова

Специалист II линии технической поддержки Terrasoft


Да, установлено. Скидываю скриншоты для подтверждения.

Валентина, в таком случае необходима отладка скриптов. Вопрос с резервной копией базы данных актуален.

"Alimova Anna" написал:

Валентина, в таком случае необходима отладка скриптов. Вопрос с резервной копией базы данных актуален.

С уважением, Анна Алимова

Специалист II линии технической поддержки Terrasoft


Да, Анна я отправила еще с утра в support (support@terrasoft.ru) всю необходимую информацию для того чтобы скачать backup. Были какие-то проблемы у ваших сотрудников со скачкой файла, я им отправила ответ с возможностью решение проблемы. Если ответ не написали, значит проблем не возникло.

Валентина, попробуйте отредактировать строку function ds_ProjectOnDatasetBeforePost(Dataset, DoPost в скрипте ds_ProjectScript, на которой появляется сбой, следующим образом:

Project.ParentID = GetFieldValueFromDisabledField(Dataset, 'ParentID');

disImg

Анна, после того как отредактировала функцию function ds_ProjectOnDatasetBeforePost(Dataset, DoPost). Я попробовала добавть новую запись в трудозатраты. Возникает все равно ошибка, но уже в scr_ProjectExport .

Здравствуйте, Валентина!

В данном случае рекомендую Вам посмотреть сбой отладчиком скриптов.

Сообщение, которое возникает, говорит о том, что Вы пытаетесь присвоить полю CreatedOn значение null.

Для устранения сбоя следует написать дополнительную обработку пустого значения поля ds.Values('EstimatedStartDate'). Пример:

	var CreatedOn;
	if(ds.Values('EstimatedStartDate') != null){	
		CreatedOn =		System.DateTimeToStr(GetFieldValueFromDisabledField(ds, 'EstimatedStartDate'));
	} else {
		CreatedOn =     new Date(System.Now());
	}

Здравствуйте Анна!

В общем такая ситуация происходит. В скрипте scr_ProjectExport в функцию CreateUpdateProject(ds) написала дополнительную обработку пустого значения.

function CreateUpdateProject(ds){
	var ProjectID = 	ds.Values('ID');
	var ProjectName = ds.Values('Name');
	var ClientID = ds.Values('ClientID');
	var ClientName = ds.DataFields.ItemsByName('ClientID').DisplayValue;
//	var CreatedOn = System.DateTimeToStr(ds.Values('EstimatedStartDate'));
	var CreatedOn;
        if(ds.Values('EstimatedStartDate') != null){   
                CreatedOn =  System.DateTimeToStr(GetFieldValueFromDisabledField(ds, 'EstimatedStartDate'));
        } else {
                CreatedOn = new Date(System.Now());
        }

После чего повалило еще куча ошибок. Вот тут в плановых показателях я заменила Dataset.Values на GetFieldValueFromDisabledField. Ошибка прекратила появляться.

function SetDuration(Dataset) {
	if (Dataset.Attributes('IsDurationCalculated')) {
		return;
	}
//	var CalendarID = Dataset.Values('CalendarID');
//	var EstimatedStartDate = Dataset.Values('EstimatedStartDate');
//	var EstimatedDueDate = Dataset.Values('EstimatedDueDate');
   	var CalendarID = GetFieldValueFromDisabledField(Dataset,'CalendarID');
	var EstimatedStartDate = GetFieldValueFromDisabledField(Dataset,'EstimatedStartDate');
	var EstimatedDueDate = GetFieldValueFromDisabledField(Dataset,'EstimatedDueDate');

Далее в скрипте ds_ProjectScript. Произвела замену.

function IsProjectResized(Dataset) {
//	var NewDateDifference = Dataset.Values('EstimatedDueDate') - 
//		Dataset.Values('EstimatedStartDate');
	var NewDateDifference = GetFieldValueFromDisabledField (Dataset, 'EstimatedDueDate') - 
		 GetFieldValueFromDisabledField(Dataset,'EstimatedStartDate');
	var OldDateDifference = Dataset.DataFields('EstimatedDueDate').OldValue -
		Dataset.DataFields('EstimatedStartDate').OldValue;
	return (NewDateDifference != OldDateDifference);
}
function ds_ProjectOnDatasetAfterPost(Dataset) {
	//Project.ParentID = Dataset.Values('ParentID');
	Project.ParentID = GetFieldValueFromDisabledField(Dataset, 'ParentID');
	var ProjectID = Dataset.Values('ID');

В скрипте scr_ProjectUtils

function SetDuration(Dataset) {
	if (Dataset.Attributes('IsDurationCalculated')) {
		return;
	}
/**	
var CalendarID = Dataset.Values('CalendarID');
	var EstimatedStartDate = Dataset.Values('EstimatedStartDate');
	var EstimatedDueDate = Dataset.Values('EstimatedDueDate');
	/**/
 
	var CalendarID = GetFieldValueFromDisabledField(Dataset,'CalendarID');
	var EstimatedStartDate = GetFieldValueFromDisabledField(Dataset,'EstimatedStartDate');
	var EstimatedDueDate = GetFieldValueFromDisabledField(Dataset,'EstimatedDueDate');
	if (!CheckDatasetFieldsFilling(Dataset, 'EstimatedStartDate',
		'EstimatedDueDate', 'CalendarID')) {
		return;
	}

Исчезли все ошибки. Подскажите, может то что я исправила не совсем верно.

Здравствуйте, Валентина!

В данном случае все исправлено корректно.

Вероятнее всего, сбои возникли из-за того, что Вами были добавлены дополнительные обработки, требующие включения полей, которые в запросе не включены.

Здравствуйте, Анна.
Спасибо за ответ!

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

Добрый день.

Возможно ли сделать полю обычный цифровой счетчик, чтобы он сам генерировал число?

Или только при открытии формы он к мах значению прибавлял 1? (как тогда выбрать мах значение)

Нравится

4 комментария

Для создание счетчиков обычно пользуются системными настройками(Файл->Настройки->Системные настройки). Создайте там две настройки с кодом заканчивающимся на "Number" и "Mask". Если рассмотреть на примере счетов, то уже есть настройки "InvoiceNumber" и "InvoiceMask". Каждый раз перед сохранением записи(событие датасета beforePost) вызывается функция SetItemSystemNumber('Invoice', Dataset, 'InvoiceNumber'). Она увеличивает значение системной настройки(из первого параметра) на единицу и записывает в поле указанного в третьем параметре(InvoceNumber). Таким образом номер счета увеличивается автоматически.

Константин, ознакомьтесь с алгоритмом создания автоматической нумерации во вложенном файле.

Есть более низкоуровневый способ. Сделать автонумерацию на уровне БД:

ALTER TABLE tbl_Bank
ADD [Incr] [int] IDENTITY(1,1) NOT NULL

Потом добавить колонку Incr INT в администраторе(не сохраняя в БД)

Правда после этого больше нельзя будет сохранять таблицу в БД через TSAdmin
и все изменения структуры нужно будет делать напрямую через в СУБД.

Спасибо большое, все получилось!

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

Подскажите, есть ли возможность(или возможность реализовать) сохранения нескольких выделенных файлов на ПК с тем же именем, с которым они хранятся в Terrasoft(аналогично добавлению).

Спасибо.

Нравится

3 комментария

Для реализации данного функционала требуется доработка программного кода системы, в частности процедуры сохранения файла: необходимо, чтобы система учитывала все выбранные в реестре идентификаторы.

1. Откройте в Terrasoft Administrator скрипт scr_FilesDetailGridArea;

2. Найдите функцию function SaveToFile() и замените ее содержимое на следующее:

	var IDs = grdData.SelectedIDs.CommaText.split(',');
	for(i = 0; i < IDs.length; i++){
		var FileName = System.CreateObject('TSObjectLibrary.Value');
		var Dat = Services.GetNewItemByUSI('ds_FileInItem');
		ApplyDatasetFilter(Dat, 'ID', IDs[i], true);
		Dat.Open();
		if (Dat('ItemTypeID') != ft_File) {
			continue;
		}	
		FileName.Value =
			GetFieldValueFromDisabledField(Dat, 'Link');
		Dat.Close();		
			var FileExtension = '.' + ExtractFileExtension(FileName.Value);
			var FileFilterValue = '*' + FileExtension;
			FileFilterValue = FileFilterValue + '|' + FileFilterValue;
			var WindowCaption = "Сохранить файл";
			var InitialDir = EmptyStr;
			var IsSaving = true;
			if (FileName.Value == EmptyStr) {
				return;
			}
			if (!(System.PromptForFileName(FileName, FileFilterValue, FileExtension,
					WindowCaption, InitialDir, IsSaving))) {
				return;
			}
			var File = LoadFileFromDatabase(IDs[i], 
				FileName.Value, false);	    //
			if (!File) {
				return;
			} 
	}       

Обратите внимание, в этом случае система будет предлагать задать место сохранения каждого файла отдельно.

Анна, спасибо, а есть возможность сохранять все файлы в выбранный каталог(указать каталог один раз перед сохранением)?

В версиях старше 3.4.1 есть такие функции ядра, а в старых версиях это можно реализовать только вызовом функций shell, то есть, на уровне конфигурации - крайне трудоемко

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

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

Версия 3.2.0.87
Существует-ли возможность вывода изображений в грид? Если да, то как каким образом?
Идея в том, чтобы ассоциировать запись в гриде с изображениями.
Например, если у контакта есть фото, то почему бы не отображать его непосредственно в гриде. Или использовать иконки чтобы ассоциировать тип или состояние записи с изображением.

При этом файлы могут хранится как в файловой системе, так и в БД в поле типа BLOB.

Нравится

4 комментария

в этой версии такой возможности нет, насколько я знаю

Геннадий, Вы извините за оффтоп, но у Вас же Мегатрон на аватаре!

"Евгений Лемеш" написал:
#2 Евгений Лемеш 13 марта 2012 – 11:29

Геннадий, Вы извините за оффтоп, но у Вас же Мегатрон на аватаре!

Да! А что такое?

Геннадий, для реестра можно вывести небольшую пиктограммку, которая будет характеризовать тот или иной признак записи. Пример реализации по следующей ссылке: http://www.community.terrasoft.ua/blogs/7652

В реестр нельзя вывести содержимое BLOB-поля (например, изображение).

Для этого рекомендуется использовать деталь, т.к. размер изображения может варьироваться, что затрудняет оптимальное отображение реестра и снижает его читабельность для пользователя.

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

Здравствуйте!
Я пытаюсь программными средствами читать справочник типов средств связи. Как работает код, проверял отладкой.

function GetIsPhone(Dataset, FieldName) {
if (IsEmptyGUID(Dataset.ValAsGUID(FieldName))) return;
var CommunicationTypeID = Dataset.ValAsGUID(FieldName);
var CommTypeDataset = Dataset.DataFields(FieldName).LookupDataset;
if (CommTypeDataset.IsActive) CommTypeDataset.Close();
ApplyDatasetFilter(CommTypeDataset, 'ID', CommunicationTypeID, true);
CommTypeDataset.Open();
var IsPhone = CommTypeDataset.ValAsBool('IsPhone');
CommTypeDataset.Close();
ApplyDatasetFilter(CommTypeDataset, 'ID', CommunicationTypeID, false);
return IsPhone;
}

FieldName ='Communication2TypeID'
CommunicationTypeID соответствует мобильному телефону, но в результате работы этого кода в некоторых случаях получаю IsPhone=false, хотя в справочнике поле isPhone = true. Проверка CommTypeDataset.Values('IsPhone') показывает NULL. Запрос sq_CommunicationType в оболочке администратора работает нормально.

Нравится

5 комментариев
var CommTypeDataset = Dataset.DataFields(FieldName).LookupDataset;

здесь предложил бы использовать новый экземпляр датасета
var CommTypeDataset = Services.GetNewItemByUSI('ds_CommunicationType');

Спасибо Саша! получилось.

Как по мне, можно было бы вообще обойтись:

var IsPhone = GetDatasetFieldValueByID('ds_CommunicationType', CommunicationTypeID, 'IsPhone');

А функцию можно сократить до:

function GetIsPhone(Dataset, FieldName) {
     if (IsEmptyValue(Dataset) || IsEmptyValue(FieldName)) {
          return;
     }
     var CommunicationTypeID = Dataset(FieldName);
     if (IsEmptyGUID(CommunicationTypeID)) {
          return;
     }
     var IsPhone = GetDatasetFieldValueByID('ds_CommunicationType', CommunicationTypeID, 'IsPhone');
     return IsPhone;
 }

Спасибо! Уместное замечание, не мешало бы пересмотреть и остальной код с учетом этого.

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

Добрый день
Вопрос по BPMonline CRM
У нас в системе банковская карточка связана с физ. лицом. Позже выяснилось, что есть и доп. карты

Клиент может открыть дополнительную карту и оформить его на другого при этом у них связующим элементом является номер 20-ти значного банковского счета. У нас в системе доп. карта отображается у того человека на кого она оформлена .

Например, клиент А имеет счет KZ11111111111111111111111 к этому счету подвязаны 2 основные карты и 1 дополнительная карта которая оформлена на клиента Б. У клиента А отображаются только 2 карты так как оформлены на него, доп. карта отображается у клиента Б так, как оформлена на него, при этом поле счет у них одинаковый - KZ11111111111111111111111, но владелец счета клиент А.

Есть ли возможность, не дорабатывая вьюшки, отобразить дополнительную карту у владельца 20-ти значного счета(с указанием на кого она оформлена(клиент Б)), так и у клиента на кого она оформлена ? Можно ли решить эту задачу связками в Рабочих местах? Можете описать как это сделать?

Нравится

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

Здравствуйте. Опишите, пожалуйста, более детально, каким образом у Вас физически реализована связь между банковской карточкой, клиентом и счетом в BPMonline CRM. Как Вы отображаете банковские карты по клиенту, посредством детали? Также, уточните, пожалуйста, какую версию BPMonline CRM используете.

Да, посредством детали реализовано "Физ лицо - Карты"
В базе "Карта"."Физ лицо" = "Физ лицо"

Теперь надо "Карта"."Номер счета" = "Банковский счет"."Номер счета"

AlikBory, посмотрите принцип реализации описанной Вами структуры во вложенном файле. Подобным образом можно реализовать и другие связи.

Спасибо, заработало.
Возник вопрос,
Теперь в деталях "Связанные карты" отражается и основная карта клиента и доп карта клиента.
Образно объясняя, получилось, Деталь"Связанные карты" = (деталь "Карта") + доп карта
Теперь надо чтобы, В деталях "Связанные карты" отражалась только доп карта
Не могли бы помочь, спасибо

Чтобы деталь «Связанные карты» отображала информацию только о доп. картах клиента необходимо:
1. Добавить в объект «Банковская карта» булевое поле, посредством которого можно фиксировать информацию о том, что карта является дополнительной.
2. В элементе ScriptChildPageLoad (либо ChildPageLoadCompleteScript) процесса страницы реестра банковской карты реализовать наложение фильтра:

var currentStructure = Page.DataSource.CurrentStructure;
var currentFiltersGroup = currentStructure.Filters.FindByName("AdditionalCardsFilter");
if (currentFiltersGroup == null){
var logicalOperation = LogicalOperationStrict.And;
var currentPositionFiltersGroup = currentStructure.CreateFiltersGroup("AdditionalCardsFilter", logicalOperation);
var currentPositionFilters = currentStructure.CreateFilterWithParameters(Page.DataSource.Schema,
FilterComparisonType.Contain, "IsAdditional", true, "1");
currentPositionFiltersGroup.Add(currentPositionFilters);
currentPositionFiltersGroup.IsEnabled = true;
currentStructure.Filters.Add(currentPositionFiltersGroup);
}
return true;

Где "IsAdditional" – название добавленного булевого поля.
В результате, в реестре детали "Связанные карты" будут отображены записи с установленным признаком «Дополнительная карта».

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

Здравствуйте.
Возможно уже обсуждалось, но на форум не нашел.

Хочу втянуть в ТС 3.40.0.97 контрагентов из 1с 7.7

Самих контрагентов втянул, не могу втянуть платежные реквизиты.

Синхронизацию настроил следующим образом

1
2

В 1с втягиваю все данные из справочника "Контрагенты"

при запуске импорта ошибка следующая

3

Что я делаю не так.
Мне надо втянуть кроме данных контрагента ИНН, ЕДРПОУ, р/с

Нравится

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

Коментарий

Здравствуйте, Владимир!

Есть ли у Вас возможность добавить скриншоты в архиве? Изображения для форума по умолчанию сжимаются, и на них нельзя разглядеть существующие настройки интеграции.

Добавил Скрины в архиве

Здравствуйте, Владимир!

Нельзя сопоставлять поля Код в 1С и ID в Terrasoft, поскольку Код - это число, а ID - уникальный идентификатор.

Удалите это поле из родительской и подчиненной синзронизации и назначьте ключевым для родительской синхронизации поле Наименование, а для подчиненной - Юридическое название.

Я в курсе. Импорт этих полей не производится, они указаны только как ключевые.

4

5

Ключевые поля назначил как Вы указали, но результат тот же.

Владимир, инцидент решен в режиме удаленного доступа.

Прчина сбоя - в ключевом для интеграции Платежные реквизиты поле Юридическое название были значения, содержащие только пробелы и значения, начинающиеся со строки с пробелами.

Вопрос был решен путем скриптовой обрезки импортируемых значний:

Trim(Select1C[QueryLink].ПолнНаименование)

Спасибо Анне, в ходе удаленного сианса выяснилась причина.
Импорт пошел после исправления скрипта а именно функции function OnBeforeRecordImport

if (IsEmptyValue(Trim(Select1C[QueryLink].ПолнНаименование))) {
return true;

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

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

Есть редактируемый грид вида

грид

Обрабатываю события по grdDataOnAfterEdit

Проблема заключается в том, что grdDataOnAfterEdit срабатывает не каждый раз. Периодически просто нет реакции на изменения. Например, если поставить галочку, а потом снять ее.

Я именно ставлю debugger в grdDataOnAfterEdit и отслеживаю когда сработало, а когда нет.

Подскажите, пожалуйста, что с этим можно сделать?

Нравится

3 комментария

Здравствуйте Светланa,
Можете подсказать версию бинарных файлов и продукт который вы используете, что бы мы могли попробывать воспроизвести проблему

Алексей,
тестировала на версии 3.3.2.197 и на 3.3.2.240, Terrasoft CRM.

Как мне показалось, на версии 3.3.2.240 срабатывало чаще, но все равно не всегда. Если несколько раз убирать и ставить галочку, то не срабатывает.

Светлана проверял на 3.3.2.240 ,в редактированом гриде детали "Доступ" ( сервис окна wnd_AccessGridArea, скрипт scr_AccessGridArea) добавил событие grdDataOnAfterEdit(DataGrid, DataField), событие срабатывает при переходе с одной ячейки в другую, если выделить ячейку поставить галочку, потом не переходя в другую ячейку, снять галочку, то событие отработать не должно.
Предлагаю вам проделать теже действия, для того что бы понять проблема в конкретно вашем гриде или нет. При нормальной работе грида, имеем следующее поведение
Выделяем колонку "Изменение" ставим галочку, переходим на колонку "Удаление" отрабатывает событие grdDataOnAfterEdit на DataField = CanWrite,
Ставим галочку на колонку "Удаление", убераем галочку с колонки "Удаление" - ничего не происходит
Переходим на колонку "Изменение доступа" с колонки "Удаление" срабатывает событие DataField = CanDelete

1

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

Подскажите, как задать порядок обхода реквизитов по кнопке Enter.
То есть пользователи привыкли по энтеру переходить на следующее поле, и чтобы только на последнем реквизите срабатывала кнопка Ок.
Можно ли такое сделать и как?

Нравится

2 комментария

Предлагаю вам посмотреть функцию GetControlKeysState() (scr_Utils) для того что бы отлавливать нажатие кнопки Enter.
Как устанавливать фокус на контрол можно посмотреть в пукте 3) http://www.community.terrasoft.ru/forum/topic/6841

Как обратится к контролам в окне через массив объектов окна, можно посмотреть
http://www.community.terrasoft.ru/developer/faq/2201

спасибо, попробую

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