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

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

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

Ответов - 245, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 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 и предусмотреть соотв. обработку.

MIKHAIL: При объявлении переменной GLOBAL компилятор выдает ошибку синтаксиса. Нужно добавить какие то ключи или как объявлять ее ?

PSP: MIKHAIL пишет: При объявлении переменной GLOBAL компилятор выдает ошибку синтаксиса. Нужно добавить какие то ключи или как объявлять ее ? PUBLIC

MIKHAIL: PSP пишет: PUBLIC т.е. не реализовано GLOBAL ?

PSP: А где было реализовано GLOBAL? В Клиппере не было.

Pasha: Есть в xHarbour. Это аналог static, только переменные видно во всех модулях. В harbour этого расширения нет.

PSP: Pasha пишет: Есть в xHarbour. Это аналог static, только переменные видно во всех модулях. В harbour этого расширения нет. Понятно.

alexmar: Перевожу на консольный Harbour большое приложение из Clipper 5.2. В связи с этим пока 2 вопроса 1 Посоветуйте отладчик. Какой лучше? 2 В приложении на Clipper было реализовано что-то типа MsgBox (с различным количеством кнопок). Реализовано было через создание объектов для отображения кнопок с использованием малодокументированных функций Clipper. При запуске скомпилированного приложения выбивает ошибку. Подозреваю, что исполнение пошло по той ветке, которая и под клиппером не использовалась и не была отлажена. Не сильно хочется копаться в старом коде. Есть ли готовое решение аля MsgMox() для консольного варианта Harbour?

alexmar: и чтобы 2 раза не вставать. Как обстоит дело с IDE для харбор? В версии 3 он был, а в версии 3.2 я его не нашел. Вопрос: 1 IDE для 3.2 существует или можно настроить и использовать тот, который шел с 3.0 2 И в качестве оценки перспектив дальнейшего развития. Насколько трудоемок процесс перевода консольной версии приложения под GUI. Насколько я понял, есть несколько вариантов GUI. Какой вариант перспективнее с точки зрения поддержки со стороны разработчиков.

LYSK: alexmar пишет: 2 В приложении на Clipper было реализовано что-то типа MsgBox ALERT ALERT( <xMessage>, [<aOptions>], [<cColorPairs>], [<nDelay>] ) --> nChoice or NIL Было в Клиппере, есть и в Харборе.

alexmar: Спасибо, совсем вылетело из головы. Очень редко пользовался.

Andrey: alexmar пишет: Насколько трудоемок процесс перевода консольной версии приложения под GUI. Насколько я понял, есть несколько вариантов GUI. Какой вариант перспективнее с точки зрения поддержки со стороны разработчиков. Смотря что переводить... Т.е. какая консольная задача и какой нужен перевод. Я свою большую систему перевел за 4 года на МиниГуи. Правда особо не торопился, да и времени мало было на эту работу. Процесс очень трудоёмкий, нужно заново учиться под работу/понятия Винды и привыкать к новому стилю программирования. Зато сейчас у меня в проге есть работа с базами Dbf, LetoDB и PostgreSQL. Поддержка для МиниГуи на форуме в соседней ветке. Не забываем материально поддерживать Григория за его работу !!!

Vlad04: Добавлю. Прежде перестроить мышление. Алгоритмы обработки можно , в основном, использовать старые.Но источники данных если это формы , то все по-новому. Есть ещё целый ряд платных и бесплатных GUI. Я остановил свой выбор на МиниГуи - в нем есть дизайнер форм, наброс интерфейса форм,делаю в нем.

alexmar: Спасибо за ответы. Еще пару общих вопросов. Сколько по вашим оценкам народу юзает Харбор, в мире и на просторах необъятной? Ну и сакраментальный вопрос. Что дальше, в смысле какие перспективы дальнейшего развития Харбор. Не случится ли с ним то же, что случилось с Клиппером? ps У меня были раньше попытки перетащить наработки с Клиппера. Пробовал Fivewin и CAVO. Но не было серьезных причин и соответственно стимулов. Все прекрасно работало, начиная с DOS и кончая Win10. Но всему приходит конец. Началось 64х разрядная эра. Клиенты покупают новые машины, а там уже стоит 64разрядная ось. И как-то некузяво заставлять их переходить на что-то другое или ставить что-то типа VMPayer. Поэтому воленс-неволенс я здесь.

Pasha: alexmar пишет: Ну и сакраментальный вопрос. Что дальше, в смысле какие перспективы дальнейшего развития Харбор. Не случится ли с ним то же, что случилось с Клиппером? Харбору в этом году исполняется 20 лет. Как никак возраст. Столько не живут. Поскольку это opensource проект, с ним в принципе не может случиться то же, что с клиппером. Никуда эта гора кода не денется. Если найдутся разработчики, которым интересно двигать его дальше - будет развиваться. Не найдутся - будет находиться в том же состоянии, плюс мелкие улучшения. Но в любом случае с opensource продуктом работать куда приятнее, всегда можно сделать что-то под себя.

