Сегодня начал использовать 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
2. Создание новой записи(непосредственно после создания записи в табл). Такое событие есть?
4. Ограничение ввода при редактировании\создании новой? Т.е. перед записью в БД. (Чтобы пользователь не мог ввести не ту цифру. нашел 09._aWhen – массив предусловий для ввода;10._aValid – массив постусловий; но каким образом они работают еще не понял). Есть ли возможность при неверном условии, заданном массивом постусловий вывести ошибку.
Т.е. [10] - "IIF(Mode>35,Mode,sErrMessage)"/.
2. Лучше всего использовать bPostGet. В один из параметров передается флаг о том, что данные записаны.
4. Элементами массивов могут быть блоки кода, а они в свою очередь позовляют все что угодно, главное чтобы результатом выполнения блока кода было логическое значение, отражающее разрешение или запрет. В уроках на старом форуме мы разбирали InitList - посмотрите плз на том примере об этих массивах
nordk пишет:
2. Лучше всего использовать bPostGet. В один из параметров передается флаг о том, что данные записаны.
4. Элементами массивов могут быть блоки кода, а они в свою очередь позовляют все что угодно, главное чтобы результатом выполнения блока кода было логическое значение, отражающее разрешение или запрет. В уроках на старом форуме мы разбирали InitList - посмотрите плз на том примере об этих массивах
Спасибо, посмотрю. Просто с первого раза что-то не нашел.
А у меня вот какая проблема с "вложенными" спецфункциями. Все работает прекрасно, но возникает "глюк":
1. Вызываю свой InitList(спецфункцией, внутри все работает).
2. Выхожу из своего реестра (оказываюсь опять в исходной позиции)
3. Теперь вызываю снова спецфункцию со своим InitList, а на самом деле исполняется "вложенная" спецфункция!!!
(Отрображаются названия спецфункций верно, а вот вызывается совсем не та)
Может я что-то упустил и нужно как-то "специально" завершать работу с InitList?
Или есть ли возможность "нарисовать" свою кнопочку "Операции" и оттуда вызывать вложенные спецфункции? (Поможет или нет - будет видно)
P.S. Самое обидное, что на "черновой" БД такого не происходит. А вот в рабочей, куда только что "установил" такой глюк.
"Поковырялся" в feval.dbf - "ничего такого". Единственное пути в "грязной" абсолютные. А в рабочей имя файла. В "грязной" тоже неправильно работает. Не сразу заметил, т.к. там оч много спецфункций. Таже ситуация...
Денис пишет:
Посмотрите файл feval.dbf, может он прояснит ситуацию
Смотрел.
В общем, пошёл на хитрость. Как срабатывает глюк:
У меня две вложенные спецфункции.
После вызова своего InitList и возврата обратно не работают как раз 2 самые первые спецфункции в списке (список по алфавиту отсортирован).
Я добавил две пустышки-спецфункции, которы ничего не делают, а при "глюке" будут срабатывать вложенные спец-ии, которые выдают ошибку.
Единственное, что очень неприятно - это 2 никому ненужные спецфункции.
Дело в том, что, как я понимаю, использование спецфункций из реестров пользователей, вызванных из плагинов - недокументированная возможность.
Если работает, ну и , но лучше использовать интерфейсные возможности программы.
Можно прекрасно обойтись кнопками и меню.
к примеру
nordk пишет:
А у Вас K_CTRL_R определена ? Может просто циферками напишете ?
Ну, разумеется нет!!! (откуда б я знал)
Да, все, цмферками все работает, здорово!!! Спасибо большое!!!
Цитата
itman пишет:
Дело в том, что, как я понимаю, использование спецфункций из реестров пользователей, вызванных из плагинов - недокументированная возможность.
Если работает, ну и , но лучше использовать интерфейсные возможности программы.
Можно прекрасно обойтись кнопками и меню.
к примеру
nordk пишет:
А у Вас K_CTRL_R определена ? Может просто циферками напишете ?
Ну, разумеется нет!!! (откуда б я знал)
Да, все, цмферками все работает, здорово!!! Спасибо большое!!!
А что у Вас при компиляции программа не ругалась на неизвестную переменную ?
Для таких переменных надо ch специальный где они определены добавлять
Теперь не работают @GET'ы в моих функциях, которые привязал к исполнению по нажатию кнопок...
До этого, при их вызове чз вложенные спецфункции все работало...
nordk пишет:
А что у Вас при компиляции программа не ругалась на неизвестную переменную ?
Для таких переменных надо ch специальный где они определены добавлять
Денис пишет:
А если так SETKEY(K_CTRL_R,{||MyFunction() ,0})?
Как раз так и пишу.
( Только на блок подаю не 0, а люб др число, тогда по завершении ф-ии я не выхожу из реестра.
Надо MyFunction переделать, чтобы возвращала не nil.)
Проблема, думаю с InitList, который в это же время работает.
itman пишет:
а может с прорисовкой обновлением экрана?
Может, может...
Если можно попобробнее.
Я уже чего только не пробовал делать... Когда срабатывает READ, после ввода иногда получаю ошибку:
Операция >
неверный аргумент
Проблема в том, что по нажатию Enter, после срабатывания моего READ вместо того, чтобы завершился мой read обрабатывается нажатие Enter ListInit'ом... И у меня как раз и появляется запрос ввода ...
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, остальные, увы, догадки, только завтра:(
Не понимаю что Вы тут опять перехватываете
Если проблема с переназначением клавиш, то опять хочется спросить:
А в описании функций смотрели такие как
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()?
После этого все будет как обычно? (Сейчас не могу проверить)
Самый лучший способ научиться, проанализировать исходники рабочих примеров.
Т.к. 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 - удаление.
*********/
Там же есть примеры и более функциональных процедур.
Сам пакет можно скачать здесь.