Форум » [x]Harbour » Перевожу Clipper на консольный Харбор » Ответить

Перевожу Clipper на консольный Харбор

MIKHAIL: Добрый день, уважаемое сообщество! Перехожу на Харбор, собрал программу, начинаю бороть ошибки несовместимости кода, по мере появления вопросов надеюсь на скорую помощь. Заранее всем участникам огромное спасибо!

Ответов - 170, стр: 1 2 3 4 5 6 7 8 9 All

MIKHAIL: Работаю с ADS Выдает ошибку построения индекса на основе данных связаных таблиц. Код имеет следующий вид: use pricen new index on kod to price use sklad new set relation to s_kodt into PRICEN index on PRICEN->cena to s_cena Ошибка: Error ADSNTX/3010 Error 3010: Unknown alias name used with field name in index key expression.: s_cena И еще одна ошибка при использовании сложных выражений в индексе: INDEX ON c_kod+IF(c_kod<0,0,IF(C_KOD==qmag,10000,if(fil>0,20000,if(osn,-10000,40000)))) TO clientss В Clipper все работает

Haz: MIKHAIL пишет: Выдает ошибку построения индекса на основе данных связаных таблиц. Из справки по ADS Problem: An error occurred in the Advantage Expression Engine parser. A field name within the key expression was aliased by an unknown alias name. Solution: Advantage only supports aliases for the current work area. If an alias to another work area is referenced, this error will result. Verify the alias name is spelled properly. PS:Если не секрет , какой смысл здесь от ADS, может на CDX перейти? возможно даже и пошустрее будет. Тем более вроде как ADS заставляете работать в режиме совместимости с NTX который не умеет автоматически открывать эти индексы и соответственно не оптимизирует запросы ( за исключение наличия словаря данных). ADS хорош как компактный сервер БД c его оптимизацией SQL запросов и конечно оптимизацией фильтров используя ПРОСТЫЕ индексы, во всяком случае я для себя это определил как главное . Если использовать локальный сервер ADS ( ADSLocal32.dll) - то только как тест или с числом пользователей не более 10, Уже давно обхожусь без SET RELATION и сложных INDEX, все достаточно шустро делает сам сервер , по команде SELECT * FROM ... JOIN .. WHERE создается рабочая область собранная из нескольких таблиц как надо. PPS: Может сразу на GUI ?

MIKHAIL: Haz Advantage only supports aliases for the current work area ADS для Clipper и Harbor по разному работают? Если не секрет , какой смысл здесь от ADS Смысл в том что проект написан с использованием ADS и работает много лет, в сети до 30 активных пользователей, несколько кассовых терминалов в гипермаркете с количеством транзакций десятки тысяч в день. Задача стоит перевести проект с минимальными переделками, а потом уже оптимизировать. Уже давно обхожусь без SET RELATION и сложных INDEX, все достаточно шустро делает сам сервер , по команде SELECT * FROM ... JOIN .. WHERE Речь идет о БД SQL ? Или ADS поддерживает запросы SQL ? Если в ADS есть такая возможность, где можно почитать про это поподробнее? Или лучше пример использования запросов и разбор ответов. С MySQL дело имел, такой подход интересно было бы использовать PPS: Может сразу на GUI ? В смысле? Забить на проект который писался 20 лет и с нуля новый разработать? Даже если не с нуля, нужно перевести то что есть, а потом уже GUI наверное...

Haz: MIKHAIL пишет: ADS для Clipper и Harbor по разному работают? Скорее всего по разному, вроде мелькала такая инфа, но утверждать не стану Для Clipper версия с 8 не поддерживается а уже текущая 11 . MIKHAIL пишет: Речь идет о БД SQL ? Или ADS поддерживает запросы SQL ? Если в ADS есть такая возможность, где можно почитать про это поподробнее? ADS поддерживает SQL почитать можно в справке. http://devzone.advantagedatabase.com/dz/webhelp/Advantage11.1/index.html Примеры вроде Dima тут не раз выкладывал можно поискать по форуму. MIKHAIL пишет: Забить на проект который писался 20 лет GUI морда не сильно увеличит время перевода с Clipper , но согласен в console привычнее и быстрее будет

Pasha: Клиент ads для клиппера поддерживает индексацию на клиенте, а все 32-х разрядные клиенты ads, в том числе харбор-клиент, не поддерживают. Поэтому такое создание индекса не сработает. Но это вопрос ads, а не харбора, и вопрос неразрешимый.

VitalClip: MIKHAIL пишет: И еще одна ошибка при использовании сложных выражений в индексе: INDEX ON c_kod+IF(c_kod<0,0,IF(C_KOD==qmag,10000,if(fil>0,20000,if(osn,-10000,40000)))) TO clientss В Clipper все работает А если попробовать: INDEX ON c_kod+IIF(c_kod<0,0,IIF(C_KOD==qmag,10000,iif(fil>0,20000,iif(osn,-10000,40000)))) TO clientss

MIKHAIL: VitalClip пишет: А если попробовать: INDEX ON c_kod+IIF(c_kod<0,0,IIF(C_KOD==qmag,10000,iif(fil>0,20000,iif(osn,-10000,40000)))) TO clientss Не работает. Ну это не так принципиально, перепишу.

MIKHAIL: Еще вопросики: 1.Как запустить консольный Harbor в виде системной службы, в скрытом виде? 2.Можно ли одновременно использовать ADS в одной программе по IP и IPX протоколу, по выбору? Мне нужно конектиться к БД которая на NW лежит и одновременно подключаться к удаленной БД через интернет. 3.Можно ли в консольной версии Harbor подключить такие библиотеки как FR ?

Andrey: MIKHAIL пишет: 3.Можно ли в консольной версии Harbor подключить такие библиотеки как FR ? Да. У меня задачи с ним с 2008 года работают, только у меня больше всего на хХарборе, но это не принципиально. Демонстрашки можешь скачать с ... Облом, нет уже сайта http://www.paritetsoft.ru/frh.htm Ну тогда предлагаю мои примеры и просмотр файлов FR на МиниГуи смотри здесь https://cloud.mail.ru/public/39dd9efd1bbe/FastReport40 Если что заинтересует, пиши.

Haz: 1.Как запустить консольный Harbor в виде системной службы, в скрытом виде? В исходниках есть пример службы core\contrib\hbnetio\utils\hbnetio

MIKHAIL: Error BASE/1005 Message not found: TBCOLUMN:_COLORBLOC Где посмотреть справку по Tbrowse ?

