Объект быстрого выбора Назад В начало Вперед

При заполнении полей интерфейса допускается использование быстрого выбора. Для этого в описании поля необходимо поставить атрибут quickChoice (см. "Атрибуты поля. "). А в интерфейсе выбора, предназначенном для заполнения этого поля, необходимо описать объект быстрого выбора quickChoice. При заполнении такого поля вместо обычного интерфейса выбора пользователю будет предъявлен список записей, похожий на стандартный элемент управления "комбинированный список".

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

Функция быстрого выбора активизируется автоматически при начале набора данных в таком поле. При этом весь текст в поле очищается - остается одна набранная буква. Если пользователь нажимает клавиши быстро, текст в поле вводится без задержки. Содержимое списка заполняется записями, начинающимися с введенных символов.

При описании интерфейса выбора допускается описание одного или нескольких объектов быстрого выбора quickChoice.

<объект быстрого выбора> ::= quickChoice
  [<Имя быстрого поиска>|"<Имя быстрого поиска>"] {
  acceptField = <присваеваемое поле в процессе поиска>;
  viewField =<визуализируемое в списке поле в процессе поиска>;
  {viewField = <еще одно визуализируемое в списке поле >;}
  searchField = <используемое для инкрементного поиска поле>;
  onOpen: <Обработчик открытия быстрого поиска>;
  onClose: <Обработчик закрытия быстрого поиска>;
  statusCtx = <константа контекста строки состояния>;
  };

Для того чтобы объект быстрого поиска автоматически подцеплялся для выбранного поля, его имя должно задаваться в соответствии с шаблоном qc<Имя таблицы>_<Имя поля>.

Описание быстрого поиска представляет собой объект языка, содержащий внутри себя следующие элементы:

Обработчик открытия вызывается при открытии быстрого поиска; он предназначен для установки ограничений на логическую таблицу, проверки прав доступа и т.д. Чтобы быстрый поиск не открылся, в этом обработчике можно вызывать оператор abort.

Обработчик закрытия быстрого поиска вызывается при закрытии быстрого поиска; он предназначен для восстановления ограничений и обработки результата быстрого поиска:

Для всех остальных команд:

Команду, по которой был закрыт быстрый поиск, можно получить в обработчике закрытия из переменной quickChoiceCommand: longInt.

Элемент viewField не обязателен, если он не задан при описании объекта быстрого поиска, то будет автоматически сформирован на основе элемента searchField.

Интерфейс быстрого поиска открывается, если непосредственно до него было сгенерировано событие cmOpenSearch, которое устанавливает видимую из компилятора VIP переменную quickChoiceName: string в соответствии с шаблоном qc<Имя текущей таблицы>_<Имя текущего поля>. В обработчике события cmOpenSearch прикладной программист может явно задать имя требуемого объекта быстрого поиска функцией. Если переменной quickChoiceName будет присвоена пустая строка, быстрый поиск не будет активизирован и откроется сам интерфейс выбора.

При запуске интерфейса функцией RunInterface и непустой строке quickChoiceName среди объектов быстрого выбора в данном интерфейсе ищется объект с именем, соответствующем значению строки quickChoiceName. Если такой объект не найден, открывается интерфейс выбора.

Если объект найден, нажатая клавиша заносится в строку quickChoiceString. Запускается обработчик открытия; если в нем вызвали оператор abort, быстрый поиск не открывается, а открывается интерфейс выбора.

В интерфейс передаются параметры из функции RunInterface и инициализируется логическая таблица.

Если выполняется первая загрузка в кэш для кэшируемого интерфейса, то посылается событие cmCacheInit.

Устанавливается сортировка по полю searchField, если можно подобрать такой индекс, который включает в себя прикладные ограничения и сортировку по searchField.

По завершению быстрого поиска команда, с которой он завершился, записывается в quickChoiceCommand. Набранная строка заносится в quickChoiceString.

