Опциональный справочник с автозаполнением

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Опциональный справочник с автозаполнением

Сообщение Андрей »

Всем добрый день !
Вот такая задачка.... Хотелось облегчить ввод имен и отчеств. Сделал соотв. таблицы (справочники).

Пробую 1 вариант. Ставлю элемент ComboDropBox c опцией AutoComplete со связью по этим таблицам.. И все бы хорошо и красиво, но.... Энтот шаблон требует (или я каких то настроек не вижу ?) строго выбирать из справочника, казалось бы не проблема - разрешить дополнение в тихом режиме, но со временем спр-ки распухают за счет редких и оч. редких имен и отчеств (а у нас еще и выходцев со знойного Азербайджана полно) и собственно удобство работы падает.
Хотелось бы так: вводим буковки - видим предлагаемый вариант через AutoComplete, если ничего не подходит, то дописываем до конца, НО при этом добавления в спр-к не происходит.

Пробую 2-1 вариант: ComboDropBox не по файлу, а по очереди (имен и отчеств) - тут как раз опциональность есть, но не так удобно

Вот собственно вопрос - можно ли сделать нужный по функциональности вар-т 1
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Опциональный справочник с автозаполнением

Сообщение BOB »

Несколько сомнительна полезность автозаполнения именно для таких справочников .
Посмотрел свои справочники и имею имен ~7000 отчеств ~12000 и что , при наборе оператор должен все время
на справочник смотреть ? Мое (ошибочное) мнение , оператор вообще НЕ должен думать потому как устает. Пусть набирает что хочет, а по enter делаем проверку . Я бы попробовал привязать десяток наиболее распространенных имен и отчеств к клавишам F . Делал такое для справичников услуг и заболеваний и прижилось на 100%.
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Опциональный справочник с автозаполнением

Сообщение Андрей »

BOB писал(а):Несколько сомнительна полезность автозаполнения именно для таких справочников .
Посмотрел свои справочники и имею имен ~7000 отчеств ~12000 и что , при наборе оператор должен все время
на справочник смотреть ?
Вот как раз поэтому я не хочу делать расширяемый спр-к. С др. стороны из этих 7000 (а откуда их столько взялось ? иностранцы со всего мира) у меня в моем случае активно используется то наверно 50 от силы и есть разница ввести ВЯЧЕСЛАВОВНА или ВЯчеславовна сразу 10 нажатий экономим.
BOB
Ветеран
Сообщения: 336
Зарегистрирован: 17 Июль 2005, 5:43

Re: Опциональный справочник с автозаполнением

Сообщение BOB »