alkresin: alexmar пишет: Что дальше, в смысле какие перспективы дальнейшего развития Харбор. Не случится ли с ним то же, что случилось с Клиппером? Как написал уже Павел, разница в том, что Harbour - проект с открытыми исходниками - т.е., в отличие от Клиппера, всегда есть возможность его развивать. Конечно, может возникнуть ситуация, когда не окажется заинтересованных программистов достаточной квалификации, чтобы сделать какие-либо крупные изменения - адаптировать его для другой ОС, например. Более того, уверен, что когда-нибудь это случится. Но подобное почти наверняка случится и с любым другим языком, кроме, может быть, С. И, даже, если вы решите перейти на С, вам придется использовать разнообразные готовые сторонние библитеки - для работы с конкретной БД, например. Но срок жизни любой библиотеки тоже ограничен сроком интереса к ней ее разработчиков. Как бывало не раз с любителями активно использовать сторонние компоненты для Delphi: часто при переходе на новую версию Delphi выясняется, что тот или иной компонент сторонний компонент больше не работает, а модернизировать его некому, и если он выполняет важные функции, то у вас проблемы. Так что не беспокойтесь, все там будут). Но расширять кругозор и быть готовым к переменам надо всегда.

alexmar: спасибо, ребята всем за разъяснение ситуации. Сегодня удалось запустить свой проект, перекомпилированный в Харборе. Приятно удивила скорость. Осталось выловить все баги несовместимости, которые конечно повылазят. Первое, что увидел это то, что Харбор переиндексировал индексные файлы, оставшиеся от клиппера (использую ntx или idx) Возникли вопросы 1 Индексы несовместимы с клипперовскими? 2 Клиппер и харбор могут юзать одни и те же индексы? Раздельно или совместно. 3 Вопрос по поводу 866 страницы в исходниках. В программе все отображается нормально, а вот кирилические символы в исходниках под дебагером - кракозябры. Есть ли какое-то решение вопроса?

AndreyZh: 1 Не совместимы, 2 не могут

Pasha: 3. Дебаггер - это такое же выполнение харбор-кода, как и основной программы. Дебаггер узнает о cp866 только после отработки hb_CdpSelect Возможно, еще надо выдать команду: hb_SetTermCP( "RU866" )

nick_mi: 1) О несовместимости. У нас некоторые базы индексируются DBU и далее с ними работают программы на HARBOUR в режиме корректировки после этого с этими же базами в некоторых случаях рабjтают с DBU . Нареканий вроде не было. Индексы NTX.

ММК: alexmar пишет: Ну и сакраментальный вопрос. Что дальше, в смысле какие перспективы дальнейшего развития Харбор Да практически никаких. Харбор есть, а перспектив нет. Очень мало ,кто пишет. alkresin пишет: Конечно, может возникнуть ситуация, когда не окажется заинтересованных программистов достаточной квалификации, чтобы сделать какие-либо крупные изменения - адаптировать его для другой ОС, например. Более того, уверен, что когда-нибудь это случится. Уже случилось :) Харбор собран практически для всех платформ. Во всяком случае для FW это линукс, андроид, мак и что-там еще.. Не помню :) alkresin пишет: Но расширять кругозор и быть готовым к переменам надо всегда. Очень правильно и точно

alexmar: nick_mi пишет: О несовместимости. У нас некоторые базы индексируются DBU и далее с ними работают программы на HARBOUR в режиме корректировки после этого с этими же базами в некоторых случаях рабjтают с DBU . Нареканий вроде не было. Индексы NTX. Вот и я в этой ветке здесь увидел обсуждение схожей проблемы правда применительно к связке сервер NW + ADS7. Так и не понятно к какому выводу пришли. Возможно, что это баг с моей стороны (я перед открытием индексов делаю кое-какие дополнительные проверки на предмет необходимости переиндексации) Буду курить сырцы дальше.

alexmar: ММК пишет: Да практически никаких. Харбор есть, а перспектив нет. Очень мало ,кто пишет. А можно уточнить "мало" относится к разработчикам Харбор или к пишущим на нем?

alexmar: 2 alkresin Пользуюсь hwgdebug.exe. Классная вещь. Заметил один глюк. При задании пути к исходникам в поле ввода не получается ввести более одного символа. Может что-то я не так делаю, но пришлось пути вписывать ручками в в hwgdebug.xml И спасибо за все, что вы делаете

nick_mi: В HARBOUR нет встроенного механизма проверки индексов и автоматического запуска индексации.

Pasha: alexmar пишет: 1 Индексы несовместимы с клипперовскими? Теоретически формат индексов одинаков. Но на практике лучше избегать совместной работы приложений на клиппере и харборе с одним индексом. Особенно это касается операций обновления индекса. Есть несколько схем блокировки индекса при обновлении, и не факт, что разнотипные приложения будут использовать одну и туже схему, так что индекс могут запортить. При установке харбор-приложений лучше все индексы перестроить. Ну и при совместной работе с БД по сети лучше всего использовать клиент-сервер, он как раз есть для харбора - это letodb. При этом достигается совсем другой уровень надежности, стабильности, да и производительности. Но это уже совсем отдельный вопрос.

alexmar: Спасибо, буду иметь ввиду.