Pasha: Справку можно посмотреть в ng по клипперу, а по поводу этой ошибки: замените выражение вида <obj>:colorbloc на <obj>:colorblock

MIKHAIL: Pasha пишет: замените выражение вида <obj>:colorbloc на <obj>:colorblock Спасибо, глаз замылился, а в Clipper и так работало... Еще вопросы: Я так понимаю что цветовая палитра может быть более расширенная? Где посмотреть полную карту палитры? цвет вида g*+/b не мигает, как исправить? Какие можно шрифты использовать в консоли?

petr707: Моноширинные. Courier New, Lucida Console,Consolas..

MIKHAIL: petr707 пишет: Моноширинные. Courier New, Lucida Console,Consolas.. А работать со шрифтами так же как и в clipper? или там своя система управления шрифтами?

Dima: для WVT терминала hb_gtInfo(HB_GTI_CODEPAGE, 255) hb_gtInfo(HB_GTI_FONTNAME, 'Lucida Console') hb_gtInfo(HB_GTI_FONTQUALITY,4) тут размеры HB_GtInfo(HB_GTI_FONTSIZE , nFontH) HB_GtInfo(HB_GTI_FONTWIDTH, nFontW)

MIKHAIL: Dima пишет: для WVT терминала hb_gtInfo(HB_GTI_CODEPAGE, 255) hb_gtInfo(HB_GTI_FONTNAME, 'Lucida Console') hb_gtInfo(HB_GTI_FONTQUALITY,4) тут размеры HB_GtInfo(HB_GTI_FONTSIZE , nFontH) HB_GtInfo(HB_GTI_FONTWIDTH, nFontW) Не понимаю как использовать шрифты различных размеров одновременно? Мне нужно стандартный шрифт и крупнее в 5 -6 раз Как могу поменять толщину шрифта? Как изменить шрифт у в полноэкранном режиме? Как автоматически запускть в полноэкранном режиме?

Dima: у себя делаю так примерно. [pre2] #REQUEST HB_GT_WVT hb_gtInfo(HB_GTI_FONTNAME, 'Lucida Console') hb_gtInfo(HB_GTI_FONTQUALITY,4) nWidth := HB_GtInfo(HB_GTI_DESKTOPWIDTH) nHeight := HB_GtInfo(HB_GTI_DESKTOPHEIGHT) nFontH := Int(nHeight/25) nFontW := Int(nWidth /80) HB_GtInfo(HB_GTI_FONTSIZE , nFontH) HB_GtInfo(HB_GTI_FONTWIDTH, nFontW) setmode(25,80) [/pre2] Но это будет не полноэкранный режим а окно. Что касается атрибутов шрифта , копни "hbgtinfo.ch"

Dima: Пример самодостаточный , поиграйся с ним . [pre2] #include "hbgtinfo.ch" proc main local nWidth,nHeight,nFontH,nFontW REQUEST HB_GT_WVT_DEFAULT REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) hb_gtInfo(HB_GTI_MAXIMIZED,.t.) hb_gtInfo(HB_GTI_FONTNAME, 'Lucida Console') hb_gtInfo(HB_GTI_FONTQUALITY,4) nWidth := HB_GtInfo(HB_GTI_DESKTOPWIDTH) nHeight := HB_GtInfo(HB_GTI_DESKTOPHEIGHT) nFontH := Int(nHeight/25) nFontW := Int(nWidth /80) HB_GtInfo(HB_GTI_FONTSIZE , nFontH) HB_GtInfo(HB_GTI_FONTWIDTH, nFontW) setmode(25,80) ? "TEST" ? "ПРОВЕРКА" wait return [/pre2]

Vlad04: Речь идет о БД SQL ? Или ADS поддерживает запросы SQL ? Если в ADS есть такая возможность, где можно почитать про это поподробнее? Я использую локальный ADS для формирования данных для некоторых отчетов, примерно так AdsConnect('C:\') nSele:=Select() ; Select (nSele+1) AdsCreateSQLStatement('QUERY', 2) sQlStr:='SELECT DISTINCT w.n_otdel,k.kucha,k.Nomk,k.fam,k.im,k.ot,k.pol,k.birth_date,'; + 'k.DOC_TYPE,k.DOC_SER,k.DOC_NUM,k.NO_POLIS,k.SMK_CODE,'; + 'k.POLIS_SER,k.POLIS_NUM,k.EDIN_POLIS,k.NASP_CODE2,W.S_TYPE '; + ' FROM '+Par2+'ARC\Karta kT, '; + Par2+'ARC\SWIST W,'; + Par2+'KLIENT K '; + ' where ((kT.Unicum = K.Unicum) and (kT.N_TALON = W.N_TALON)'; +' AND (K.N_TARIF =0 ) AND (kT.Oplata =2) AND '; + IIF(i=1,' (W.S_TYPE ='+chr(39)+'R'+chr(39)+') ',' (W.S_TYPE <> '+chr(39)+'R'+chr(39)+') '); + ') ORDER BY 4,5' AdsPrepareSQL(sQlStr) AdsExecuteSQL(sQlStr) nRecCount:=RecCount() if nRecCount > 0 Создание индексов только в RDD CDX. Конфликтов не замечено, хХарбоур 1 Если у тебя много подключений? то желательно НЕ локальный сервер ADS

MIKHAIL: Vlad04 пишет: nRecCount:=RecCount() if nRecCount > 0 А какой формат возвращаемых данных? Как их разбирать?

MIKHAIL: Еще вопросы: - можно ли вставить картинку в Tbrowse ? - где можно посмотреть примеры подключения к MYSQL ?

Vlad04: А какой формат возвращаемых данных? Как их разбирать? Это та же DBF. Формат возвращаемых данных = Формату исходных полей, которые учавствуют в запросе.

Haz: MIKHAIL пишет: А какой формат возвращаемых данных? Как их разбирать? 1) в результате выполнения SQL запроса получаем открытую рабочую область с записями по условию SQL 2) разбирать как обычную раб область к примеру while !eof() ...skip ... end MIKHAIL пишет: где можно посмотреть примеры подключения к MYSQL в примерах MiniGui есть несколько , вот один C:\MiniGUI\SAMPLES\BASIC\MYSQL\ Vlad04 - опередил

Dima: MIKHAIL пишет: - можно ли вставить картинку в Tbrowse ? Картинки показывать можно но в бровс вставить скорее всего не получится (ну разве что в заголовок) и для этих целей лучше использовать одну из GUI библиотек.