Ну это в идеале , а в реале нужно часто на экран поглядывать ,причем читать конец слова и определять конец набора
т.к. между Вя и славовна еще десяток отчеств . При этом есть большой соблазн нажимать не буквы , а стрелку.
В конечном итоге выигрыш если и есть то не значительный. Справочник у меня самый банальный для поликлиник (наверное для всей РФ) . Вот пример имен на букву а для мужчин . Очень удобно набрать АБДУ или АЛ остальное само добавится. Если у Вас справочник маленький , то надо разрешать добавление , если разрешили , загляните туда через месяц , будете очень удивлены.
Аб-Ахат 3 1
Абалан 4 1
Абас 5 1
Аббас 6 1
Аббасали 7 1
Абдалах 8 1
Абделнасир 9 1
Абдель 10 1
Абдеррезак 11 1
Абду-Салак 12 1
Абдуихак 13 1
Абдул 14 1
Абдул Хаюм 15 1
Абдула 16 1
Абдулабдус 17 1
Абдулак 18 1
Абдуламит 19 1
Абдулбари 20 1
Абдулбяр 21 1
Абдулгани 22 1
Абдулгасан 23 1
Абдулкадер 24 1
Абдулкадир 25 1
Абдулкаюм 26 1
Абдулла 27 1
Абдулмалик 28 1
Абдулмялин 29 1
Абдулхадер 30 1
Абдулхадис 31 1
Абдулхай 32 1
Абдулхак 33 1
Абдулхалик 34 1
Абдулхамед 35 1
Абдулхарис 36 1
Абдумашит 37 1
Абдунасир 38 1
Абдуразан 39 1
Абдурахман 40 1
Абдурашид 41 1
Абдурванс 42 1
Абдуябяр 43 1
Абзал 44 1
Абилкасым 45 1
Абкар 46 1
Абраам 47 1
Абрам 48 1
Абуали 49 1
Абубакар 50 1
Абула 51 1
Абуталиб 52 1
Абухарис 53 1
Абэс 54 1
Абяс 55 1
Аванес 56 1
Август 57 1
Авдляхат 58 1
Авенир 59 1
Аверкий 60 1
Аверроэс 61 1
Авесто 62 1
Авет 63 1
Аветик 64 1
Аветис 65 1
Ави 66 1
Авраам 67 1
Аврам 68 1
Автандил 69 1
Авчил 70 1
Агаси 71 1
Агван 72 1
Агзам 73 1
Агил 74 1
Агиль 75 1
Агирре 76 1
Агул 77 1
Адалет 78 1
Адам 79 1
Адат 80 1
Адгам 81 1
Адгур 82 1
Адель 83 1
Аден 84 1
Адесате 85 1
Аджай 86 1
Адил 87 1
Адиль 88 1
Адильхан 89 1
Адис 90 1
Адлан 91 1
Адлер 92 1
Адольф 93 1
Адриан 94 1
Адыбула 95 1
Аждар 96 1
Азамат 97 1
Азантин 98 1
Азат 99 1
Азер 100 1
Азиз 101 1
Азир 102 1
Азолбед 103 1
Азот 104 1
Аид 105 1
Аири 106 1
Айвар 107 1
Айген 108 1
Айгиз 109 1
Айдар 110 1
Айдел 111 1
Айдын 112 1
Айелш 113 1
Айжур 114 1
Айзер 115 1
Айзик 116 1
Айк 117 1
Айнур 118 1
Айрапет 119 1
Айрат 120 1
Айратй 121 1
Айса 122 1
Айтбен 123 1
Акаки 124 1
Акбар 125 1
Акбер 126 1
Аким 127 1
Акир 128 1
Акиси 129 1
Акиф 130 1
Аклям 131 1
Акмал 132 1
Акмаль 133 1
Акоп 134 1
Акпар 135 1
Акрам 136 1
Акреметдин 137 1
Актавий 138 1
Акунжан 139 1
Ал 140 1
Аладрин 141 1
Алай 142 1
Аламед 143 1
Алан 144 1
Аланбек 145 1
Алауди 146 1
Албай 147 1
Алгар 148 1
Алдулбари 149 1
Алей 150 1
Алек 151 1
Алекс 152 1
Алексан 153 1
Александр 154 1
Александро 156 1
Алексей 157 1
Алексий 158 1
Алем 159 1
Ален 160 1
Алескар 161 1
Алескер 162 1
Алесь 163 1
Али 164 1
Алиага 165 1
Алибала 166 1
Алибей 167 1
Алибек 168 1
Алик 169 1
Аликрам 170 1
Аликум 171 1
Алим 172 1
Алимбай 173 1
Алимджан 174 1
Алимптан 175 1
Алис 176 1
Алихаджи 177 1
Алихан 178 1
Алишер 179 1
Алия 180 1
Алияр 181 1
Аллан 182 1
Аллен 183 1
Алмад 184 1
Алмаз 185 1
Алтун 186 1
Алхазур 187 1
Алхузер 188 1
Алшир 189 1
Аль 190 1
Альбек 191 1
Альберг 192 1
Альберт 193 1
Альбинас 194 1
Альбион 195 1
Альгерт 196 1
Альмир 197 1
Альперен 198 1
Альпий 199 1
Альтин 200 1
Альткач 201 1
Альфис 202 1
Альфред 203 1
Алэна 204 1
Алям 205 1
Аляс 206 1
Амаду 207 1
Амакж 208 1
Аман 209 1
Аманулла 210 1
Амар 211 1
Амаяк 212 1
Аме 213 1
Амид 214 1
Амиль 215 1
Амин 216 1
Амир 217 1
Амиран 218 1
Амираслян 219 1
Амирах 220 1
Амирзяна 221 1
Амиридем 222 1
Амирин 223 1
Амирхан 224 1
Амияр 225 1
Амрилло 226 1
Амрулла 227 1
Амур 228 1
Амфилофий 229 1
Ананий 230 1
Анар 231 1
Анастас 232 1
Анатолий 234 1
Анвар 235 1
Анваржон 236 1
Анвер 237 1
Анвяр 238 1
Анджей 240 1
Анджелко 241 1
Андраник 242 1
Андраши 243 1
Андреа 244 1
Андреас 245 1
Андрей 246 1
Андрес 247 1
Андреян 248 1
Андриан 249 1
Андриас 250 1
Андрий 251 1
Андрис 252 1
Андроник 253 1
Анзар 254 1
Анзор 255 1
Анзори 256 1
Анибан 257 1
Анираф 258 1
Анис 259 1
Анисим 260 1
Анкин 261 1
Анраф 263 1
Анри 264 1
Ансад 265 1
Ансар 266 1
Анти 267 1
Антип 268 1
Антон 269 1
Антони 270 1
Антоний 271 1
Антонин 272 1
Антонио 273 1
Антуан 274 1
Ануар 275 1
Аншей 276 1
Ань 277 1
Аняс 278 1
Аполлон 279 1
Ара 280 1
Араз 281 1
Аралк 282 1
Арам 283 1
Араний 284 1
Арарат 285 1
Арвий 286 1
Аргил 287 1
Ардаман 288 1
Аревик 289 1
Ареланхан 290 1
Арен 291 1
Арзен 292 1
Арзу 293 1
Арзуман 294 1
Арзылан 295 1
Ариан 296 1
Ариим 297 1
Арий 298 1
Арик 299 1
Арин 300 1
Арис 301 1
Аристид 302 1
Ариф 303 1
Ариям 304 1
Аркадий 305 1
Арктур 306 1
Арлен 307 1
Арлик 308 1
Армавен 309 1
Армаис 310 1
Арман 311 1
Арманд 312 1
Арманс 313 1
Армен 314 1
Арменак 315 1
Армэн 316 1
Армян 317 1
Арнольд 318 1
Арон 319 1
Арпеник 320 1
Арсамак 321 1
Арсен 322 1
Арсений 323 1
Арсентий 324 1
Арсиян 325 1
Арслан 326 1
Арсланбек 327 1
Арслевдин 328 1
Арт 329 1
Артавазд 330 1
Артак 331 1
Артамес 332 1
Артем 333 1
Артемий 334 1
Артемон 335 1
Артур 336 1
Артурсепух 337 1
Арун 338 1
Арунас 339 1
Арутюн 340 1
Архан 341 1
Архип 342 1
Арчил 343 1
Аршалуис 344 1
Аршам 345 1
Асабали 346 1
Асель 347 1
Асиб 348 1
Асиф 349 1
Аскольд 350 1
Асламбек 351 1
Асламед 352 1
Аслан 353 1
Асланбек 354 1
Асм 355 1
Асмин 356 1
Аснаб 357 1
Астерий 358 1
Асун 359 1
Асхат 360 1
Атрат 361 1
Аугуту 362 1
Афанасий 363 1
Афган 364 1
Афенен 365 1
Афзалабдул 366 1
Африн 367 1
Афсун 368 1
Ахияр 369 1
Ахмад 370 1
Ахмат 371 1
Ахмед 372 1
Ахмедша 373 1
Ахмер 374 1
Ахмет 375 1
Ахмят 376 1
Ахсан 377 1
Ахтем 378 1
Ахтыр 379 1
Ахтям 380 1
Ашот 381 1
Ашрер 382 1
kreator
✯ Ветеран ✯
Сообщения: 5162
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Опциональный справочник с автозаполнением