Строка, которая была набрана пользователем с клавиатуры или выбрана из списка записей нажатием клавиши Enter или щелчком мыши, может быть получена в обработчике закрытия быстрого поиска из переменной quickChoiceString : string. В том случае, если быстрый поиск был закрыт командой, отличной от cmOk, значение указанной переменной может не соответствовать никакой строке из базы данных.

Интерфейс с объектами быстрого поиска рекомендуется кэшировать.

Объект быстрого поиска имеет доступ к параметрам, переменным и функциям интерфейса и может передавать ему команды через функции PutCommand и ProcessCommand.

Пример 1.

quickChoice {
		acceptField = KatOrg.NRec;
		searchField = KatOrg.name;
};
quickChoice qcSearchByComment
{
		acceptField = KatOrg.NRec;
		viewField = KatOrg.comment;
		viewField = KatOrg.name;
		searchField = KatOrg.comment;
		onOpen: SetOrder (#KatOrgUpComment);
		onClose: if Length (KatOrg.comment) = 0 then abort;
};

Пример 2.

Файл "test.dic": используемые таблицы.

create table table1 "Таблица отделов" with replace
 ( number_Dep : word "Номер отдела",
   name_Dep : string[30] "Наименование отдела"
 ) with index
 ( t1In1=number_Dep(unique),
   t1In2=name_Dep(unique)
 );

create table table2 "Таблица сотрудников" with replace
 ( number_Sotr : word "Номер сотрудника",
   name_Sotr : string[30] "ФИО",
   number_Dep : word "Номер отдела",
   date_1 : _DateTime "Дата 1",
   date_2 : _DateTime "Дата 2",
   date_3 : _DateTime "Дата 3",
   date_4 : _DateTime "Дата 4"
 ) with index
 ( t2In1=number_Sotr(unique),
   t2In2=name_Sotr,
   t2In3=number_Dep
 );

alter table table2
 foreign key t2In3
 references table1
 primary key t1In1
 restrict
 set null;

set type
   (ar=array [1..3] of comp);

Файл "test2.vip": интерфейс для заполнения таблицы быстрого выбора.

interface test2 'Тест 2' doAccept;
 create view as select * from table1;
 var ind : integer;

 browse ww1;
  show at (,,12,);
  fields
   name_Dep;
 end;
 
 browse depBrowse2;
  show at (13,,,);
  table table1, eventNavigation;
  fields
   number_Dep 'Номер отдела';
   name_Dep 'Наименование отдела';
   ind 'Индикатор';
 end;

 handleEvent
  cmInit		 : ind:=500;
  cmDoGetPrev	: begin ind:=ind-5; end;
  cmDoGetNext	: begin ind :=ind+5; end;
  cmDoGetFirst   : begin ind :=0; end;
  cmDoGetLast	: begin ind:=1000; end;
  cmInsertRecord : insert current table1;
  cmUpdateRecord : update current table1;
  cmDeleteRecord : delete current table1;
 end;
end.

Файл "test1_.vip": использование быстрого выбора.

#include status.inc

interface test1_ 'Тест 1_' (,hcViewFile,scTest) doAccept, cacheable;
  var includePath : date;
  create view
  var aaa, bbb : integer;
	h : date;
  as select * from table2;

window www1
  screen ww1;
   fields
	includePath : noProtect;
	<< 'Screen'
	`IncludePath ` .@@@@@@@@@@@
	>>
  end;
end;

panel p1;
 browse depBrowse1_ (,hcViewFile,scTest);
   show at(1,16,40,17);
  fields
   date_1 (,hcCalculator,) : protect, pickButton, quickChoice;
   date_2 : protect;
   date_3 : noProtect, pickButton, quickChoice;
   date_4 : noProtect;
   aaa : [list 'не определены', 'не выполнены', 'выполнены'], protect;
   bbb : noProtect;
 end;

 screen sc1;
   show at(,2,,15);
  fields
   h : noProtect;
   aaa : calcButton, noProtect;
   bbb ('Условия, при выполнении которых можно производить отгрузку',,) :
	 [list 'не определены', 'не выполнены', 'выполнены'], protect;
   date_1 : protect, pickButton, skip;
   date_2 : protect;
   date_3 : noProtect, pickButton, quickChoice;
   date_4 ('вапволпрвап'): noProtect;
   name_Sotr ('вапволпрвапhgfhfghfgfgfgfg'): protect, quickChoice;
  << 'Screen'
  `h ` .@@@@@@@@@@
  `aaa ` .@@@@@@@@@
  `bbb ` .@@@@@@@@@
  `Date_1 ` .@@@@@@@@@
  `Date_2 ` .@@@@@@@@@
  `Date_3 ` .@@@@@@@@@
  `Date_4 ` .@@@@@@@@@
  `Name ` .@@@@@@@@@@@@@@@@@@@@@@@@
  >>
 end;

 handleevent
   cmCheckField : Message (CurField);
 end;
end;

 handleEvent
  cmOpenSearch :
	{
	if CurField = #Name_Sotr {
		RunInterface (test19); Abort; }
}
  cmInsertRecord : insert current table2;
  cmUpdateRecord : update current table2;
  cmDeleteRecord : delete current table2;
  cmValue1 : ProtectRecord (#table2, true);
  cmValue2 : { SetFieldOption (#Date_3,ofProtected); SetFieldOption (#Date_4,ofProtected); }
  cmValue3 : { SetFieldOption (#Date_1,ofProtected); SetFieldOption (#Date_2,ofProtected); }
  cmCacheInit : Message ('CacheInit');
  cmInit : {
			 var aDate : Date ; aDate := Date(12,2,0);
			 Calendar_SetWorkDay (Date (1,2,0), false);
			 Calendar_SetWorkDay (Date (1,13,-1), true);
			 var d1, d2 : date; d1 := Date(1,12,1998); d2 := Date(1,12,1999);
			 var i : integer; i := CalcDaysBetweenDates(d1,d2,false);
			 i := CalcDaysBetweenDates(d1,d2,true);
			 Message ('Init');
		 }
  cmPick : {
	aaa := 1234;
	if CurField = #h
	{ set h := Date (1, 1, 2000) ; SetFieldState (#h, sfModified); }
  }
 end;

end.

Файл "test19.vip": описание быстрого выбора.

const
  cmv1 = 6543;
  cmv2 = 6544;
  cmv3 = 6545;
end;

interface test19;
  show at (5,1,70,10);
create view
var
  d1, d2 : date;
as select *
from table2;

create view ttt as select * from table1;

var kkk : word;

quickChoice qctable2_Name_Sotr
  {
	acceptField = ttt.table1.Name_Dep;
	viewField = ttt.table1.Number_Dep;
	viewField = ttt.table1.Name_Dep;
	searchField = ttt.table1.Name_Dep;
	onOpen :
	{ Message ('Поехали!');
	Message (quickChoiceString);
	ProcessCommand (cmV3);
}
	onClose : { Message ('Приехали...'); }
  };

screen s 'Баг'
  table table2;
fields
  d1:['DD/MM/YYYY'], noProtect, quickChoice;
  d2:['DD/MM/YYYY'], noProtect;
  DateToStr(d1,'DD/MM/YYYY - ')+DateToStr(d2,'DD/MM/YYYY');
buttons
  cmV1;
  cmV2;
<<

 Интервал с.@@@@@@@@@@@ по.@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@

   <.Hide.> <.Show.>
>>
end;

handleEvent
  cmInit :
	{
	d1 := cur_date;
	d2 := cur_date;
}
  cmV1 :
	{
	ClearFieldOption(#d1,ofSelectable);
	ClearFieldOption(#d2,ofSelectable);
}
  cmV2 :
	{
	SetFieldOption(#d1,ofSelectable);
	SetFieldOption(#d2,ofSelectable);
}
  cmV3 : Message ('cmV3');
end;

end.