MIKHAIL: Dima пишет: Пример самодостаточный , поиграйся с ним . А с какими параметрами поиграться? как добиться одновременного использования шрифтов разных размеров? У меня меняется шрифт на всем экране. А в полноэкранном режиме впечатление такое что справа еще отступ символов на 10, 80 символов выводит не до конца экрана...

Dima: MIKHAIL пишет: как добиться одновременного использования шрифтов разных размеров? Боюсь ни как...

MIKHAIL: Dima пишет: Боюсь ни как... т.е. только под GUI можно?

Dima: MIKHAIL пишет: т.е. только под GUI можно? Да

petr707: Видимо, все-таки можно иметь разные шрифты в разных открытых окнах. В пределах одного окна - только один размер.

Dima: petr707 пишет: Видимо, все-таки можно иметь разные шрифты в разных открытых окнах. да это понятно что в разных можно

MIKHAIL: Как подключить мышку для WVT терминала ?

petr707: Можно начать с mousetst.prg из комплекта HBxx

MIKHAIL: petr707 пишет: Можно начать с mousetst.prg из комплекта HBxx А как привязать к prompt, achoice, get ? Неужели нет встроенного механизма обработки стандартных объектов? Работа с тачскрином аналогична мышке?

MIKHAIL: petr707 пишет: В пределах одного окна - только один размер. А может есть какие нибудь функции вывода текста в графике другим шрифтом, как в clipper например: GWRITEAT(X , Y , cString, nColor, LLG_MODE_SET, aFont)

Dima: harbour\contrib\gtwvg\ Там есть примеры

petr707: Achoice и get будут реагировать на мышку, как только откроется прием событий от мышки INKEY_ALL Для GET мышка может дать проблему за счет произвольного доступа к любому поле на форме, если специально об этом не позаботиться. Клавишками - только последовательный(ну или контролируемый программой) обход полей ввода на форме. Мышка для VWT это все же "эрзац". Возможно, есть смысл выбрать сразу GUI (графику с мышкой), если тип задачи этого сильно требует.

MIKHAIL: petr707 пишет: если тип задачи этого сильно требует. Просто хочется под планшет интерфейс адаптировать, никогда с мышкой не требовалось работать... А как открыть прием событий INKEY_ALL для prompt, get, achoice и tbrowse ?

petr707: Поиск по EVENTMASK в этой конфе даст наводки. И смотрите примеры PRG из комплекта поставки Harbour

MIKHAIL: petr707 пишет: В пределах одного окна - только один размер. Видимо все же можно выводить другой шрифт с помощью Wvt_DrawLabel

Dima: MIKHAIL Если время есть и желание то конечно лучше все делать в GUI. Согласен с Петром.

MIKHAIL: Можно ли запустить на выполнение программу без открытия окна? Или в скрытом режиме, либо в трее ?

petr707: Нужно уточнить нужные условия запуска - зачем без окна ? Чтобы картинка не мелькала ? Задачу, свернутую в трей, оператор может поднять и снять(удалить). 1) Запуск от любой обертки вида START ..c параметрами , RUNAS и т.д. 2) По Заданию планировщика Windows - разовому или постоянно существующему, особенно если от другого профиля 3) Написать на Harb свой запускатель с нужными свойствами 4) Окно может быть, но быть невидимым. Это устроит ?

Dima: MIKHAIL пишет: Можно ли запустить на выполнение программу без открытия окна? Да , как сервис.

fil: Тоже без окна do while .T. бла-бла-бла sysrefresh() enddo

MIKHAIL: petr707 пишет: Нужно уточнить нужные условия запуска - зачем без окна ? Головная программа будет запускать на выполнение вспомогательную программу, работа с интерфейсом которой не нужна совсем, а выполняться она может некоторое время и само по себе окно может мешать или кто то попробует его закрыть. Поэтому нужно его как то скрыть от пользователя. Dima пишет: Да , как сервис. А вчем принципиальная разница от обычного приложения и как это реализовано? Какие управляющие команды запускают программу как сервис? fil пишет: do while .T. бла-бла-бла sysrefresh() enddo Не совсем понял в чем тут соль? я так понимаю это для MiniGUI что то? У меня консольная программа. Хотелось бы просто как то отключить консоль, что бы небыло окна

SergKis: MIKHAIL пишет:Хотелось бы просто как то отключить консоль, что бы небыло окна Не делайте команд (функций) очистки и вывода на экран - окна консоли не будет, т.е. CLS, CLEAER SCREEN, Say .., ? ...

MIKHAIL: SergKis Спасибо

MIKHAIL: Собираю проект, выдает такую ошибку: Compiling 'nakl.prg'... nakl.prg(4211) Error E0001 Illegal character '\x00' nakl.prg(4211) Error E0030 Syntax error "syntax error at ''" 2 errors смотрю файл: 4210:return ret 4211: 4212: 4213:func get_gtd(cl,gt,x,y) что ему не нравиться? строки удалял и добавлял, смещается ссылка ошибки на номер строки и все. В clipper все без проблемм собирается.

Andrey: MIKHAIL пишет: что ему не нравиться? С ходу не могу сказать в чем ошибка. Выдели в отдельный файл эту функцию и попробуй скомпилировать. Если не получается, то давай этот кусок (т.е. полностью эту функцию)

Dima: MIKHAIL пишет: nakl.prg(4211) Error E0001 Illegal character '\x00' Была похожая штука. Это у тебя вкрался левый символ. С помощью редактора FAR manager , посмотри файл в разных кодировках и увидишь бяку. Например: Текст набран в кодировке OEM (866) и не компилится , переключаемся в кодировку ANSI (1251) , наблюдаем левый символ(ы) , валим их(его) , возвращаемся в кодировку OEM (866) , и всё прекрасно компилится.

MIKHAIL: Dima пишет: Текст набран в кодировке OEM (866) и не компилится , переключаемся в кодировку ANSI (1251) , наблюдаем левый символ(ы) , валим их(его) , возвращаемся в кодировку OEM (866) , и всё прекрасно компилится. Точно, открыл в другом редакторе, увидел, удалил все нормуль. Спасибо.

petr707: Использую EXECANDWAIT отсюда click here и hb_processRun

MIKHAIL: ──────────────────────────────────────────────────── Странная ошибка вылезает при работе через ADS: Error ADSNTX/5068 Error 5068: There is no current record. Called from TBROWSE:READRECORD(0) Called from TBROWSE:STABILIZE(0) При выводе объекта Tbrowse. При чем она как то не постоянно, один и тот же документ может отобразить без ошибки, а потом выводит несколько строк и начинает выдавать эту ошибку. при игнорировании ее выводит еще несколько строк и так далее пока не выведет все. При чем когда она начинает появляться где либо в программе, так же появляется и в других объектах, которые до этого нормально выводились. ADS 7 Novell 6.5 по IPX В Clipper эта-же база работает без ошибок.