Сообщение kreator »

Надо делать комбо по очереди. А функциональность прописать руками. При событии NewSelection организовать поиск по очереди, если есть такой кусок имени, то присвоить значение из очереди. И не забыть о prop:SelStart и prop:SelEnd.
We are hard at work… for you. :)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Опциональный справочник с автозаполнением

Сообщение Андрей »

kreator писал(а):Надо делать комбо по очереди. А функциональность прописать руками. При событии NewSelection организовать поиск по очереди, если есть такой кусок имени, то присвоить значение из очереди. И не забыть о prop:SelStart и prop:SelEnd.
Спасибо !
Судя по всему у вас реализован такой вариант, если не жаль, поделитесь pls кодом.
Аватара пользователя
WadimZapara
Активист
Сообщения: 181
Зарегистрирован: 11 Июнь 2008, 12:11
Откуда: Тамбов

Re: Опциональный справочник с автозаполнением

Сообщение WadimZapara »

Если тебя устраивает вариант 1, за исключением добавления в файл - можно ведь просто удалять только что добавленное.
Вариант ? :)
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Опциональный справочник с автозаполнением

Сообщение Андрей »

WadimZapara писал(а):Если тебя устраивает вариант 1, за исключением добавления в файл - можно ведь просто удалять только что добавленное.
Вариант ? :)
Думаю, что не вариант. Если потом открыть запись с удаленным из спр-ка элементом шаблон затрет "нестандартное" значение
kreator
✯ Ветеран ✯
Сообщения: 5162
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Опциональный справочник с автозаполнением

