Автор | Сообщение |
|
| |
Пост N: 17
Зарегистрирован: 30.05.11
|
|
Отправлено: 03.06.11 23:27. Заголовок: All In One
В связи с написанием программы по разным частям кода возникают трудности. Чтобы не задавать вопросы в разных темах и не забыть в какой именно, буду спрашивать в этой. Я возможно этим нарушу правила форума, вопросы будут затрагивать разнообразные функции, но пусть оправданием мне будет то, что все они относятся к одной программе. Вопрос №1 В get поле вводится какое то значение и если оно существует в справочнике, переходим в следующее get поле, если же не существует, то выдается предупреждение об этом. Сам оператор не имеет право добавлять это значение в справочник, но, убедившись в том, что он ввел без ошибок, имеет право оставить это значение в get поле и перейти в следующее. Чтобы случайно не проскочило ошибочно введенное значение, выход из get поля должен осуществляться по нестандартной клавише( т.е. K_ENTER, K_DOWN не подходят). Например подошло бы Ctrl+Enter Реализовать самому не удалось Вопрос № 2. В dbedit отобразить базу так, чтобы видеть максимальное число последних записей и чтобы курсор находился на последней записи use base new go bottom base->dbedit() вижу только одну последнюю запись use base new go bottom skip -17 base->dbedit() вижу все последние записи, но курсор находится на первой видимой use base new go bottom skip -17 skip 17 base->dbedit() вижу только одну последнюю запись Вопрос № 3. В dbedit даты отображаются в формате "дд.мм.гг", причем гг первые две цифры из гггг. Как отобразить в формате "дд.мм.гггг", не используя массив из picture для dbedit, чтобы не переделывать программу при изменении структуры базы. Вопрос № 4. в функции из valid изменяются значения других get переменных. Изменения становятся видимыми только тогда, когда курсор попадает в измененное соответствующее get поле, а хочется чтобы обновились сразу после выхода из поля, в котором они изменились. Обновляю так keyboard (replicate(chr(K_DOWN),17)+replicate(chr(K_UP),16)) Можно как то попроще? Вопрос № 5 При входе в get ... read в чужой программе на фоксе все поля пустые. В своей программе get переменные инициализирую командой space(n). Но после выхода из read и сохранения значений в полях базы с типом numeric выдает ошибку несоответствия типа данных. Обхожу так if !Empty() replace namebase->namefield with val(alltrim(namegetfield)) endif Как то попроще можно? Вопрос № 6 Есть строка из символов, которых не должно быть в веденном значении в get поле. Существует ли какая то функция, возвращающая true или false в случае наличия символов из строки 1 в строке 2? Или только посимвольно проверять?
|
|
|
Ответов - 105
, стр:
1
2
3
4
5
6
All
[только новые]
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 04.06.11 18:05. Заголовок: вопрос 1 - Enter - успешный ввод, если значение в справочнике, Tab - вся остальная подготовка
//вопрос 1 - Enter - успешный ввод, если значение поля ввода- в справочнике, Tab - вся остальная подготовка // После Tab - еще раз Enter .... @1,1 say "Фамилия" get F valid vld_get(,,,"F",@F) @2,1 say "Имя " get Name valid vld_get(,,,"Name",@Name) ... read ... // united valid Function vld_get(a,b,c,cvar_get,val_get) Local ret:=.t. do while .t. if cvar_get=NIL cvar_get := GETFLDVAR() val_get := &cvar_get endif do case case cvar_get="F" // fam ret:=.f. if lastkey()=K_TAB // get default value, pre-value val_get := space(len(val_get)) // val_get := padr("Иванов",len(val_get)) // val_get := look_internet() ret:=.f. EXIT endif ret := In_Sprav_fio(val_get) if !ret // no valid // need add val_get-> sprav message(val_get +" not in sprav ") ret:=.f. exit endif case cvar_get="Name" // name //.... otherwise endcase exit enddo return ret
|
|
|
|
| постоянный участник
|
Пост N: 536
Зарегистрирован: 27.01.07
|
|
Отправлено: 04.06.11 19:51. Заголовок: SergeyKorotun пишет:..
SergeyKorotun пишет: цитата: | А чем вам не нравится числовой тип поля для почтового индекса? |
| Нет проблем.
|
|
|
|
| |
Пост N: 29
Зарегистрирован: 30.05.11
|
|
Отправлено: 06.06.11 00:11. Заголовок: flagExit=.f. setkey..
flagExit=.f. setkey(K_F10, {|p, l, v| ExitOn(p, l, v, flagExit)}) @3,1 say " 2" get gF picture replicate("X",30) valid vgF("GF",flagExit) ... read function vgF(v,flgExit) if v=="GF" if flgExit flagExit=.f. return .t. endif endif select fam seek gF if found() return .t. else alert("Hand enter - F10") return .f. endif return .t. function ExitOn(p,l,v,flgExit) if v="GF" flagExit:=.t. keyboard chr(K_DOWN) endif return А вот это решение первого вопроса. Выход по F10. Хотел сделать по Ctrl+Enter. Не нашел инкей-кода
|
|
|
|
| |
Пост N: 204
Зарегистрирован: 11.06.10
|
|
Отправлено: 06.06.11 00:56. Заголовок: SergeyKorotun пишет:..
SergeyKorotun пишет: цитата: | Хоте сделать по Ctrl+Enter. Не нашел инкей-кода |
| Ctrl-Return 10 K_CTRL_RET
|
|
|
|
| |
Пост N: 53
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.06.11 20:33. Заголовок: Так ответы уже ответенв давно ....
SergeyKorotun, все ответы уже отвечены давно .... в мануале классов Get() и TBrowse[DB]() есть все и даже больше. Сергей, поймите правильно - многие долгожители конфы уже забыли когда использовали Dbedit() и @..GET.. READ. Clipper 5.01 - 5,x - Harbour - дают очень гибкий инструмент в виде классов и вот вопросы из этой тематики привлекли бы больше внимания.
|
|
|
|
| |
Пост N: 30
Зарегистрирован: 30.05.11
|
|
Отправлено: 06.06.11 23:04. Заголовок: Haz пишет: flagExit..
Haz пишет: цитата: | flagExit=.f. setkey(K_F10, {|p, l, v| ExitOn(p, l, v, flagExit)}) @3,1 say " 2" get gF picture replicate("X",30) valid vgF("GF",flagExit) ... read function vgF(v,flgExit) if v=="GF" if flgExit flagExit=.f. return .t. endif endif select fam seek gF if found() return .t. else alert("Hand enter - F10") return .f. endif return .t. function ExitOn(p,l,v,flgExit) if v="GF" flagExit:=.t. keyboard chr(K_DOWN) endif return А вот это решение первого вопроса. |
| К сожалению этот вариант подходит только для первой get переменной. Когда ввел значение, отсутствующее в справочнике, программа предлагает нажать F10 и переходит в следующее поле. Но если позже надо вернуться на предыдущее поле, то это оказывается невозможным. keyboard chr(K_DOWN) все равно переводит вниз. Назначать еще одну функциональную клавишу как то нехорошо, определять по lastkey() нажатую клавишу (стрелка вверх/ вниз или энтер) до F10 тоже будет давать сбои при ошибочном нажатии пользователем какой-то иной клавиши.
|
|
|
|
| |
Пост N: 31
Зарегистрирован: 30.05.11
|
|
Отправлено: 06.06.11 23:33. Заголовок: Haz пишет: Clipper ..
Haz пишет: цитата: | Clipper 5.01 - 5,x - Harbour - дают очень гибкий инструмент в виде классов и вот вопросы из этой тематики привлекли бы больше внимания |
| Я не только получил ответы на все свои вопросы, но и узнал очень много нового о возможностях клиппера. Мне давали ответы не только на форуме, а и присылали письма на почтовый ящик. Большое всем спасибо. Но программа хотя и в стадии завершения, но еще один большой справочник не подключен (улицы), так что тема не закрывается. По фамилиям, именам и отчествам справочники не подключал, так как не очень то они нужны. Нет смысла не добирать несколько букв в фамилии, чтобы потом вызвать справочник, в котором будет сотня продолжений. После ввода фамилии проверил наличие ее в справочнике и если ее нет, выдал сообщение пользователю. А вот справочник улиц подключить надо. Иногда в паспортном столе записывают улицу с неверным окончанием и бывает необходимо выбрать самую подходящую. Попробую создавать временную базу, в которую попадут только улицы, удовлетворяющие условию фильтра и использовать ее в качестве справочника (еще раз повторюсь: переход на харбор будет производится только после написания программы на клиппер 5.01). Вопрос: после использования этой временной базы перед ее закрытием можно как-то запретить запись базы на диск?
|
|
|
|
| |
Пост N: 205
Зарегистрирован: 11.06.10
|
|
Отправлено: 07.06.11 00:04. Заголовок: SergeyKorotun пишет:..
SergeyKorotun пишет: цитата: | Попробую создавать временную базу, в которую попадут только улицы, удовлетворяющие условию фильтра и использовать ее в качестве справочника (еще раз повторюсь: переход на харбор будет производится только после написания программы на клиппер 5.01). Вопрос: после использования этой временной базы перед ее закрытием можно как-то запретить запись базы на диск? |
| А еще в харбор можно создавать базу в памяти (библиотека hbmemio): REQUEST HB_MEMIO PROC Main() LOCAL nI FIELD F1 DBCREATE("mem:test", {{"F1", "N", 9, 0}},, .T., "memarea") FOR nI := 1 TO 1000 DBAPPEND(); F1 := HB_RANDOM() * 1000000 NEXT INDEX ON F1 TAG f1 DBEVAL({|| QOUT(F1)}) DBCLOSEAREA() DBDROP("mem:test") // Free memory resource RETURN SergeyKorotun пишет: цитата: | Я не только получил ответы на все свои вопросы, но и узнал очень много нового о возможностях клиппера. |
| С такими знаниями о клиппере с русской докой, лучше уже начинать изучать харбор, плюс к харбору несколько десятков английских слов выучите и уже не будет так страшно копаться в английской доке .
|
|
|
|
| |
Пост N: 54
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.06.11 06:33. Заголовок: SergeyKorotun пишет:
SergeyKorotun пишет: цитата: | Вопрос: после использования этой временной базы перед ее закрытием можно как-то запретить запись базы на диск? |
| С трудом вериться что вообще такое возможно, учитывая размер базы и используемую память DOS приложения. цитата: | Попробую создавать временную базу, в которую попадут только улицы, удовлетворяющие условию фильтра и использовать ее в качестве справочника |
| Попробуйте перекомпилировать свою программу в Clipper 5.3, скорее всего никаких доработок не потребуется вообще, а освоить SCOPE вам тут помогут
|
|
|
|
| |
Пост N: 48
Зарегистрирован: 18.02.11
|
|
Отправлено: 07.06.11 21:27. Заголовок: SergeyKorotun пишет:..
SergeyKorotun пишет: цитата: | Но если позже надо вернуться на предыдущее поле, то это оказывается невозможным. keyboard chr(K_DOWN) все равно переводит вниз. |
| В С5.2 есть READEXIT(.T.). Добавляет K_UP (5), K_DOWN (24) к переходу по GET полям cMyvar = SPACE(10) lLastExit = READEXIT(.T.) // Result: Turn on exit keys @ 10, 10 SAY "Enter: " GET cMyvar READ READEXIT(lLastExit) // Result: Restore previous setting Если используются функции VALID, то в начало надо вставлять: IF LastKey() == K_UP; RETURN .T. ENDIF
|
|
|
|
| |
Пост N: 32
Зарегистрирован: 30.05.11
|
|
Отправлено: 08.06.11 00:44. Заголовок: SergejKis пишет: Ес..
SergejKis пишет: цитата: | Если используются функции VALID, то в начало надо вставлять: IF LastKey() == K_UP; RETURN .T. ENDIF |
| Выход из get поля должен происходить по клавише, определенной в SET KEY, например по F10. При нажатии F10 вызывается функция, имитирующая нажатие на клавиатуре стрелки вниз, которая автоматически вызывает функцию из валид. Можно было бы все время какой то переменной присваивать код нажатой клавиши и в функции, вызываемой по F10 инициировать или нажатие стрелки вниз или стрелки вверх. Но где гарантия что пользователь случайно не нажмет какую то другую клавишу и нажатие какой клавиши инициировать - неизвестно.
|
|
|
|
|
| |
Пост N: 33
Зарегистрирован: 30.05.11
|
|
Отправлено: 08.06.11 00:46. Заголовок: SergejKis пишет: В ..
SergejKis пишет: цитата: | В С5.2 есть READEXIT(.T.). Добавляет K_UP (5), K_DOWN (24) к переходу по GET полям |
| в клиппер 5.01 по умолчанию переход по полям осуществляется в том числе и перечисленными вами клавишами
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 08.06.11 10:33. Заголовок: гарантия - проверка всех значений формы после READ
гарантия - проверка всех значений формы после READ ( после всех get) перед записью в БД, вывод сообщения оператору при ошибках ввода и возврат к началу формы - первому GET
|
|
|
|
| |
Пост N: 34
Зарегистрирован: 30.05.11
|
|
Отправлено: 08.06.11 14:46. Заголовок: Два часа не могу заг..
Два часа не могу загнать записи из базы send в базу reciver. Структуры баз совпадают. Путя к базам верные. Пытался и так написать: "dbf\\send.dbf" Где ошибка? pth:=alltrim(nastr->path_dbf)+"reciver.dbf" use (pth) alias reciver new select reсiver append from ("dbf\send.dbf") ALL // for ((d_zvirka>=dateBegin) .and. (d_zvirka<=dateEnd)) commit select reciver use
|
|
|
|
| постоянный участник
|
Пост N: 538
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.06.11 15:45. Заголовок: 1. Что получаете? Ош..
1. Что получаете? Ошибку или что? 2. SergeyKorotun пишет: цитата: | append from ("dbf\send.dbf") ALL |
| ALL, по-моему, не нужно.
|
|
|
|
| |
Пост N: 35
Зарегистрирован: 30.05.11
|
|
Отправлено: 08.06.11 17:52. Заголовок: PSP пишет: 1. Что п..
PSP пишет: цитата: | 1. Что получаете? Ошибку или что? |
| Ошибок нет. Ни одной записи не переносится с базы send в базу reciver Без ALL тоже не переносятся. ALL не мешает, оно по умолчанию подразумевается
|
|
|
|
| Администратор
|
Пост N: 1968
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.06.11 18:11. Заголовок: SergeyKorotun пишет:..
SergeyKorotun пишет: цитата: | Ошибок нет. Ни одной записи не переносится с базы send в базу reciver |
| Проверьте, чтобы файл reciver ранее не был открыт монопольно. Если это так, то __dbApp (aka append from) не сможет его открыть
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 08.06.11 18:36. Заголовок: Модифицировал пример
pth:=alltrim(nastr->path_dbf)+"reciver.dbf" cfile_app := ("dbf\send.dbf") do while .t. if !file(pth) // mess( " source file not found") exit endif if !file(cfile_app) // mess( " append file not found") exit endif use (pth) alias reciver new if select("reciver")=0 //mess("error use reciver") exit endif select reсiver append from (cfile_from) ALL // for ((d_zvirka>=dateBegin) .and. (d_zvirka<=dateEnd)) commit select reciver close reciver //use //mess("ok") exit enddo
|
|
|
|
| |
Пост N: 36
Зарегистрирован: 30.05.11
|
|
Отправлено: 08.06.11 19:11. Заголовок: Pasha пишет: Провер..
Pasha пишет: цитата: | Проверьте, чтобы файл reciver ранее не был открыт монопольно. Если это так, то __dbApp (aka append from) не сможет его открыть |
| На протяжении дня в базу send набиваются записи и в конце рабочего дня переносятся в базу reciver из другой программы. Но на время написания программы копия база reciver помещена в отдельную папку, pth настроен именно к ней, и никем занята быть не может. В приведенном выше фрагменте программы она открывается впервые. for petr707 Проверки на наличие баз я в приведенный фрагмент не включил, но они там есть. Кроме того обе базы я перед append from выводил с помощью dbedit на экран.
|
|
|
|
| Администратор
|
Пост N: 1969
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.06.11 19:37. Заголовок: Я был невнимателен. ..
Я был невнимателен. Поскольку записи добавляются из send, и именно send открывается командой append from, проверьте, чтобы до выполнения append from send не была открыта монопольно
|
|
|
Ответов - 105
, стр:
1
2
3
4
5
6
All
[только новые]
|
|