Dima: MIKHAIL пишет: Error ADSNTX/5068 Error 5068: There is no current record индекс пересоздавал ?

MIKHAIL: Dima пишет: индекс пересоздавал ? Да

MIKHAIL: Как можно управлять выводом лога ошибок программы?

PSP: MIKHAIL пишет: Как можно управлять выводом лога ошибок программы? Посмотрите в исходниках Харбора файл errsys.prg

Dima: MIKHAIL пишет: Как можно управлять выводом лога ошибок программы? Set( _SET_HBOUTLOG[, <cFileName>] ) -> <cOldFileName>

MIKHAIL: Dima а у меня вообще при ошибке выполнения, файл лога не создается. Что нужно добавить в код?

Dima: MIKHAIL Проверил у себя , таки да , не создается лог в случае падения. PS Можно вот так xhb_errorsys() где то в самом начале проги.

MIKHAIL: Dima Так работает но имя лога не меняется.

Dima: MIKHAIL Пробуй XHB_ERRORLOG( [<cFileName>], [<lAppend>] ) -> { cOldName, lOldAppend }

petr707: Насколько помню, в hb_out.log пишутся только серьезные внутренние ошибки, которые нельзя перехватить в ERRSYS.PRG. Можно взять к себе текст ERRORSYS() из ..\src\rtl\errsys.prg и модицировать у себя выводом в нужный файл-лог Можно даже взять ERRORSYS из Clipper

MIKHAIL: Как можно сделать разбор XML файла? где можно список функций и описание почитать?

Dima: MIKHAIL Начни с http://clipper.borda.ru/?1-4-0-00000708-000-0-0-1328625125

AndreyZh: MIKHAIL пишет: Как можно сделать разбор XML файла? где можно список функций и описание почитать? Мои соболезования... Самому пришлось с 20.09.15 с нуля изучать данную "тему", в связи с появлением ЕГАИС в розничной торговле - в теории, на примитивных примерах всё кажется понятным, а в более сложных задачах 1. По документации есть классы TXML*, которые позволяют парсить и собирать хмл файлы, к данным классам приведено множество примеров использования переменных и методов - это наверное АЗБУКА. На "импортных" форумах в основном "разжовывают" примеры к этим классам 2. Реальность. Мной в процессе освоения данной темы создана и развивается программа. При изучении тщательно описывал в тексте программы нюансы и "засады" данных классов для xHarbour. Ее (программы) исходные текста, примеры разбираемых и порождаемых хмл файлов выложены для первого релиза на "странице" программы: http://olegon.ru/showthread.php?t=23079 - можете использовать для освоения... съэкономите кучу времени

MIKHAIL: Так и не смог понять откуда возникает ошибка Error ADSNTX/5068 Error 5068: There is no current record Она появляется только под Harbour +ADS (Local или Remote), при чем под Harbor+DBFNTX и Clipper+ADS все работает без проблемм... У кого есть какой то опыт на этот счет? Появляется в момент перемещения например dbseek() или dbgoto()... при чем не всегда... Может ADS + Harbour отслеживает выполнение set relations более строго чем для clipper ?

petr707: Похоже на поведение при индексе , который не соответствует таблице. Есть индексные выражения из связанных по relation областей ? Сделайте проверку индекса после свала.

MIKHAIL: petr707 пишет: Похоже на поведение при индексе , который не соответствует таблице. Сделайте проверку индекса после свала. Так дело в том что с одной базой работают приложение на Clipper и та же самая переведенная на Harbour. Так вот Clipper ведет себя нормально Причем тестил как на ADS7+Novell IPX так и на ADS10+Linux IP, везде одна борода... даже на LocalAds это происходит petr707 пишет: Есть индексные выражения из связанных по relation областей ? Да, есть, буду пробовать их отключать, но больно муторно выискивать где нужно будет править код....

petr707: .. работают приложение на Clipper и та же самая переведенная на Harbour.. Одновременно ? Лучше не делать. Переправу надо перейти.

MIKHAIL: petr707 пишет: Одновременно ? Лучше не делать. Так и отдельно, без Clipper приложений тот же косяк...

petr707: Старый способ - контрольная группа - хоть в биологии хоть в космонавтике 1) Сделать тестовую среду как копию (реплику) основной БД 2) Провести полную начальную индексацию 3) использовать только новый софт 4) повторять все проводки как в рабочей базе со старым софтом 5) после первого свала - всем стоп 6) ну и изучайте по всем срезам состояние этого контрольного примера

Pasha: Ads имеет два клиента: старый клипперовский 16-разрядный, и Ace. Они работают не одинаково. Проблема может быть именно в ace, даже не в харборе.

Dima: вообще у меня была связка Clipper+ADS и Harbour+ADS обе проги юзали одну и ту же базу. версии ADS (ACE и для Clipper) были 5.5 и работало нормально

MIKHAIL: Скорее всего моя догадка была правильной, клиент под Харбор проверяет соответствие выполнения set relation, если передвинуть в связаной таблице на другую запись, будет эта ошибка. Убрал все relations пока полет нормальный...

Dima: MIKHAIL Сделай тестовый не большой пример.

MIKHAIL: Dima пишет: Сделай тестовый не большой пример. USE TABLE1 INDEX TABLE1 USE TABLE2 SET RELATIONS TO KOD INTO TABLE1 DBGOTO(10) далее если делать перемещение по table1 из текущей активной области, где значение индексного выражения не равно значению TABLE2->KOD, будет ошибка ADS 5068 т.е. например table1->(dbgoto(n)) table1->(dbseek(n))

MIKHAIL: Как использовать функцию AdsIsConnectionAlive() ? ADSHANDLE:=AdsConnect(cPath) ? AdsIsConnectionAlive(ADSHANDLE) // .F. ADSHANDLE:=AdsConnection(cPath) ? AdsIsConnectionAlive(ADSHANDLE) // .F. ADSHANDLE:=AdsConnect60(cPath) ? AdsIsConnectionAlive(ADSHANDLE) // .F. Что не так?

Dima: MIKHAIL пишет: ADSHANDLE:=AdsConnect(cPath) Не верно ловишь хендл Лови его так ADSHANDLE:=AdsConnection() после AdsConnect(cPath) если он вернет TRUE

