Форум » Clipper » SET KEY TO как передать аргумент в вызывающую функцию » Ответить

SET KEY TO как передать аргумент в вызывающую функцию

SergeyKorotun: Есть три базы с одинаковой структурой, например справочник областей, районов и населенных пунктов. Базы создаются из программы и заполняются пользователем, поэтому выбор наименований баз за программистом. Пусть это будут базы: sprav1.dbf, sprav2.dbf, sprav3. dbf с единственным полем name character 20 Есть get поле, в которое надо ввести адрес, используя вышеупомянутые справочники по SET KEY K_F1 TO address надо вызвать первый справочник, выбрать нужную запись и добавить к тому, что уже есть в get поле (возможно набранное какое-то значение вручную до вызова справочника, а возможно и пустое значение) по SET KEY K_F2 TO address надо вызвать второй справочник, выбрать нужную запись и добавить к тому, что уже есть в get поле по SET KEY K_F3 TO address надо вызвать третий справочник, выбрать нужную запись и добавить к тому, что уже есть в get поле В get поле данные из справочников надо заносить в разных форматах, например: область - район - населенный пункт населенный пункт - район - область район - населенный пункт - область ... Поскольку справочник ведется пользователем, то после вызова справочника и ненахождения нужного значения пользователь здесь же добавляет (изменяет, удаляет, ...) нужное значения. То есть процедура ADDRESS будет объемная. И создавать три процедуры (ADDRESS1, ADDRESS2, ADDRESS3) нецелесообразно. Нужно из SET KEY в процедуру передать 1, 2 или 3 и в зависимости от этого значения в процедуре использовать базу sprav1. sprav2 или sprav3 соответственно. Вопрос: каким способом передать? SET KEY K_F1 TO address(,,,1) вместо 1 передается NIL Запрос из программы какой справочник выбрать не предлагать. Реализовал циклический перебор справочников по единственной команде SET KEY K_F1 TO address, но очень неудобно, так как справочники в разных случаях нужно использовать в разных порядках (пример с областями, районами и населенными пунктами условный)

Ответов - 7

Pasha: SergeyKorotun пишет: Вопрос: каким способом передать? Не просто, а очень просто Вместо команды SET KEY K_F1 TO address(,,,1) надо вызвать функцию setkey(K_F1, {|p, l, v| Address(p, l, v, 1)})

SergeyKorotun: Спасибо, вызывается по Ф1 первый справочник, по Ф2 - второй, по Ф3 - третий. Для отображения справочников используется dbedit В самих справочниках используются функциональные клавиши Ф2-добавить запись в справочник, Ф3-редактировать, Ф4 - удалить запись и некоторые другие. Ф1 не используется. Так вот при вызове справочника по Ф1 все как и надо, а при вызове по Ф2 справочник разворачивается и одновременно срабатывает функция по добавлению новой записи, как вроде бы пользователь нажал клавишу Ф2(добавления записи). Аналогично вызывая справочник по Ф3 первая запись уже ждет редактирования, как вроде бы пользователь нажал клавишу Ф3(редактирования записи). Куда только не вставлял что-то типа (keyboard chr(32) inkey(0)), правильной работы не добился. Или справочник открывается нормально, но несрабатывают клавиши Ф2 и Ф3 для изменения справочника или начинают срабатывать только после нажатия Ф4 и сразу ж ESC(отмена удаления)

AlexMyr: SergeyKorotun пишет: Спасибо, вызывается по Ф1 первый справочник, по Ф2 - второй, по Ф3 - третий. Как вариант для вызова справочников назначить alt-f1, alt-f2, alt-f3


SergeyKorotun: AlexMyr пишет: Как вариант для вызова справочников назначить alt-f1, alt-f2, alt-f3 а если у меня будет 32 функции SETKEY()? Если все же не удастся использовать одинаковые клавиши, то через Alt назначу клавиши редактирования базы, значительно реже будут использоваться, чем вызов справочника. Но пару дней подожду, может у кого-то появятся какие-то решения

AlexMyr: У себя в старой проге в бровсе сделал по enter вызов меню: добавить, редактировать ... Одна клавиша - много действий. (на любителя)

AlexMyr: Еще как вариант func Address(p, l, v, 1) setkey(K_F1, ) назначаем setkey для dbedit ... очищаем setkey после dbedit setkey(K_F1, {|p, l, v| Address(p, l, v, 1)}) return т.е. при входе в функцию очищаем K_F1, на выходе вновь назначаем.

Andrey_IV: setkey(K_F1, {|p, l, v| Address(p, l, v, 1)}) setkey(K_F2, {|p, l, v| Address(p, l, v, 2)}) setkey(K_F3, {|p, l, v| Address(p, l, v, 3)}) setkey(K_F4, {|p, l, v| Address(p, l, v, 4)}) function Address(p, l, v, n) local aSave[12] aSave[02] := SETKEY(K_F2 , NIL); SET KEY K_F2 TO Add_Record() aSave[03] := SETKEY(K_F3 , NIL); SET KEY K_F3 TO Edit_Record() aSave[04] := SETKEY(K_F4 , NIL); SET KEY K_F4 TO Del_Record() // Тело функции - чего-то делаем SETKEY(K_F2 , aSave[02]) SETKEY(K_F3 , aSave[03]) SETKEY(K_F4 , aSave[04]) return nil



полная версия страницы