BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1 2 3 След.
RSS
Спецфункции в своем InitList., Каким обр там формир список спец-й?
 
Сегодня начал использовать initList. Довльно веселая вещь - просто и более-менее удобно.
Возникло 3 Вопроса:
1. При использовании своего InitList есть также возможность и в нем подключать спецфункции. Список совсем другой, отличный от места откуда был вызван свой InitList. Непонятно соблюдается ли уникальность списка?
(Иными словами, если написать 2 спец-ии с InitList возможно ли сделать для них разные списки спецфункций?)
Стало инетресно где храниться этот список.
2. Как я понял нет возможность "отловить" создание новой записи?
(Решил только вставив блок кода в "16. ._bPost – постблок, выполняющийся после записи (REPLACE) данных в базу.", который проверяет на пустоту определенные поля)
3. Уникальные поля. Возможно ли где-либо прописать правила создания новой записи? Т.е. при нажатии пользователем F4 "автоматически правильно" формировалось, например поле ID записи?
(Сейчас решил это во 2м пункте проверкой поля ID на пустоту и если оно пустое - StepPlus())
 
1. В каждом InitList свой вызов плагинов по CTRL-F5
Хотя вот тут по моему Вам придется свои кнопки рисовать
самостоятельно. Надо проверить.
2. Вопрос непонятен
3. Добавьте в свою таблицу поле ROWID С 22
Изменено: nordk - 08.09.2008 17:30:31
 
2. Создание новой записи(непосредственно после создания записи в табл). Такое событие есть?
4. Ограничение ввода при редактировании\создании новой? Т.е. перед записью в БД. (Чтобы пользователь не мог ввести не ту цифру. нашел 09._aWhen – массив предусловий для ввода;10._aValid – массив постусловий; но каким образом они работают еще не понял). Есть ли возможность при неверном условии, заданном массивом постусловий вывести ошибку.
Т.е. [10] - "IIF(Mode>35,Mode,sErrMessage)"/.
 
Цитата
Саак Шахламджян пишет:
Есть ли возможность при неверном условии, заданном массивом постусловий вывести ошибку.