MIKHAIL: Dima пишет: Лови его так ADSHANDLE:=AdsConnection() после AdsConnect(cPath) если он вернет TRUE Не получается: ? AdsConnect(cPath) // .T. ADSHANDLE:=AdsConnection() ? AdsIsConnectionAlive(ADSHANDLE) // .F. Чего то ей не хватает. Еще вопрос по AdsMgGetUserNames () Она выдает массив с информацией о пользователях несколько раз об одних и тех-же подключениях. С чем это может быть связано?

Dima: MIKHAIL пишет: ADSHANDLE:=AdsConnection() что вернуло тут ? какой тип подключения (ADS_LOCAL_SERVER , ADS_REMOTE_SERVER, ADS_AIS_SERVER ) ? IPX/SPX , TCP/IP ?

Dima: MIKHAIL пишет: Еще вопрос по AdsMgGetUserNames () Она выдает массив с информацией о пользователях несколько раз об одних и тех-же подключениях. С чем это может быть связано? Возможно отвалилась связь с ADS а коннект живет по умолчанию 120 сек. Или не совсем верно завершаешь программу. В конце вставь перед QUIT AdsDisconnect(ТВОЙ ХЕНДЛ) AdsApplicationExit()

MIKHAIL: Dima пишет: что вернуло тут ? какой тип подключения (ADS_LOCAL_SERVER , ADS_REMOTE_SERVER, ADS_AIS_SERVER ) ? IPX/SPX , TCP/IP ? LINUX TCP/IP ADS_REMOTE_SERVER ? ADSHANDLE:=AdsConnection() // 3966024

Dima: MIKHAIL пишет: LINUX TCP/IP ADS_REMOTE_SERVER с этим зверем не работал с сервером вынь AdsIsConnectionAlive работает нормально попробуй в ADS.INI в секции [SETTINGS] прописать USE_TCP_IP=1

Haz: MIKHAIL пишет: Чего то ей не хватает. версия сервера какая ? [pre2] HB_FUNC( ADSISCONNECTIONALIVE ) /* Determine if passed or default connection is still valid */ { #if ADS_LIB_VERSION >= 800 UNSIGNED16 bConnectionIsAlive = 0; AdsIsConnectionAlive( HB_ADS_PARCONNECTION( 1 ), &bConnectionIsAlive ); hb_retl( bConnectionIsAlive != 0 ); #else hb_retl( HB_FALSE ); #endif } [/pre2]

Dima: Haz пишет: версия сервера какая ? Хороший вопрос

MIKHAIL: Haz пишет: версия сервера какая ? LINUX 10.03

Dima: MIKHAIL пишет: LINUX 10.03 Это версия ADS под LINUX или версия LINUX ?

MIKHAIL: Это версия ADS под LINUX

Dima: MIKHAIL Можно попробовать "покурить" их форум на предмет ADSISCONNECTIONALIVE + LINUX http://devzone.advantagedatabase.com/dz/content.aspx?

Haz: MIKHAIL пишет: LINUX 10.03 а клиентская часть ( DLL на компе пользователя ) тоже версии 10 ? там есть adsver.exe - проверь на всякий случай

MIKHAIL: Haz пишет: а клиентская часть ( DLL на компе пользователя ) тоже версии 10 ? там есть adsver.exe - проверь на всякий случай Эта утилита показывает версию клиентской DLL, ее можно просто в свойствах файла увидеть, версии совпадают 10.0.0.3 ADS 64 и Linux 64 разрядный

Haz: Установи тестовый ADS Server под WIN , хотя бы на своем компе и проверь AdsIsConnectionAlive() там. у меня подключение такое ( сервер под win64 клиент под win32 ) adsConnect60( сDict, nServerType, cUser, cUserPass, 0, @hConnection ) AdsIsConnectionAlive(hConnection) дает .T.

Dima: Haz пишет: adsConnect60( сDict, nServerType, cUser, cUserPass, 0, @hConnection ) AdsIsConnectionAlive(hConnection) дает .T. Не запутывай человека словарями . При обычном коннекте у меня тоже работает AdsIsConnectionAlive.

MIKHAIL: А нужно какие значения прописывать для сDict, nServerType, cUser, cUserPass, hConnection ?

Haz: Dima пишет: Не запутывай я как пример привел, и в мыслях не было путать ))) MIKHAIL пишет: версию клиентской DLL, ее можно просто в свойствах файла увидеть возможно и так , не проверял. А по чеснаку она в текстовом виде в файле сразу после строки EsIAx!@# которую ADS использует как заголовок регистрационной информации.

Dima: MIKHAIL Ставь вот эту версию _http://devzone.advantagedatabase.com/dz/content.aspx?key=20&Release=16&Product=25&Platform=10 (последнюю 10.x) Там столько багов устранено по сравнению 10.03 в том числе и с индексами.

Haz: MIKHAIL пишет: А нужно какие значения прописывать для сDict, nServerType, cUser, cUserPass, hConnection ? это параметры конекта к словарю данных , пример тута https://github.com/harbour/core/blob/master/contrib/rddads/tests/datad.prg Дима посоветовал проще , без словаря обычным AdsConnect( в путь)

MIKHAIL: Попробовал по разному, под WIN32XP и ServerR8 64 на ADS 10.10 и ADS 9.10 и Linux 64 ADS64 10.10, везде функция выдает .F. Причем соединение с сервером устанавливается даже по AdsIsServerLoaded(), поэтому у меня были множественные соединения из одной программы.

Dima: MIKHAIL Попробуй тест (у меня работает) [pre2] Proc main local adshandle:=0 AdsSetServerType(2) if AdsConnect("c:\") adshandle:=AdsConnection() ? AdsIsConnectionAlive(adshandle) endif return [/pre2]

MIKHAIL: Dima пишет: if AdsConnect("c:\") adshandle:=AdsConnection() ? AdsIsConnectionAlive(adshandle) endif у меня все равно выдает .F. Может какие то установки или настройки ADS нужны?

Dima: MIKHAIL а если этот тест запустить непросредственно на винсервере r8 64 , где живет ADS.

Haz: MIKHAIL пишет: Попробовал по разному, под WIN32XP и ServerR8 64 на ADS 10.10 и ADS 9.10 и Linux 64 ADS64 10.10, везде функция выдает .F. 1 Поставь ADS Server на СВОЙ комп ( на котором запускаешь тестовую программу от Димы ) 2 убедись что на компе в системной папке винды , в путях поиска и в папке с тестом не было старых версий DLL от ADS потом проверь тест который дал Дима

Dima: MIKHAIL Что выдает ? AdsVersion(3) у меня Advantage 32-bit Client Engine for Windows, v10.1

MIKHAIL: Dima пишет: ? AdsVersion(3) Advantage 32-bit Client Engine for Windows, v10.10 Тестил на своем и на сервере, везде одно и тоже

Dima: MIKHAIL Да уж , полтергейст какой то )) А RddAds переcобирал c новым ACE ? ps может файер что то блочит........