Сообщение kreator »

У меня есть вариант обработки DropCombo при редактировании по месту.

Код: Выделить всё

!Update the list with the value from the drop list
case event
of EVENT:Selected
	if CON:ObjectID
		do FillDropEditQ2
		if ~records(DropEditQ2)
			if LOC:EIPColumn1
				LOC:EIPColumn1 = False
				RETURN EditAction:Backward
			else
				RETURN EditAction:Forward
			end
		else
			SELF.Feq{prop:Touched} = 1
		end
	else
	end
of EVENT:DroppingDown
	UPDATE(SELF.Feq)
	if SELF.UseVar
		get(DropEditQ2,1)
		ASSERT(~ERRORCODE())
		loop i#=1 to records(DropEditQ2)
			get(DropEditQ2,i#)
			ASSERT(~ERRORCODE())
			if upper(sub(DropEditQ2.Name,1,len(clip(SELF.UseVar))))=upper(SELF.UseVar)
				(SELF.Feq{Prop:ListFeq}){Prop:Selected} = i#
				SELF.UseVar = DropEditQ2.Name
				display(SELF.Feq)
				break
			end
		end
	else
		get(DropEditQ2,1)
		ASSERT(~ERRORCODE())
		SELF.UseVar = DropEditQ2.Name
		display(SELF.Feq)
	end
of EVENT:AlertKey
	if keycode()=EnterKey or keycode()=MouseLeft or keycode()=TabKey
    	UPDATE(SELF.Feq)
    	if SELF.UseVar
    		COL1:Name = clip(SELF.UseVar)
    		if ~Access:Colours1.Fetch(COL1:NameKey)
    			COLO0:ColourID = COL1:ID
    			COLO0:ObjectID = CON:ObjectID
    			if Access:ColoursOfObjects0.Fetch(COLO0:ObjectColourKey)
    				RETURN EditAction:None
    			else
    				CON:ColourID = COLO0:ID
    			end
    		else
    			RETURN EditAction:None
    		end
    	else
    		RETURN EditAction:None
    	end
	end
of EVENT:Accepted
	UPDATE(SELF.Feq)
	COL1:Name = clip(SELF.UseVar)
	if ~Access:Colours1.Fetch(COL1:NameKey)
		COLO0:ColourID = COL1:ID
		COLO0:ObjectID = CON:ObjectID
		if Access:ColoursOfObjects0.Fetch(COLO0:ObjectColourKey)
			RETURN EditAction:None ! Forward
		else
			CON:ColourID = COLO0:ID !DropEditQ.UnitID
		end
	end
of EVENT:NewSelection
	UPDATE(SELF.Feq)
	if SELF.UseVar
		if DropComboEIPKeyValid()
			selstart# = SELF.Feq{Prop:SelStart}
			loop i#=1 to records(DropEditQ2)
				get(DropEditQ2,i#)
				ASSERT(~ERRORCODE())
				if upper(sub(DropEditQ2.Name,1,len(clip(SELF.UseVar))))=upper(SELF.UseVar)
					SELF.UseVar = DropEditQ2.Name
					CON:ColourID = DropEditQ2.ID
					display(SELF.Feq)
					SELF.Feq{Prop:SelStart} = selstart#
					SELF.Feq{Prop:SelEnd} = len(clip(SELF.UseVar))
					(SELF.Feq{Prop:ListFeq}){Prop:Selected} = i#
					break
				end
			end
		end
	end
end
DropEditQ2 - наша очередь.
Тебе нужно взять - только обработку NewSelection.
DropComboEIPKeyValid() - функция, определяющая, нужно ли обрабатывать нажатие клавиатуры. Выглядит так:

Код: Выделить всё

if ~keychar()
	return False
end
if band(keystate(),0400h+0200h)
	return False
end
if inlist(keycode(),LeftKey,RightKey,ShiftLeft,ShiftRight,BSKey)
	return False
end
return True
Если не понятно, пиши, попробую на досуге переписать для обычного DropCombo.
We are hard at work… for you. :)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Опциональный справочник с автозаполнением

Сообщение Андрей »

kreator писал(а):У меня есть вариант обработки DropCombo при редактировании по месту.

!Update the list with the value from the drop list

Если не понятно, пиши, попробую на досуге переписать для обычного DropCombo.
Спасибо, не так это и просто оказывается.... для меня... :?
Попытаюсь разобраться... но ежели бы смогли скинуть код для обычного DropCombo было бы здорово, может и другим пригодится.
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Re: Опциональный справочник с автозаполнением

Сообщение Admin »

kreator писал(а):У меня есть вариант обработки DropCombo при редактировании по месту.
Друзья, обрамляйте пожалуйста свой код соответствующими тегами для удобства чтения. Типа как ниже исправил.
Спасибо.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
kreator
✯ Ветеран ✯
Сообщения: 5162
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Опциональный справочник с автозаполнением

Сообщение kreator »

Сделал образец.
Блок данных:

Код: Выделить всё

LOC:Queue            QUEUE,PRE()
LOC:Name             LIKE(ADR:Name)
                     END
LOC:FirstName        LIKE(ADR:Name)
ComboBox в структуре Windows:

Код: Выделить всё

                           COMBO(@s60),AT(17,167,173,10),USE(LOC:FirstName),IMM,VSCROLL,FORMAT('80L(2)|M@s60@'),DROP(10),FROM(LOC:Queue)
Не забыть IMM.
Формируем Queue, например, после открытия файлов:

Код: Выделить всё

Addressees{prop:SQL} = 'select * '                    & |
                       'from DBA.Addressees '         & |
                       'order by DBA.Addressees.Name'
loop
  next(Addressees)
  if errorcode()
    break
  end
  LOC:Queue.LOC:Name = ADR:Name
  add(LOC:Queue)
end
В Embed для нашего Combo на событие NewSelection пишем:

Код: Выделить всё

update(?LOC:FirstName)
if LOC:FirstName
  selstart# = ?LOC:FirstName{Prop:SelStart}
  loop i#=1 to records(LOC:Queue)
    get(LOC:Queue,i#)
    if upper(sub(LOC:Queue.LOC:Name,1,len(clip(LOC:FirstName))))=upper(LOC:FirstName)
      LOC:FirstName = LOC:Queue.LOC:Name
      display(?LOC:FirstName)
      ?LOC:FirstName{Prop:SelStart} = selstart#
      ?LOC:FirstName{Prop:SelEnd} = len(clip(LOC:FirstName))
      (?LOC:FirstName{Prop:ListFeq}){Prop:Selected} = i#
      break
    end
  end
end
P.S. При этом не работает скроллирование по очереди, т.е. нужно еще обработать события ScrollUp и ScrollDown. Ну это если надо.
We are hard at work… for you. :)
kreator
✯ Ветеран ✯
Сообщения: 5162
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Опциональный справочник с автозаполнением

Сообщение kreator »

В догонку. Код для события ScrollDown:

Код: Выделить всё

i# = (?LOC:FirstName{Prop:ListFeq}){Prop:Selected}
if i#<records(LOC:Queue)
  get(LOC:Queue,i#+1)
  LOC:FirstName = LOC:Queue.LOC:Name
  display(?LOC:FirstName)
  ?LOC:FirstName{Prop:SelStart} = 1
  ?LOC:FirstName{Prop:SelEnd} = len(clip(LOC:FirstName))
  (?LOC:FirstName{Prop:ListFeq}){Prop:Selected} = i#+1
end
Код для ScrollUp:

Код: Выделить всё

i# = (?LOC:FirstName{Prop:ListFeq}){Prop:Selected}
if i#>1
  get(LOC:Queue,i#-1)
  LOC:FirstName = LOC:Queue.LOC:Name
  display(?LOC:FirstName)
  ?LOC:FirstName{Prop:SelStart} = 1
  ?LOC:FirstName{Prop:SelEnd} = len(clip(LOC:FirstName))
  (?LOC:FirstName{Prop:ListFeq}){Prop:Selected} = i#-1
end
А в событии NewSelection вкралась неточность. Надо бы предусмотреть нажатие дополнительных клавиш (Delete, BackSpace и т.д.). Типа того:

Код: Выделить всё

update(?LOC:FirstName)
if LOC:FirstName
  if DropComboEIPKeyValid()
    selstart# = ?LOC:FirstName{Prop:SelStart}
    loop i#=1 to records(LOC:Queue)
      get(LOC:Queue,i#)
      if upper(sub(LOC:Queue.LOC:Name,1,len(clip(LOC:FirstName))))=upper(LOC:FirstName)
        LOC:FirstName = LOC:Queue.LOC:Name
        display(?LOC:FirstName)
        ?LOC:FirstName{Prop:SelStart} = selstart#
        ?LOC:FirstName{Prop:SelEnd} = len(clip(LOC:FirstName))
        (?LOC:FirstName{Prop:ListFeq}){Prop:Selected} = i#
        break
      end
    end
  end
end
где DropComboEIPKeyValid() проверяет нажатие нужных клавиш.
We are hard at work… for you. :)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Опциональный справочник с автозаполнением

Сообщение Андрей »

kreator, спасибо !

Попробовал, работает, считаю удобно.
Теорет. вопрос остается - при каких размерах списка будут заметны тормоза, ну это так из любопытства.

Еще раз благодарю за такую конкретную помощь.
kreator
✯ Ветеран ✯
Сообщения: 5162
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Опциональный справочник с автозаполнением

Сообщение kreator »

Для SQL, вообще, предела нет. Например, можно добавить физические процессоры на сервак. Опять же можно View сделать по одному полю. В конторе сейчас сделаем гигабитную сеть, причем на серваке - два гигабитных порта с функцией Teaming (работающие как один). А обычная файловая БД на данный момент бесперспективна, даже при работе на одном компе.
We are hard at work… for you. :)
Ответить