Можно. Простейший пример:
aValid := {{||SayAndWait('Выход из первого поля')},{||SayAndWait('Выход из
второго поля')}}.

Напишите и посмотрите, как работает

В вашем случае Mode это, что?

P.S. В InitList делал такое или нет. Делал такое в QInput. Если я правильно понимаю, то между QInput и InitList много общего.
 
2. Лучше всего использовать bPostGet. В один из параметров передается флаг о том, что данные записаны.
4. Элементами массивов могут быть блоки кода, а они в свою очередь позовляют все что угодно, главное чтобы результатом выполнения блока кода было логическое значение, отражающее разрешение или запрет. В уроках на старом форуме мы разбирали InitList - посмотрите плз на том примере об этих массивах
 
Цитата
nordk пишет:
2. Лучше всего использовать bPostGet. В один из параметров передается флаг о том, что данные записаны.
4. Элементами массивов могут быть блоки кода, а они в свою очередь позовляют все что угодно, главное чтобы результатом выполнения блока кода было логическое значение, отражающее разрешение или запрет. В уроках на старом форуме мы разбирали InitList - посмотрите плз на том примере об этих массивах

Спасибо, посмотрю. Просто с первого раза что-то не нашел.

А у меня вот какая проблема с "вложенными" спецфункциями. Все работает прекрасно, но возникает "глюк":
1. Вызываю свой InitList(спецфункцией, внутри все работает).
2. Выхожу из своего реестра (оказываюсь опять в исходной позиции)
3. Теперь вызываю снова спецфункцию со своим InitList, а на самом деле исполняется "вложенная" спецфункция!!!
(Отрображаются названия спецфункций верно, а вот вызывается совсем не та)
Может я что-то упустил и нужно как-то "специально" завершать работу с InitList?

Или есть ли возможность "нарисовать" свою кнопочку "Операции" и оттуда вызывать вложенные спецфункции? (Поможет или нет - будет видно)

P.S. Самое обидное, что на "черновой" БД такого не происходит. А вот в рабочей, куда только что "установил" такой глюк.
"Поковырялся" в feval.dbf - "ничего такого". Единственное пути в "грязной" абсолютные. А в рабочей имя файла. В "грязной" тоже неправильно работает. Не сразу заметил, т.к. там оч много спецфункций. Таже ситуация...
Изменено: Саак Шахламджян - 09.09.2008 11:59:06
 
Посмотрите файл feval.dbf, может он прояснит ситуацию
 
Цитата
Денис пишет:
Посмотрите файл feval.dbf, может он прояснит ситуацию

Смотрел.
В общем, пошёл на хитрость. Как срабатывает глюк:
У меня две вложенные спецфункции.
После вызова своего InitList и возврата обратно не работают как раз 2 самые первые спецфункции в списке (список по алфавиту отсортирован).
Я добавил две пустышки-спецфункции, которы ничего не делают, а при "глюке" будут срабатывать вложенные спец-ии, которые выдают ошибку.
Единственное, что очень неприятно - это 2 никому ненужные спецфункции.
 
Дело в том, что, как я понимаю, использование спецфункций из реестров пользователей, вызванных из плагинов - недокументированная возможность.
Если работает, ну и Хорошо, но лучше использовать интерфейсные возможности программы.
Можно прекрасно обойтись кнопками и меню.
к примеру
Код
ClearButtons()
addbutton('Операции')
AddMenu('Перерасчет итоговых сумм по нормам времени' + " " ,K_CTRL_R)
AddMenu("Перерасчет расценок по нормам времени" + Chr(9)+ "" ,K_CTRL_Y)
SetButtons()


дает обычную кнопку и меню.
С уважением,
Ильин Евгений
 
Код
AddMenu('Перерасчет итоговых сумм по нормам времени' + " " ,"K_CTRL_R") 
AddMenu("Перерасчет расценок по нормам времени" + Chr(9)+ "" ,"K_CTRL_Y") 

Да, кнопочку вижу!!!
Только Вопрос как к этим кнопочкам подцепить мои файлы или функции? То, что должно выполняться при нажатии на них?
 
SETKEY(K_CTRL_R,{||SayAndWait("Test K_CTRL_R") ,0})
 
Цитата
Денис пишет:
SETKEY(K_CTRL_R,{||SayAndWait("Test K_CTRL_R") ,0})

Никак:(. Почитал старый форум, тоже ничего. И до и после как объявления так и инициализиции писал код:
Код
SETKEY("K_CTRL_R",{||SayAndWait("Test K_CTRL_R") ,0})

Результат нулевой...
К стати, без кавычек не работает вообще...
 
А у Вас K_CTRL_R определена ? Может просто циферками напишете ?
 
Цитата
nordk пишет:
А у Вас K_CTRL_R определена ? Может просто циферками напишете ?

Ну, разумеется нет!!! (откуда б я знал)
Да, все, цмферками все работает, здорово!!! Спасибо большое!!!
Цитата
itman пишет:
Дело в том, что, как я понимаю, использование спецфункций из реестров пользователей, вызванных из плагинов - недокументированная возможность.
Если работает, ну и Хорошо, но лучше использовать интерфейсные возможности программы.
Можно прекрасно обойтись кнопками и меню.
к примеру




Код

ClearButtons()
addbutton('Операции')
AddMenu('Перерасчет итоговых сумм по нормам времени' + " " ,K_CTRL_R)
AddMenu("Перерасчет расценок по нормам времени" + Chr(9)+ "" ,K_CTRL_Y)
SetButtons()


дает обычную кнопку и меню.

И Вам спасибо!
 
Цитата
Саак Шахламджян пишет:



Цитата

nordk пишет:
А у Вас K_CTRL_R определена ? Может просто циферками напишете ?
Ну, разумеется нет!!! (откуда б я знал)
Да, все, цмферками все работает, здорово!!! Спасибо большое!!!


А что у Вас при компиляции программа не ругалась на неизвестную переменную ?
Для таких переменных надо ch специальный где они определены добавлять
 
Теперь не работают @GET'ы в моих функциях, которые привязал к исполнению по нажатию кнопок...
До этого, при их вызове чз вложенные спецфункции все работало...
 
Цитата
nordk пишет:
А что у Вас при компиляции программа не ругалась на неизвестную переменную ?
Для таких переменных надо ch специальный где они определены добавлять

Да понял уже, само собой ругалась.
 
Цитата
Саак Шахламджян пишет:
Теперь не работают @GET'ы в моих функциях, которые привязал к исполнению по нажатию кнопок...


@GET'ы пишите в SETKEY()?

А если так SETKEY(K_CTRL_R,{||MyFunction() ,0})?
 
Цитата
Денис пишет:
А если так SETKEY(K_CTRL_R,{||MyFunction() ,0})?

Как раз так и пишу.
( Только на блок подаю не 0, а люб др число, тогда по завершении ф-ии я не выхожу из реестра.
Надо MyFunction переделать, чтобы возвращала не nil.)
Проблема, думаю с InitList, который в это же время работает.
Изменено: Саак Шахламджян - 09.09.2008 15:59:42
 
а может с прорисовкой обновлением экрана?
С уважением,
Ильин Евгений
 
Цитата
itman пишет:
а может с прорисовкой обновлением экрана?

Может, может...
Если можно попобробнее.
Я уже чего только не пробовал делать... Когда срабатывает READ, после ввода иногда получаю ошибку:
Операция >
неверный аргумент

Проблема в том, что по нажатию Enter, после срабатывания моего READ вместо того, чтобы завершился мой read обрабатывается нажатие Enter ListInit'ом... И у меня как раз и появляется запрос ввода ...
Изменено: Саак Шахламджян - 09.09.2008 16:28:15
 
Придумал такую конструкцию:
Код
STATIC PROCEDURE Main()
......
Memvar nMykey1
PUBLIC nMykey1:=0
......
ClearButtons() 
addbutton('Операции') 
AddMenu('Ф-я2' + " ",2)
SetButtons()
SETKEY(2,{||Exitproc(),0})
............
do While (nMyKey1!=1)
InitList(<параметры>)
MyProced1()
enddo
.......
return

FUNCTION Exitproc()
nMykey1:=2
RETURN 0

STATIC PROCEDURE MyProced1()
.........
if (nMykey1==2)
.......
nMyKey1:=0
elseif(nMyKey1==0)
nMyKey1:=1
endif
RETURN

Единственное, еще надо подумать как "перехватить" параметры в Listinit, который завершается. Нет ли возможности по "событию" выход выполнить блок кода?
Хотя!!! Можно параметры передавать через Exitproc()!!!
Пока что, описанное выше работает, READ в моей ф-ии работает, а потом номально идет возврат к InitList, остальные, увы, догадки, только завтра:(
Изменено: Саак Шахламджян - 09.09.2008 17:05:49
 
Не понимаю что Вы тут опять перехватываете :smile:
Если проблема с переназначением клавиш, то опять хочется спросить:
А в описании функций смотрели такие как
SaveSetKey() - RestSetKey() ?
 
Цитата
nordk пишет:
Не понимаю что Вы тут опять перехватываете
Если проблема с переназначением клавиш, то опять хочется спросить:
А в описании функций смотрели такие как
SaveSetKey() - RestSetKey() ?

В справочнике единственно заинтересовавшую функццию нашел в описании QBrowse()(IsHotKey()). SaveSetKey() там не описана. Однако, сегодня натыкался на неё на старом форуме:
Цитата
FUNCTION SAVESETKEY()
Local aSave := HB_SetKeySave()
Local i
Local aRest := {}
For i := 1 to len(aSave)
if aSave[i][1] == K_F1.or.;
aSave[i][1] == K_ALT_F1.or.;
aSave[i][1] == K_ALT_Z.or.;
aSave[i][1] == K_ALT_K.or.;
aSave[i][1] == K_ALT_INS.or.;
aSave[i][1] == K_ALT_V
aadd(aRest,aSave[i])
else
setkey(aSave[i][1],nil)
endif
Next
if !Empty(aRest)
HB_SetKeySave(aRest)
endif

Return aSave

о RestSetKey() само собой тоже не слышал. Надо было на кофейной гуще с утра погадать, может быть там увидел бы то, что пригодилось бы при написании программы в течении дня;)
Но, если серьезно. При InitList заполняется aSave, в котором хранятся "клавиши", нажатие которых передается ему на обработку?
Тогда нужно созранить его ф-ей SAVESETKEY(), затем "сбросить клавиши" (их список) функцией RestSetKey()?
После этого все будет как обычно? (Сейчас не могу проверить)
Изменено: Саак Шахламджян - 09.09.2008 20:47:19
 
Самый лучший способ научиться, проанализировать исходники рабочих примеров.
Т.к. initlist перекочевала из БЭСТ-4, все что есть по БЭСТ-4 - применимо и в Б5.
В инструментарии к Б4 приведены рабочие примеры, вот один из них:
Код
#include "s_public.ch"

FIELD Grup,NNum,Ed //объявление полей, чтобы компилятор не давал подозрительных ссылок

PROCEDURE Reestr()
LOCAL aSetKey:=SaveSetKey() //запоминаем навешанные ранее горячие клавиши
LOCAL cScreen:=SAVESCREEN() //запоминаем экран
LOCAL nTop:=5,nBottom:=19 //верхняя и нижняя границы initlist
LOCAL cHead:='Мой номенклатурный справочник' //первый заголовок
LOCAL cHead1:='тестовый пример' //второй заголовок (под первым)
LOCAL cHelp:="F8:Удалить" //строка помощи внизу экрана 
LOCAL cColHead:=; //заголовок колонок
"Группа Ном.номер  Наименование                                          Ед.изм"  
*12345 1234567890123 12345678901234567890123456789012345678901234567890  12345
*1234567890123456789012345678901234567890123456789012345678901234567890123456789
LOCAL aBlockCols:={;
{{||Grup},1},; //отображаем поле Grup, начиная со 1 позиции экрана
{{||NNum},7},; //поле NNUM, начиная с 7 позиции
{{||LEFT(Name,50)},21},; //первые 50 символа наименования, начиная с 21 позиции
{{||Ed},73}; //поле Ed, начиная с 73 позиции 
}
//открываем таблицу по пути sclad\mlabel.dbf c алиасом MLabel;
//функция БЭСТ LoadPath() возвращает путь до папки с БД выбранного предприятия
IF NetUse("MLabel",LoadPath()+"sclad\mlabel.dbf")  //если открытие успешно
   InitScreen(cHead,cHead1,cColHead,,cHelp) //специальная функция БЭСТ для подготовки экрана
   InitList(nTop,nBottom,cColHead,aBlockCols) //основная процедура БЭСТ для работы с реестром
ENDIF
DbCloseArea() //закрываем таблицу
RestScreen(,,,,cScreen) //возвращаем экран, какой был до этого
RestSetKey(aSetKey) //возвращаем горячие клавиши, которые были до этого
RETURN

/**********
В результате выполнения этой процедуры, мы получили отображение простейшего
реестра, с уже готовыми горячими вызовами (по Alt) калькулятора, блокнота,
курсов валют и экспорта в Excel. Работает также клавиша F8 - удаление.
*********/

Там же есть примеры и более функциональных процедур.
Сам пакет можно скачать здесь.
С уважением,
Ильин Евгений
Страницы: 1 2 3 След.
Читают тему (гостей: 1)