MIKHAIL: Dima пишет: А RddAds переcобирал c новым ACE ? Я пока не очень разбираюсь в этом, подскажите как это сделать пошагово?

Dima: MIKHAIL пишет: Я пока не очень разбираюсь в этом, подскажите как это сделать пошагово? компилятор BCC или MINGW ? сырцы Harbourа есть ?

MIKHAIL: BCC, сырцы есть

Dima: MIKHAIL Следующий батник ложим в папку с сырцами RDDADS У меня они тут C:\svn\harbour-trunk\harbour\contrib\rddads\ Пути поправь на свои [pre2] set PATH=C:\bcc55\bin set HB_INSTALL_PREFIX=c:\hb32 set HB_DIR_ADS=C:\ads.10.10\acesdk set HB_WITH_ADS=C:\ads.10.10\acesdk c:\hb32\bin\hbmk2 rddads.hbp [/pre2] Стартуем батник , после его работы в этой папке видим 2 новых файла rddads.lib и ace32.lib Копируем их куда нужно (папка LIB Харбора)

Haz: MIKHAIL Dima пишет: Следующий батник ложим в папку с сырцами RDDADS У меня они тут C:\svn\harbour-trunk\harbour\contrib\rddads\ а взять их можно тут http://github.com/harbour/core/archive/master.zip ЗЫ в принципе заведомо рабочие библиотеки можно взять с этого форума , скачав здесь MiniGui и установив. там в поставке идут эти библиотеки

MIKHAIL: Собрал, все заработало! Еще мне не понятно отличие функций AdsMg*** Мне нужно получить список пользователей, а при AdsConnect() функция AdsMgGetUserName() не работает, приходится использовать AdsMgConnect(), но при этом получается несколько соединений к ADS от одного пользователя. И как узнать свое собственное подключение в списке ?

Dima: MIKHAIL пишет: AdsMg*** Для всех этих функций нужен AdsMgConnect()

Dima: MIKHAIL пишет: И как узнать свое собственное подключение в списке ? По имени компа [pre2] AdsMgConnect() if ADSMGGETHANDLE()>0 aRay := AdsMgGetUserNames() FOR j=1 TO Len( aRay ) if aray[j][1]==netname(1) // netname(1) лучше заюзать где то в начале проги и запомнить результат ? "Это я :)" exit endif NEXT endif AdsMgDisconnect() [/pre2] При одиночном коннекте AdsConnection + AdsMgConnect Массив выглядит примерно так [pre2] {{"MYCOMP", 0, "IPC Connection 2", "", "dima", "0.0.0.0"}, {"MYCOMP", 0, "IPC Connection 3", "", "dima", "0.0.0.0"}} [/pre2]

MIKHAIL: Спасибо всем огромное!!! Буду дальше разбираться

Dima: MIKHAIL На заметку http://clipper.borda.ru/?1-4-0-00000830-000-0-0

MIKHAIL: Иногда (редко) подвисает программа, не реагирует ни на что. Хотя иногда может и отвиснуть. Как отследить в чем проблемма? Код работал на Clipper много лет.

Dima: MIKHAIL По сети работает или локально ? Виснет в разных местах ? Какая ось на станции ?

MIKHAIL: Dima причина оказалась в железе, USB порт клавиатуры видно подглючивал.

MIKHAIL: Не полностью выдает детализацию ошибки, а именно номер строки ошибки. Выводит только номер строки функции где произошла ошибка. Как подправить?

Dima: MIKHAIL пишет: Не полностью выдает детализацию ошибки Покажи на простом примере , что имеется в виду.

MIKHAIL: Dima пишет: Покажи на простом примере , что имеется в виду. -------------------- Internal Error Handling Information --------------------- Subsystem Call ....: BASE System Code .......: 1133 Default Status ....: .F. Description .......: Bound error Operation .........: array assign Arguments .........: [ 1] = Type: N Val: 14 Involved File .....: Dos Error Code ....: 0 Trace Through: ---------------- LOGERROR : 0 in Module: xhb\xhberr.prg MAGAZIN : 432 in Module: magazin.prg Строка 432 это ссылка на функцию, в которой тоже несколько тысяч строк кода, где собственно и происходит ошибка.

Dima: MIKHAIL Да вроде все красиво. [pre2] Proc main Test() return ************* Func Test() local a:={} a[1]:=1 return nil [/pre2] Вывалило у меня так [pre2] Error BASE/1133 Bound error: array assign Called from TEST(7) Called from MAIN(2) [/pre2]

PSP: MIKHAIL, у тебя - xHarbour. Видимо, собран с опцией "suppress line numbers". Вот отсюда нули в модулях самого xHarbour

MIKHAIL: Dima Так дело в том что иногда отображает номер строки ошибки, а иногда нет. т.е. некоторые ошибки такие как: i:=1 len(i) выведет правильно номер строки, а такую: i:=1 ? i[1] не выводит.

Sergy: Судя по выкладке, используется нестандартный обработчик ошибок. Попробуйте на время тестирования заменить xhb/xhberr.prg на простой и дубовый errorsys.prg из дистрибутива и посмотреть на его результаты.

MIKHAIL: Sergy пишет: на простой и дубовый errorsys.prg из дистрибутива Я чего то не могу найти его в дистрибутиве. Может по другому называется? Пробовал от Clipper прикомпоновать, но он не замещает почему то встроенный. Что для этого нужно сделать ? Мне по сути нужно лог ошибок сохранять.

Dima: MIKHAIL пишет: Может по другому называется? ERRSYS.PRG теперь

MIKHAIL: Где можно взять или приобрести Fastreport ?

PSP: MIKHAIL пишет: Где можно взять или приобрести Fastreport ? FastReport сделал Сергей Спирин, который несколько лет назад умер. Так что, видимо, купить уже негде.

Dima: PSP пишет: Так что, видимо, купить уже негде У нас на форуме еще есть добрые джентльмены , которые думаю поделятся бесплатно.

petr707: Fastreport , строго говоря, это несколько другое. Сергей предоставлял FRH библиотеку-обертку для Harbour для работы с FastReport VCL Сам FastReport убежал вперед. Были еще попытки сделать Fastreport for Harbour , например click here FastReport for [x]Harbour. Libraries to manage FastReport from Harbour and xHarbour and on any GUI framework or even in console mode. FastReport vesion 4.15