alkresin: alexmar пишет: Пользуюсь hwgdebug.exe. Классная вещь. Заметил один глюк. При задании пути к исходникам в поле ввода не получается ввести более одного символа Исправлю. А можно уточнить "мало" относится к разработчикам Харбор или к пишущим на нем? И к тем, и к другим. Из основных разработчиков появляется сейчас иногда только один, Przemyslaw Czerpak. Из тех, кто делает правки помельче - человек, наверное, около пяти. Что касается пишущих - вопрос сложнее, не все ведь проявляют активность в сети, большая часть - это обычно "молчуны". Языков сейчас множество, и чтобы привлечь внимание, нужно что-то особенное. Существенную, иногда определяющую роль игоает мода, хайп. Большое значение имеет и компания, стоящая за языком/рлатформой. .NET, например, взлетел в свое время именно потому, что его продвигал MS, хотя реально в топе сейчас из всех языков этой платформы только C#.

alexmar: Доброе время суток Возник вопрос Как включить в Harbour поддержку индексов idx (без ADS) ? В программе я делаю установку RDD по умолчанию через вызов DBSetDriver("SIXCDX") В Clipper 5.2e при выполнении индексации через DbCreateIndex создавались файлы idx, а в Harbour создаются cdx

Dima: alexmar пишет: Как включить в Harbour поддержку индексов idx (без ADS) ? Скорее всего ни как

alexmar: Таки получилось. Оказывается нужно было при вызове DbCreateIndex указывать в явном виде имя индексного файла и расширение. И попутно еще вопрос. Перевожу с Clipper 5.2e на консольный харбор группу программ, которые пересекаются по нескольким dbf-файлам. Я так понимаю, что из-за несовместимости индексов нужно сразу менять все программы. Интересует: 1 Есть ли какой-нибудь другой вариант чтобы на каком-то временном отрезке работали и клипперные и харборовские программы. 2 По какому типу индекса (NTX, IDX, CDX) бОльшая совместимость между Clipper 5.2e и Harbour?

Dima: alexmar пишет: Оказывается нужно было при вызове DbCreateIndex указывать в явном виде имя индексного файла и расширение. Шаманство какое то Придется так же при открытии индексов к базам , расширение указывать явно.

Andrey: alexmar пишет: 2 По какому типу индекса (NTX, IDX, CDX) бОльшая совместимость между Clipper 5.2e и Harbour? Я работал раньше с CDX-драйвером. Работало нормально тогда. Но это давно было и использовал хХарбор терминалку. хХарборовская терминалка до сих пор отлично пашет даже на слабых компах.

nick_mi: У нас работают задачи как CLIPPER так и HARBOUR одновременно с одними и теми же базами. Переиндексацию часто делают в DBU проблем не замечалось. Индексы NTX. Harbour 3.2.0dev (r1601261444) Clipper 5.3

alexmar: Апну свой вопрос. alexmar пишет: 3 Вопрос по поводу 866 страницы в исходниках. В программе все отображается нормально, а вот кирилические символы в исходниках под дебагером - кракозябры. Есть ли какое-то решение вопроса? Pasha пишет: 3. Дебаггер - это такое же выполнение харбор-кода, как и основной программы. Дебаггер узнает о cp866 только после отработки hb_CdpSelect Возможно, еще надо выдать команду: hb_SetTermCP( "RU866" ) К сожалению, не помогло. Исходный текст в 866 кодировке в окне дебагера выглядит так: #IfDef HB REQUEST HB_CODEPAGE_RU866 REQUEST HB_LANG_RU866 hb_cdpSelect( "RU866" ) HB_LANGSELECT("RU866") hb_SetTermCP( "RU866" ) #EndIf cName := P_DEFVAL(cName,'"‡ à ¡®â- ï ¯« â "') Что можно еще сделать? Приложение консольное. Переводить исходники в Win кодировку пока не хочется

nick_mi: Возможно, в самом дебагере не предусмотрен русский язык и надо его пересобрать .

nick_mi: Был неправ. Обычный терминальный дебагер начал корректно отображать кириллицу после HB_CDPSELECT ('RU866')

MIKHAIL: nick_mi пишет: Обычный терминальный дебагер начал корректно отображать кириллицу после HB_CDPSELECT ('RU866') А где взять и как подключить дебагер ?

nick_mi: Параметр -b в вашем.hbp файле для сборки программы

MIKHAIL: nick_mi пишет: Параметр -b в вашем.hbp файле для сборки программы не требует библиотек и вызывается стандартно AltD ?

alexmar: nick_mi пишет: Возможно, в самом дебагере не предусмотрен русский язык и надо его пересобрать . Скорее всего так и есть nick_mi пишет: Был неправ. Обычный терминальный дебагер начал корректно отображать кириллицу после HB_CDPSELECT ('RU866') Наверно вы пользуете стандартный дебагер, а у меня дебагер от alkresin и вызов HB_CDPSELECT ('RU866') не помогает

alexmar: Где-то натыкался в форуме, а сейчас не могу найти... Как запретить DBUseArea при открытии dbf одновременно открывать одноименный индексный файл

Dima: SET AUTOPEN OFF

alexmar: спасибо

nick_mi: alexmar пишет: а у меня дебагер от alkresin и вызов HB_CDPSELECT ('RU866') не помогает Да, дебагер от Кресина я пересобирал, что-бы там правильно отражалась кирилица

alexmar: а что там нужно подправить?

nick_mi: Потерялся корректированный исходник дебагера, печалька. Завтра попытаюсь вспомнить, где правил. Там исходный текст просто конвертил через OemToAnsi, большего не помню