MIKHAIL: Какими средствами можно перехватывать все нажатия клавиш и экранного вывода в консольном приложении?

Dima: MIKHAIL пишет: Какими средствами можно перехватывать все нажатия клавиш hb_gtInfo( HB_GTI_INKEYFILTER.....

MIKHAIL: Использую библиотеку FreeImage, все работало, добавил некоторые функции, Харбор их не видит: fi_GetFIFFromFilename и fi_FIFSupportsReading что нужно сделать ?

MIKHAIL: Можно ли в консольной версии расширить палитру стандартных цветов?

Dima: MIKHAIL Думаю нет (ИМХО)

MIKHAIL: Как можно подключить сторонюю библиотеку DLL ? Пробовал hb_LibLoad("payCEB.dll") Она возвращает пустой результат, т.е. не загружается. В описании библиотеки написано - Стандарт вызова функций: stdcall

nick_mi: Как то пробовал напрямую включать dll в HBMK и все нормально собралось и отработало.

Dima: MIKHAIL hb_DynCall Например [pre2] #include "hbdyn.ch" FUNCTION MAIN(cSource, cDest) hb_DynCall( { "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL }, cSource, cDest, 0 ) RETURN NIL [/pre2]

MIKHAIL: Dima пишет: hb_DynCall( { "CopyFileA", "kernel32.dll", HB_DYN_CALLCONV_STDCALL }, cSource, cDest, 0 ) А эта функция возвращает ответ вызываемой функции? И как обрабатывать ошибки?

Dima: Да что то возвращает. https://github.com/vszakats/harbour-core/blob/master/tests/dynwin.prg

Mitek: Занялся переносом на консольный xHarbour средних размеров проекта( ~ 800к исходников). Не находит 11 функций из состава СT NNETLOGGED NNETCAPACT NNETSETQ NNETCAPSSF NNETCAPBEG SPOOLACTIV SPOOLADD PRINTINIT BIOSDATE STACKFREE FILECHECK На что можно заменить или где взять более полную библиотеку ? Поиск по либам как советовали в теме http://clipper.borda.ru/?1-4-0-00000255-000-0-0-1334307608 не приносит результатов за исключением функции STACKFREE которая находитмя в vm.lib vm.lib у меня и до поиков линкновалась Версия xHarbour xHarbour Binaries 1.2.3 Rev. 10193 for BCC 5.5.1

PSP: Mitek пишет: Занялся переносом на консольный xHarbour А почему не Harbour?

Mitek: PSP пишет: А почему не Harbour? А собственно просто уже лет этак много xHarbour пользую но до сего древнейшего проекта все руки не доходили. Но собственно сути это не меняет... на harbour без X в оригинальных поставках я этих функций тоже не вижу... например в harbour-3.0.0-win Пока в голову только идет переопределить SPOOLACTIV - #xtranslate SPOOLACTIV()=> .F. SPOOLADD - #xtranslate SPOOLADD()=> .F. BIOSDATE почитать из реестра - #xtranslate BIOSDATE()=>CTOD ( GetRegistry(, 'HARDWARE\Description\System\BIOS', 'BIOSReleaseDate' ) ) ну или для Harbour - #xtranslate BIOSDATE()=> CTOD( win_regRead( "HKLM\HARDWARE\Description\System\BIOS\BIOSReleaseDate" ) ) STACKFREE - #xtranslate STACKFREE()=> 1000000 FILECHECK через md5 - #xtranslate FILECHECK(<cFileName>) => HB_MD5FILE(<cFileName>) Что делать с остальными пока не думал ... Просто типа размечтался что может кто подскажет где уже опробованные качнуть

PSP: В harbour есть библа hbct. Посмотрите.

Mitek: PSP Да смотрел я на эту библу еще пару лет назад и что . Нет там этих функций собственно так же как и в ее аналоге от xHarbour - CT.lib

PSP: А так уж эти функции все нужны? К примеру, NNet* предназначены для работы с Novell Netware. У вас используется сервер Novell Netware? Функция SPOOLACTIV - что-то связанное с печатью в DOS. Надо? Ну и т.д. Придется вам слегка код поправить.

MIKHAIL: Столкнулся с проблеммой. Перевел проект с Clipper 5.3 на Harbor 3.2 сервер NW + ADS7, пока отладка идет одновременно использую старую и новую версию программы. Обнаружил что индексы (ntx) по строке не корректно работают или не совместимы. Т.е. при создании индексов программой Clipper они не корректно отображаются в программе Harbora и с точностью наоборот. Странное дело, ведь индексы строит ADS. Длинна ключа в обеих случаях одинаковая. при этом DBFNTX драйвер работает корректно для обеих версий. Есть у кого мысли?

Dima: MIKHAIL У меня была похожая связка под ADS 5.xx , индексы IDX , работало нормально. PS Изначально были какие то глюки (уже не помню подробности) , Павел тогда помог и что то переделал в RDDADS Harbour. Dima пишет: (уже не помню подробности) Вроде связанное с кирилицей и 866 кодировкой

MIKHAIL: А есть какая то опция в компиляторе, что бы не весь проект заново собирался, а только измененные файлы? типа как в блинкере была инкрементальная сборка...

PSP: MIKHAIL пишет: А есть какая то опция в компиляторе, что бы не весь проект заново собирался, а только измененные файлы? типа как в блинкере была инкрементальная сборка... hbmk2 имеет опцию -inc

MIKHAIL: Есть файл базы данных товаров, порядка 100тыс. Как можно отследить что были изменены в ней определенные поля без полного сканирования ? Пробовал использовать время создания файла на диске, но видимо из за кэша, оно обновляется не сразу, если речь не идет о добавлении записей, dbcommit() не помагает.

Dima: MIKHAIL можно ввести еще одно поле TIMESTAMP и в случае изменения нужно поля писать в новое поле свежее значение

Andrey: Dima пишет: можно ввести еще одно поле TIMESTAMP и в случае изменения нужно поля писать в новое поле свежее значение Поле типа TIMESTAMP [pre2] AADD( aDbf , {"TS" ,"=", 8, 0 } ) // RDD-TimeStamp дата+время+миллисекунды[/pre2] автоматом само меняет значение при изменение любого поля записи. Наверное лучше использовать другой тип поля вот этот: [pre2]AADD( aDbf , {"IM" ,"@", 8, 0 } ) // TimeStamp, заполняешь сам[/pre2] и заполнять при изменении нужных тебе полей самостоятельно.

MIKHAIL: Andrey пишет: автоматом само меняет значение при изменение любого поля записи. это очень хороший вариант, если под NTX оно работает, проверю, спасибо!

MIKHAIL: Потребовалось пересобрать DBU, у меня почему то нет патча для него DBU53.RTP, где его можно взять?

Петр: Скачать архив См. extras\dbu

Andrey: MIKHAIL пишет: это очень хороший вариант, если под NTX оно работает, проверю, спасибо! Скорее всего под NTX не заработает - это чисто MSFOX примочка, для Клипера и Харбора нужно переходить на CDX-драйвер !

Sergy: Andrey пишет: Скорее всего под NTX не заработает - это чисто MSFOX примочка, для Клипера и Харбора нужно переходить на CDX-драйвер ! C точки зрения собственно DBF разницы между NTX и CDX нет никакой. Таблица вообще может быть одна, без соотв. индексного файла. Поэтому "специфические" типы данных ("^", "@", "+", "=", "I:+" и тп) работают без проблем. Проверено. И в целом, Viktor (или Przemek ) писал, что NTX/CDX - изнутри - одно и то-же. NTX занимает больше места на диске, но меньше в памяти. И наоборот - за счет того, что в ветвях дерева CDX используется компрессия, соотв. требуется чуть больше RAM и тактов процессора для декомпрессии сжатых данных.

MIKHAIL: Петр пишет: См. extras\dbu нету там DBU53.RTP D:\HB\EXTRAS\DBU>patch -lNi dbu53.dif ──────────────────────────────────────────────────────────────────────── PATCH Version 2.03 - .RTPatch(R) - Software Update System DOS and Windows Edition (C) Copyright Pocket Soft, Inc., 1991-1994. All Rights Reserved. ──────────────────────────────────────────────────────────────────────── Could not find the Patch File 'DBU53.RTP' Enter a New Name & Directory for the Patch File or Press Enter to Quit ===> Andrey пишет: Скорее всего под NTX не заработает - это чисто MSFOX примочка, для Клипера и Харбора нужно переходить на CDX-драйвер ! работает DBFNX под Харбором, не работает под Clipper и под ADSNTX

Петр: MIKHAIL пишет: нету там DBU53.RTP Вот и я говорю, что нет никакого DBU53.RTP для [x]Harbour (так по моему раздел называется).

MIKHAIL: Петр пишет: Вот и я говорю, что нет никакого DBU53.RTP для [x]Harbour (так по моему раздел называется). Так как пропатчить файлы? Без патча у меня не собирается

Петр: Там описано (readme.txt) Gnu Path (binaries) найдете здесь Затем выполните команду patch -lNi dbu53.dif и дальше hbmk2 dbu.hbp Все.

MIKHAIL: Петр пишет: Затем выполните команду patch -lNi dbu53.dif и дальше hbmk2 dbu.hbp То ли я не понимаю вас, то ли вы не внимательно прочитали мой пост от 11.05 Я делаю по инструкции: D:\HB\EXTRAS\DBU>patch -lNi dbu53.dif ──────────────────────────────────────────────────────────────────────── PATCH Version 2.03 - .RTPatch(R) - Software Update System DOS and Windows Edition (C) Copyright Pocket Soft, Inc., 1991-1994. All Rights Reserved. ──────────────────────────────────────────────────────────────────────── Could not find the Patch File 'DBU53.RTP' Enter a New Name & Directory for the Patch File or Press Enter to Quit ===>

Петр: MIKHAIL пишет: Я делаю по инструкции: D:\HB\EXTRAS\DBU>patch -lNi dbu53.dif ──────────────────────────────────────────────────────────────────────── PATCH Version 2.03 - .RTPatch(R) - Software Update System DOS and Windows Edition (C) Copyright Pocket Soft, Inc., 1991-1994. All Rights Reserved. ──────────────────────────────────────────────────────────────────────── Could not find the Patch File 'DBU53.RTP' Enter a New Name & Directory for the Patch File or Press Enter to Quit ===> Согласно инструкции 3 шаг выглядит так 3.) Apply supplied patch to the source using GNU Patch GNU Patch, а не PATCH от (C) Copyright Pocket Soft

MIKHAIL: Как можно установить ограничение времени на простой в командах ожидания ввода данных такие как prompt, achoice, get... ? Многие пользователи не завершают работу с программой, что приводит к затруднениям при обновлении, а с другой стороны, бывают технические работы по проверке данных, которые могут длительное время выполняться и должны быть завершены.

Петр: MIKHAIL пишет: Как можно установить ограничение времени на простой в командах ожидания ввода данных такие как prompt, achoice, get... ? В Harbour, как и в Clipper, стандартные обработчики не предусматривают ограничения времени. Многие пользователи не завершают работу с программой, что приводит к затруднениям при обновлении Проводите обновление при запуске программы или выходе из нее; реализуйте модуль обновления в виде отдельного приложения, реализуйте модуль обновления в виде отдельного потока - это все организационные мероприятия, выберите желаемую модель (f.e. обновление Opera, работа ccleaner с кэшем при запущенном браузере и т.п.), внесите изменения в ТЗ, утвердите у руководства/заказчика, реализуйте, внесите изменения в инструкцию пользователя и все будет Ок. MIKHAIL пишет: а с другой стороны, бывают технические работы по проверке данных, которые могут длительное время выполняться и должны быть завершены. само собой и такое бывает. Мой любимый вопрос - и что? P.S. и что? уточняю, каким образом реализация подобной функциональности зависит от того Clipper или Harbour используется?

Sergy: MIKHAIL пишет: Как можно установить ограничение времени на простой в командах ожидания ввода данных такие как prompt, achoice, get... ? Многие пользователи не завершают работу с программой, что приводит к затруднениям при обновлении, а с другой стороны, бывают технические работы по проверке данных, которые могут длительное время выполняться и должны быть завершены. Есть несколько вариантов: 1) Функция KeySec([<nKeyValue>,<nTime>, [<nCounter>], [<lMode>]]) → lActivated) - засовывает в буфер клавиатуры нужный код по истечении определенного времени. Например, K_ESC. Останется в программе организовать грамотную обработку, чтобы не задавала лишних вопросов юзеру. 2) hb_idleAdd( <bAction> ) → nHandle. Можно добавить любой блок кода, который будет вызван в ближайших циклах IdleState (например, ожидание ввода с клавиатуры). 3) ft_OnTick( bCode, nInterval ) - выполняет блок кода каждый указанный интервал времени. 4) Можно использовать многопоточность. Для этого нужно собрать проограмму с ключом -mt и предусмотреть соотв. обработку.



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