nick_mi: Корректировка дебагера Кресина. Там надо добавить строку hb_OemToAnsi в следующих местах STATIC FUNCTION SetText( cName, lClear ) . . . FOR i := 1 TO Len( oText:aArray ) IF Chr( 9 ) $ oText:aArray oText:aArray [ i ] := StrTran( oText:aArray [ i ] , Chr( 9 ), Space( 4 ) ) ENDIF oText:aArray [ i ] := hb_oemtoansi( oText:aArray [ i ] ) NEXT STATIC FUNCTION ShowRec( arr, n ) . . . FOR i := 1 TO nFields FOR j := 1 TO 4 arr1 [ i ,j ] := Hex2Str( arr [ ++n ] ) arr1 [ i , j ] := hb_oemToAnsi ( arr1 [ i ,j ]) NEXT NEXT Но это конечно все данные и тексты будет конвертировать. Если есть смешанные данные надо будет вводить в INI переменные и вставлять логику

alexmar: спасибо

alexmar: Dima пишет: alexmar пишет:  цитата: Оказывается нужно было при вызове DbCreateIndex указывать в явном виде имя индексного файла и расширение. Шаманство какое то Придется так же при открытии индексов к базам , расширение указывать явно. 1 Я был неправ. При явном указании расширения Harbour создает индексы с расширениями idx, но внутри структура все-таки cdx файла. Печалько. 2 Проверил совместимость индексов ntx в Clipper 5.2e и Harbour. Похоже совместимы. 3 А вот с совместимостью cdx индексов дела похуже. В режиме чтения они взаимно совместимы. А вот при редактировании получается такая ситуация. Если cdx был создан в Harbour, он и читается и корректируется в Clipper 5.2e вроде-бы без ошибок. А если был создан в Clipper 5.2e, то после его изменения в Harbour при его изменении в Clipper 5.2e возникает внутренняя ошибка 1210 (рассогласование данных и индекса). В Clipper 5.2e для cdx я использовал библиотеку Six3 (rdd SIXCDX) Получается для совместной работы Clipper 5.2e и Harbour можно использовать только индексы ntx, но у меня есть таблицы с memo полями в формате fpt, которые ntx не поддерживают. Тупик какой-то Была мысль прикрутить к Clipper 5.2e rdd dbfcdx от Harbour, но вряд ли из этого что-то получится. Может будут у кого-то идеи по поводу совместной работы Clipper 5.2e и Harbour?

Dima: alexmar пишет: Может будут у кого-то идеи по поводу совместной работы Clipper 5.2e и Harbour? В связке с ADS может получится , только версия ADS должна быть одинаковой для Clipper + соответствующая для Harbour Идем сюда http://devzone.advantagedatabase.com/dz/content.aspx?key=20&Release=19 и тянем Advantage Client Engine Advantage Clipper RDD или более раннюю версию

MIKHAIL: alexmar пишет: memo полями в формате fpt, которые ntx не поддерживают конвертни в dbt

alexmar: 2MIKHAIL Я в свое время спецом конвертнул их в fpt из-за постоянно возникающих ошибок переполнения счетчика количества блоков Dima пишет: ... тянем Advantage Client Engine Advantage Clipper RDD или более раннюю версию а Advantage Database Server разве не нужен?

Dima: alexmar пишет: Advantage Database Server разве не нужен можно локальный юзать ну если задача не сетевая а если сетевая то да нужен и если религия позволяет можно и пиратский качнуть PS я тупанул , для локального тож надо качнуть Advantage Database Server

alexmar: Такой вопрос. Имеется dbf файл с мемо файлом. Как определить с каким типом файла dbt или fpt открывается dbf файл, если в папке, где лежит dbf, лежат оба мемо-файла?

Pasha: Тип мемо однозначно определяется по сигнатуре, 1-му байту dbf Если там 0x83 - то dbt, если 0xF5 или 0x30 - fpt

SergKis: Pasha пишет Тип мемо однозначно определяется по сигнатуре После USE можно и так ? dbinfo(DBI_MEMOEXT)

alexmar: Привет всем Есть идеи как организовать многоязыковую поддержку двуязычного интерфейса в консольном харборе? Программы построены на вызовах из меню. Меню динамическое, основанное на dbf-файле. Т.е. из самой программы можно изменять меню, подключая или отключая функционал. По поводу меню у меня 2 варианта: 1. Дублирование полей, привязанных к языку 2. Добавление в dbf файл меню мемо полей, содержащих локализованные названия и т.д Пока не решил какой вариант лучше. Может есть еще какие-то варианты? Браузер и средства для редактирования записей реализованы через текстовые вспомогательные файлы, в которых описаны названия колонок и полей в режиме редактирования. Т.е. для работы с браузером достаточно перевести эти файлы. Основной вопрос как быть с диалоговыми окнами. Они все реализованы через одну и ту же функцию. Может кто-то занимался подобной задачей в консольном харборе или клиппере?

SergKis: alexmar пишет как организовать многоязыковую поддержку двуязычного интерфейса в консольном харборе? Посмотрите исходники hbedit http://www.kresin.ru/hbedit.html

Петр: alexmar пишет: Основной вопрос как быть с диалоговыми окнами. Они все реализованы через одну и ту же функцию. Может кто-то занимался подобной задачей в консольном харборе или клиппере? Harbour поддерживает i18n "из коробки". Хорошим примером могут могут послужить исходники hbmk2 Поищите на этом форуме, я что-то также писал на эту тему. Harbour & i18n в примерах

SergKis: Кусочки текстов работы с code page в hbedit (он у меня под рукой, как раб инструмент) Делаете подключение нужных ... REQUEST HB_CODEPAGE_ROISO, HB_CODEPAGE_ROWIN, HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866, HB_CODEPAGE_RUISO ... REQUEST HB_CODEPAGE_TRWIN, HB_CODEPAGE_UA1125, HB_CODEPAGE_UA1251, HB_CODEPAGE_UA866, HB_CODEPAGE_UAKOI8 REQUEST HB_CODEPAGE_UTF8 используете [pre2] ... x1 := Int( (MaxCol()-nLen)/2 ) bufsc := Savescreen( y1, x1, y1+Len(aText)+3, x1+nLen ) oldc := SetColor( TEdit():cColorWR ) cp := hb_cdpSelect( "RU866" ) @ y1, x1, y1+Len(aText)+3, x1+nLen BOX "┌─┐│┘─└│ " hb_cdpSelect( cp ) FOR i := 1 TO Len( aText ) @ y1+i, x1 + 2 SAY aText NEXT SetColor( oldc ) i := edi_Read( aGets ) Restscreen( y1, x1, y1+Len(aText)+3, x1+nLen, bufsc ) ... hb_cdpSelect( "RU866" ) @ 09, 10, 15, 72 BOX "┌─┐│┘─└│ " @ 13, 20 SAY "├" @ 13, 60 SAY "┤" @ 13, 11 TO 13, 71 hb_cdpSelect( oEdit:cp ) @ 10, 12 SAY "Open file" @ 12, 12 SAY "[ ] ReadOnly" @ 12, 27 SAY "[ ] In a current window" IF !Empty( oEdit:cFileName ) aGets[5,3] := 1 @ 12, 55 SAY "[ ] Diff" ENDIF ... hb_cdpSelect( "RU866" ) @ 09, 20, 16, 60 BOX "┌─┐│┘─└│ " @ 14, 20 SAY "├" @ 14, 60 SAY "┤" @ 14, 21 TO 14, 59 hb_cdpSelect( oEdit:cp ) @ 10,22 SAY "Search for" @ 12, 22 SAY "[ ] Case sensitive" @ 12, 42 SAY "[ ] Backward" @ 13, 22 SAY "[ ] Whole word" @ 13, 42 SAY "[ ] Regular expr." ... oldc := SetColor( cColor ) cp := hb_cdpSelect( "RU866" ) aText := hb_aTokens( cText, ";" ) FOR i := 1 TO Len( aText ) nLen := Max( nLen, Len( aText ) ) NEXT nLen += 4 x1 := Int( (MaxCol()-nLen)/2 ) x2 := x1+nLen y2 := y1+Len(aText)+1 cBuffScr := SaveScreen( y1, x1, y2, x2 ) @ y1, x1, y2, x2 BOX "┌─┐│┘─└│ " hb_cdpSelect( cp ) FOR i := 1 TO Len( aText ) @ y1+i, x1 + 2 SAY aText NEXT SetColor( oldc ) ... [/pre2]

SergKis: УПС. В текстах было [ i ] без пробелов, исказилось, но суть понятна должна быть. Поиск RU866 в *.prg hbedit все выдаст

SergKis: PS С dbf, если все поля в нем в одной кодировке, при открытии указывайте CP, тогда в установленную кодировку hb_cdpSelect( cp ) будет переводить hb, если поля в разных кодировках, не указывайте CP при открытии, но уст. этот CP (программы) при чтении\записи. Др. языки из полей читайте в переменные и при выводе ставьте нужный CP с возвратом потом

alexmar: Всем огромное спасибо. Пошел изучать матчасть Появятся вопросы, буду здесь отписываться

alexmar: Петр пишет: Harbour поддерживает i18n "из коробки". Файлик почитал. А где можно про эти функции поподробнее почитать? hb_i18n_gettext hb_i18n_ngettext, hb_i18n_gettext_strict, hb_i18n_ngettext_strict etc.

Dima: Может тут http://hmgforum.com/viewtopic.php?f=14&t=4284&start=10

alexmar: спасибо

SergKis: alexmar пишет А где можно про эти функции поподробнее почитать? hb_i18n_gettext hb_i18n_ngettext, hb_i18n_gettext_strict, hb_i18n_ngettext_strict etc. в исходниках rtl\hbi18n?.* Но по мне это не совсем удобная штука, т.к. варианты текстов (окончания) могут форм. динамически, часто тексты привязаны к окнам и таблицам и выбранное кучей в .pot файлы - офигенная работа для разбора всего. Т.к. мы страдаем с языками со времен clipper и похожую схему выборки текстов для перевода делали еще в 90х ... Удобнее оказалось сразу делать текст в ini.RU, ini.LV, ini.EN с секциями, которые могут опр. использование в конкретном prg или окне + часто клиент не согласен с переводом того или др. текста. Имеем перекрывающие ini в подкаталоге пользователя, где только тексты от клиента (даем возможность их менять). Тексты не читаем в память (массивы или hash), достаются они ф-ей сразу из файла, т.к. в win буферизация, то все достается мгновенно. Все ini utf8 с BOM, если у ini нет bom - это старая версия и сразу переделываем в вариант с BOM. Пример ini _Agent.lv (базовый вариант в ресурсах программы) [pre2] v.m. = 0.0063 [DOK] DokumRet = Pavadzīme Nr. SumNoPvn = Kopā bez PVN EUR SumArpvn = Kopā ar PVN EUR PvnProc = % PVN [KLI] Kli = Nosūtītājs Sanem = Saņēmējs Bank = Banka BankKod = Bankas kods BankScet = Bankas konts AdrJur = Juridiskā adrese AdrFiz = Preču izsniegšanas vieta: AdrMst = Preču saņemšanas vieta: Telefon = Tālruņa nr. RegNr = Reģistrācijas Nr. PvnNr = PVN reģistrācijas Nr. [RET] Nr = Nr. p.k. Ean = Svītru kods Name = Nosaukums KolVo = Daudz. EdIzm = Mērv. Cena = Vienības cena Sale = Atl. % Summa = Summa [TEXT] Menu10 = DOKUMENTI Menu11 = Zakazi ot agentov Menu20 = LOAD Menu21 = Load Excel ( xls ) files NewCopy = New as ... New = New Del = Delete Edit = Edit Metka = Zīme MetLine = Atzīmēt rindu MetAll = Atzīmēt visas rindas MetAllNo = Noņemiet atzīmi no visām rindām MsgCopy = Add new record from selected record MsgNew = Apend new record MsgDel = Dzēst izvēlēto rindu ; Delete selected record MsgDelAll = Dzēst visas rindas ; Delete ALL records MsgEdit = Edit selected record MsgSel = Selected record Title = Materiāli Vozvrat = Atgriešanās Refund = Atgriešanās Art = Article ; Raksts Cancel = Atcelt Anulet = Anulēt Info = INFO Error = ERROR Load = Load Ili = or g = .g. Line = Līnijas Stroki = Rindās Print = Drukāt Prnt = Drukāšana Continue = Turpināt Material = Materiāli MatName = Mat. nosaukums NotInf = Informācijas nav ! NotDok = Nav dokuments ! NotCena = Nav cenas NotMCen = Materiālu sarakstā nav cenas RedLine = Izvēlētās līnijas korekcija Data = Datums Ddat = Datums Edi = Mērv. Enter = Rindu izvēle Exit = Izeja ExitPrg = Programmas beigas ExitWnd = Izeja no saraksta Spisok = Sarakst Find = Meklēt Find1 = Meklēt no šķirotā saraksta Find2 = Meklēt pa grupas kodiem Find_Mt = Mēklet materiālos Found = found ! GoEnd = Uz beigām GoTom = Uz beigām GoTop = Sākumā Gru = Grupas Grupa = Grupas KlNum1 = Daudzums Kod = Kods Kods = Šķirot pa kodiem Ucen = Cenu uzskaite Rcen = Pārdošanas cena Scen = Kataloga cena Ncen = Jauna cena Mcen = Cena Mcnp = Pl.cena Medi = Mērv. Menshe = Mazāk, vienādi Met = Zīme Met1 = Zīme Met2 = Uzstādīt zīmes Met3 = Noņemt zīmes Ean = Svītru kods CenaR = Vienības cena CenaS = Norakstīšanas cena Mkol = Daudzums Kolvo = daudz. Kol. = Daudz. EdIzm = Mērv. Month1 = Mēnesis Month2 = Nomainīt mēnesi Msma = Atlaide Msmp = Pl.summa Msum = Summa Nam = Nosaukums Name = Šķirot pa nosaukumiem NewYear = Jauns gads Next = Nāk.rinda Next_ = Nākošā rinda NmName = Nosaukums NmNote = Piezīmes Nos = Nosaukums NotField = FieldName not found in table NotFound = File not found ! NotUsed = File not used ! NotKod = Kods nav atrasts ! NotPprNr = Nav PPR numeru ! Note = Piezīmes Nr. = Nr. R_1 = Kods R_2 = Nosaukums Sort = Šķirot Sort1 = Šķirot Sort2 = Šķirot pa kodiem / pa nosaukumiem SortPakape = Šķirot pēc pakāpe SortNodala = Šķirot pēc nodaļa SortKods = Šķirot pēc koda Vibor = Izvēle Viss = Viss saraksts Itogo = Kopā Pavisam = Pavisam Vsego = Pavisam: Kopa = Kopā izsniegts KopaItg = Pavisam apmaksai ScetNr = RĒĶINS Nr. PavadNr = PAVADZĪME Nr. Pavadz = Pavadzīme Nr. Kravas = Kravas pārvadātājs: AM_Reg = A/M reg. Nr. : Vodila = Vadītājs: SpecAtz1 = Apmaksa līdz SpecAtz3 = (preču piegāde) SamaksatD = Ar pārskaitījumu Samaksat = Samaksas veids un kārtība: SpecAtz = Speciālas atzīmes : SpecDop = Pasūtījuma Nr. : SaimnDA = Saimnieciskās darbības apraksts: PrecuPar = Preču piegāde (pārdošana) PavisApm = ```Pavisam apmaksai: ApmVard = `````( ar vārdiem ): VidalKto = Izsniedza : VidalDat = Datums : VidalGod = Piegādes datums: 201__.g.__________________ PriemKto = Pieņēma : ________________________ PriemPar = Paraksts : ________________________ PriemDat = Datums : ________________________ ScetKto1 = Rēķinu izsniedza : ScetKto2 = ```````````````````________________________ ____________________ ____________ ScetKto3 = ````````````````````````````amats vārds, uzvārds paraksts Kto1 = Amats Kto2 = Vārds, uzvārds Kto3 = Paraksts Wait = ... G A I D I E T ... Zime = Z. Save = Saglabāt SaveInf = Informācija jau ir saglabāta SaveNo = Dokuments nav saglabāts NoLock = Informācija nav saglabāts BarKod = BAR-CODE h1 = Nr. h2 = EAN h3 = Artikuls, nosaukums h4 = Daudz. h5 = Krāsa h6 = Informācija h7 = Cena Order = Pasūtīt Orders = Pasūtījumi OrderNr = Pasūtījuma Nr. OrderData = Pasūtījuma datumi OrderLine = Pasūtījuma līnijas OrdRet = Pieņemt dokum. Ordbtn = Orders ; Pasūtījumi OrdLst = Pasūtījumu saraksts Customer = Klients CustKli = Nosūtītājs Agenti = Aģenti Agent = Aģents Price = Cenrādis PriceCen = Cenrādis cena ; Cena no cenrāža PriceList = Preču cenu saraksts PriceMat = Materiālu cenrādis Dokum = Dokumenti Dok.Ser = Sēriju Dok.Dat = Dok. datums Dok.Nr = Dok. Nr. DokNr = Dokum. Nr DokNr. = Dokumenta Nr. DokDat = Dokumenta datums DokPrn = Dokumenta drukāšana Oplata = Apm. (dienas) gr1 = Kods gr2 = Nosaukums gr3 = Mērv. gr4 = Daudz. gr5 = Uzsk. cena gr6 = Uzsk. summa gr7 = Datums gr8 = Dokum.Nr gr9 = Debets gr10 = Krēdits gr11 = EAN gl5 = Ligum. cena gl6 = Ligum. summa gl7 = Starpiba gl8 = Koef. AdrF = Faktiskā adrese AdrFT = __________tālr.,fakss AdrJ = Juridiskā adrese AdrJT = __________tālr.,fakss DirDnm = Vadītāja amata nosaukums DirFio = Vadītāja uzvārds Bank = Bank Rscet = Nor.konta Nr. Kscet = Kor.konta Nr. Banka = Banka BankKod = Bankas kods BankScet = Bankas konts EurBank = EUR.BANK EurIban = EUR.IBAN EurSwift = EUR.SWIFT GlvDnm = Galv.grāmatveža amata nosaukums GlvFio = Galv.grāmatveža uzvārds IspAmats = Izpildvaras amats IspDnm = Izpildītāja amata nosaukums IspDnmEN = Post of performer IspDnmRU = Должность исполнителя IspFio = Izpildītāia uzvārds IspFioEN = Name, surname IspFioRU = Ф. И. О. исполнителя KodBil = Kods SIA Bilance NameK = Īis nosaukums NameP = Pilns nosaukums NodIn = Nodokļu inspekcija NodNr = Nodokļu maksātāja kods Note = Piezīmes PamV = Pamatdarbibas veids ParIn = Pārvaldes institūcija PvnNr = PVN maks. Nr. RegNr = Reģistrācijas Nr. PvnNr2 = PVN reģistrācijas Nr. Nosut = Nosūtītājs Sanem = Saņēmējs AdrJur = Jurid./dzīvesviet. adrese AdrFiz = Nosūtīšanas vietas adrese Telef = Tālr. BankNm = Kredītiestādes nosaukums BankKd = Kredītiestādes kods BankRs = Nor.konta Nr. M01 = Janvāris M02 = Februāris M03 = Marts M04 = Aprīlis M05 = Maijs M06 = Jūnijs M07 = Jūlijs M08 = Augusts M09 = Septembri M10 = Oktobris M11 = Novembris M12 = Decembris Prixod = Ieņēmumi Pereme = Pārvietoties Realiz = Realizācija Vibiti = Norakstīšana Dok_1 = Ieņēmumi no piegādātāja Dok_2 = Iekšējais apgrozījums Dok_3 = Realizācija Dok_4 = Norakstīšana 1_Dok = Dokuments 1_Skl = Noliktava 1_Kli = Piegādātāji 1_R_4 = Datums 1_R_50 = Sērija 1_R_5 = Numurs 1_R_6 = Summa 1_R_22 = Summa\valūtā 1_R_16 = Valūta\kods 1_R_3 = Cehs\Iecirknis 1_R_7 = Kods 1_R_19 = Nosaukums 1_R_19A = Reģ. Nr. UK\PVN Nr. / PK 1_R_200 = Grupas 1_R_92 = Dok.\tips 1_R_93 = Tipa\Nosauk. D3_Dok. = Dokum. D3_Dok = Dokuments D3_Skl = Noliktava D3_Kli = Saņēmējs D3_Cehs = No ceha D3_Rpt1 = Realizācija pēc saņēmēji D3_Rpt2 = Realizācija pēc saņēmēju grupām D3_Rpt3 = Realizācija par datumu D3_Rpt4 = Realizācija par datumu pēc saņēmēja D3_Rpt5 = Realizācija par datumu pēc saņēmēju grupām D3_R_20 = Līgums D3_R_4 = Datums D3_R_50 = Sērija D3_R_5 = Numurs D3_R_6 = Summa D3_R_11 = Daudzums D3_R_26 = Cena D3_R_27 = Summa D3_R_22 = Summa\valūtā D3_R_16 = Valūta\kods D3_R_3 = Cehs\Iecirknis D3_R_7 = Kods D3_MA_1 = Kods D3_MA_2 = Nosaukums D3_MA_3 = Mērv. D3_MA_4 = E A N D3_MA_5 = Artikuls D3_R_19 = Nosaukums D3_R_19A = Reģ. Nr. UK\PVN Nr. / PK D3_R_50A = Orders D3_R_51 = Orders D3_R_92 = Dok.\tips D3_R_93 = Tipa\Nosauk. D3_R_200 = Grupas Gru_All = Pilns saraksts grupu Kli_All = Pilns saraksts saņēmēju Kli_U03 = Piegādātāji Kli_U04 = Saņēmēji Kli_Adr = Adrese Kli_R_1 = Kods Kli_R_2 = Nosaukums Kli_R_2A = Pilns nosaukums Kli_R_3 = Juridiskā adrese Kli_R_3A = Kli_R_4 = Nod. m. kods Kli_R_5 = Rēg.NR. UK Kli_R_10 = Spec. informācīja Kli_R_11A = Valsts Kli_R_11B = Tips Kli_R_12B = Piezīmes Kli_R_13 = Grupas Kli_R_34 = Faktiskā adrese Kli_R_35 = Kli_R_40 = Cenrādis Kli_R_41 = Apmaksa ( dienas ) Kli_R_43 = Aģents Kli_R_31 = LV Adrese Kli_R_32 = RU Адрес Kli_R_33 = EN Adress Kli_R_51 = LV Nosaukums Kli_R_52 = RU Наименование Kli_R_53 = EN Name Kli_R_54 = Agreement [/pre2] в коде текст достается ф-ей _gTxt("ключ", ...) в параметрах можно указать варианты окончания и секцию подмены от установл. default

Pasha: SergKis пишет: Т.к. мы страдаем с языками со времен clipper Хотя наши страдания с языками уже закончились, вспоминаю времена, когда эти страдания еще были... Возвращаясь к исходному вопросу. Проще всего идти по п.1: добавить в dbf локализованные поля: Name/NameU. Я так и делал

alexmar: SergKis пишет: Т.к. мы страдаем с языками со времен clipper и похожую схему выборки текстов для перевода делали еще в 90х ... Удобнее оказалось сразу делать текст в ini.RU, ini.LV, ini.EN с секциями Т.е вариант локализации с ini-файлами использовали еще в Clipper? А вместо _gTxt() что использовали?

SergKis: alexmar пишет А вместо _gTxt() что использовали? Т.к. hash не было был dbf с полями EN, RU, LV и index unique, переводили в dbf _gTxt() не было, выбирали из prg строки в "", '' потом меняли прямо в prg, но таких prg было мало, т.к. была своя Ide с базой txt формата, где хранились все окна с координатами, типа (упрощенно схема) Func SvWnd(y,x,w,h) ; Retu hb_valtoexp({ y,x,w,h, savescreen(y,x,w,h), <тип данных> }) // <тип данных> : Func RsWnd(w) ; Local a := &(w) ;Retu restscreen(a[1],a[2],a[3],a[4], a[5])) // панель, текст, структура, dbf, ... ф-ии на C, доставали окна, тексты с окон. панелей. В ide (уже на S87 была) можно было рисовать окна, привязывать к Say,Get,, макросы,своей achioce и tbrowse, так вот файлы были отд. для каждого языка и из dbf процедурой переносились в нужный и от ENV установки подкл. тот или иной язык.

Петр: alexmar пишет: А где можно про эти функции поподробнее почитать? hb_i18n_gettext hb_i18n_ngettext, hb_i18n_gettext_strict, hb_i18n_ngettext_strict etc. Можно посмотреть исходники и много чего полезного можно взять из ChangeLog.txt

Петр: SergKis пишет: Но по мне это не совсем удобная штука, т.к. варианты текстов (окончания) могут форм. динамически, часто тексты привязаны к окнам и таблицам и выбранное кучей в .pot файлы - офигенная работа для разбора всего. Все это предусмотрено до/для нас. P.S. И кстати редакторы po/pot файлов f.e. poedit - удобнейшая вещь.

SergKis: Петр пишет Все это предусмотрено до/для нас Даже не сомневаюсь, только сначала надо перелопатить кучу prg текстов для[pre2] #xtranslate _( <x,...> ) => hb_i18n_gettext( <x> ) PROCEDURE main() ? _( " Hello World!Hello World!Hello World!Hello World!Hello World!Hello World! Hello World!Hello World!Hello World!Hello World!Hello World!") RETURN[/pre2] потом обработать редактором полученные файлы и подкл. их обратно. И кстати редакторы po/pot файлов f.e. poedit - удобнейшая вещь Пока ни один редактор не поддерживал кодировку LV866? кроме тех, которые пересобирали сами

Pasha: А что это за кодировка, LV866 ? Это cp866 с дополнительными латышскими символами на месте псевдографики ?

SergKis: Pasha пишет Это cp866 с дополнительными латышскими символами на месте псевдографики ? Да это RU866 с лат. символами вместо псевдографики, в dos cp была факт. стандартом, пока потом не разделили на 755, 1257



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