On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение





Пост N: 86
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 18:47. Заголовок: Перехожу с Clipper 5.2e на Harbour, список вопросов от "новичка"


Добрый день, уважаемые коллеги.

Большое спасибо за море справочной информации по переходу, но нужно ещё пнуть меня в нужном направлении.

Итак, установил Harbour 3.0 + BCC 5.5.1 ==>> 3.2.0 +minGW скомпилировал и запустил традиционный "Hello, world!"
Дело перешло к проекту, из-за которого собственно и речь. Компилируется что через hbmk2, что самим харбором - без ошибок, всего с парой предупреждений, что меня немало удивило.
Возникли ошибки на этапе линковки:

Скрытый текст

Help, please - что делать и куды бечь ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 285 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


администратор




Пост N: 3352
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 19:16. Заголовок: Юзай Harbour 3.2 там..


Юзай Harbour 3.2 там Hbmk2 чутка умнее и пишет какие библы нужно прилинковать.
Хотя может это есть и в 3.0 не знаю так как сразу перелез с 2.0 на 3.2

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 87
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 19:30. Заголовок: Только вчера


Только вчера поставил Harbour и BCC рядом со старым добрым 5.2e - голова кругом идет... нашел 3.0 - а вот 3.2 где взять ???

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3353
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 19:47. Заголовок: Sergy пишет: голова..


Sergy пишет:

 цитата:
голова кругом идет


И у меня так было ;)
На вскидку не хватает библиотек HBCT , HBNF , прилинкуй их.
Если и после этого какие то функции не будут находиться тогда
поищи их в ChangeLog.txt или поиском по маске файлов из CONTRIB
Все это я делаю (о поиске я) в FAR MANAGER
Насчет функций Blinker не знаю ,возможно что то и есть (аналоги) но далеко не все думаю
и надо разбираться в каждом отдельном случае.

Sergy пишет:

 цитата:
а вот 3.2 где взять ???


тут http://clipper.borda.ru/?1-4-0-00000840-000-0-0-1375721378
по линку http://github.com/harbour/core/archive/master.zip

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 88
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 19:55. Заголовок: HBCT, HBNF указываю ..


HBCT, HBNF указываю жестко в строке компилятора, путь к ним тоже прописан. В каталоге harbour\lib\win\bcc hbct.lib и hbnf.lib точно есть...

В папке CONTRIB нашел "непонятные" файлы HBCT.HBC и HBNF.HBC размером по 122 байта каждый - может их куда еще нужно засунуть ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3354
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 20:28. Заголовок: Sergy пишет: В папк..


Sergy пишет:

 цитата:
В папке CONTRIB нашел "непонятные" файлы HBCT.HBC и HBNF.HBC размером по 122 байта каждый - может их куда еще нужно засунуть ?


Их и надо линковать вместо HBNF.LIB и HBCT.LIB
Совет: юзай HBMK2 и файл проекта HBP
Пример (часть почикал)
 

C:\hb32mingw\contrib\hbct\hbct.hbc
C:\hb32mingw\contrib\hbtip\hbtip.hbc
C:\hb32mingw\contrib\xhb\xhb.hbc
C:\hb32mingw\contrib\hbnf\hbnf.hbc
C:\hb32mingw\contrib\hbmemio\hbmemio.hbc
C:\hb32mingw\contrib\gtwvg\gtwvg.hbc
C:\hb32mingw\contrib\hbwin\hbwin.hbc
C:\hb32mingw\contrib\hbxpp\hbxpp.hbc
C:\hb32mingw\contrib\hbmisc\hbmisc.hbc
C:\hb32mingw\contrib\rddads\rddads.hbc

-lace32

-LC:\MinGW\lib\
-liphlpapi

-compr=max

-workdir=obj
-owinSklad.exe
-inc
#-mt
#-gtwin

#-run
#-std
-gui

fix\*.c
fix\*.prg
cfunc\*.prg
..............
sklad.prg
rddsys.prg
tool\*.prg
sklad.rc


Собираю все вот таким батником
 
set path=C:\MinGW\bin\
c:\hb32mingw\bin\hbmk2 sklad.hbp

У тебя он будет свой да и компилятор тоже так как в примере у меня MINGW

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 222
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.08.13 20:32. Заголовок: Sergy пишет:Help, pl..


Sergy пишет:
 цитата:
Help, please - что делать и куды бечь ?


Такой штукой получите оглавления всех lib:
for %%a in ( *.lib ) DO c:\bk8\bcc\bin\TLIB.EXE %%a , %%a.txt
Ищите в огл. функции, если найдена подключайте lib к проекту - нет, то вероятно ее придется переписывать.


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 89
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 21:07. Заголовок: Dima пишет: Их и на..


Dima пишет:

 цитата:
Их и надо линковать вместо HBNF.LIB и HBCT.LIB
Совет: юзай HBMK2 и файл проекта HBP
Пример (часть почикал)



Большое спасибо за подсказу, сделал так:

d:\harbour\contrib\hbnf\hbnf.hbc
d:\harbour\contrib\hbct\hbct.hbc

-lhbnf
-lhbct
-LD:\Harbour\lib\win\bcc
-workdir=OBJ
-otradewin.exe

trade.prg
trade100.prg
trade200.prg
trade201.prg
trade202.prg
...
trade499.prg

По сути ничего не поменялось... не находит функций...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3355
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 21:09. Заголовок: Sergy пишет: -lhbnf..


Sergy пишет:

 цитата:
-lhbnf
-lhbct


Это не надо так как выше есть уже HBC
А какие функции не находит ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 90
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 21:16. Заголовок: SergKis пишет: Тако..


SergKis пишет:

 цитата:
Такой штукой получите оглавления всех lib:
for %%a in ( *.lib ) DO c:\bk8\bcc\bin\TLIB.EXE %%a , %%a.txt
Ищите в огл. функции, если найдена подключайте lib к проекту - нет, то вероятно ее придется переписывать.



Спасибо, вот какая интересная петрушка получается с HBNF.LIB:

1) несколько функций изменили свое имя, например: DISKFREE -> DSKFREE, DISKTOTAL -> DSKSIZE... Поставлю условную компиляцию #ifdef __HARBOUR__ ... #endif
2) от части функций придется отказаться, чего уж там...
3) Функция FT_ONTICK точно есть, но возникает ошибка компоновки - как и с моими функциями... сейчас уменьшу кол-во неверных вызовов, посмотрю что да как...


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 91
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 21:19. Заголовок: Dima пишет: Это не ..


Dima пишет:

 цитата:
Это не надо так как выше есть уже HBC
А какие функции не находит ?



Это "системные":
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_SWPRUNCMD' referenced fr
Error: Unresolved external '_HB_FUN_ENVPARAM' referenced fro
Error: Unresolved external '_HB_FUN_INKEYTRAP' referenced fr
Error: Unresolved external '_HB_FUN_DISKFREE' referenced fro
Error: Unresolved external '_HB_FUN_DISKTOTAL' referenced fr
Error: Unresolved external '_HB_FUN_BIOSDATE' referenced fro
Error: Unresolved external '_HB_FUN_FT_ONIDLE' referenced fr
Error: Unresolved external '_HB_FUN_TRAPANYKEY' referenced f
Error: Unresolved external '_HB_FUN_KEYSEND' referenced from

Это - "мои":
Error: Unresolved external '_HB_FUN_STRNUM2ARRAY' referenced
Error: Unresolved external '_HB_FUN_CMJS_EXTRACTPARAMS' refe
Error: Unresolved external '_HB_FUN_SELECTSTOCKS' referenced
Error: Unresolved external '_HB_FUN_APPLYSERTCHAGES' referen
Error: Unresolved external '_HB_FUN_APPLYCARGOCHAGES' refere
Error: Unresolved external '_HB_FUN_APPLYPRICECHAGES' refere



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3356
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 21:23. Заголовок: Sergy пишет: Error:..


Sergy пишет:

 цитата:
Error: Unresolved external '_HB_FUN_SWPRUNCMD' referenced fr


Давай по одной ;)
Вместо ее можно юзать
hb_processrun
EXECANDWAIT
WAPI_ShellExecute
и что то еще уже не помню ;)

Спасибо: 1 
ПрофильЦитата Ответить
администратор




Пост N: 3357
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 21:24. Заголовок: Sergy пишет: Это - ..


Sergy пишет:

 цитата:
Это - "мои":


тебе и карты в руки ! сам же писал.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 92
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 21:26. Заголовок: Dima пишет: Давай п..


Dima пишет:

 цитата:
Давай по одной ;)
Вместо ее можно юзать
hb_processrun
EXECANDWAIT
WAPI_ShellExecute
и что то еще уже не помню ;)


Давай...

Подключил HBBLINK, ошибка со SWPRUNCMD ушла.

Заменил DISKTOTAL на DSKSIZE - теперь ошибка - не может найти функцию DSKSIZE.

По "своим" функциям, разумеется, вопросы будут в последнюю очередь...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 93
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 21:33. Заголовок: Вопрос с ENVARAM реш..


Вопрос с ENVPARAM решил надыбанным "неизвестно где" исходником:

Скрытый текст

соотв. остаются:

Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

Error: Unresolved external '_HB_FUN_INKEYTRAP' referenced fr
Error: Unresolved external '_HB_FUN_DSKFREE' referenced from
Error: Unresolved external '_HB_FUN_DSKSIZE' referenced from
Error: Unresolved external '_HB_FUN_BIOSDATE' referenced fro
Error: Unresolved external '_HB_FUN_FT_ONIDLE' referenced fr
Error: Unresolved external '_HB_FUN_TRAPANYKEY' referenced f
Error: Unresolved external '_HB_FUN_KEYSEND' referenced from


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3358
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 21:38. Заголовок: Dima пишет: поищи и..


Dima пишет:

 цитата:
поищи их в ChangeLog.txt


а так же поиском на форуме

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 94
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 22:00. Заголовок: Dima пишет: поищи и..


Dima пишет:

 цитата:
поищи их в ChangeLog.txt


а так же поиском на форуме



Бинго! Так разобрался с DISKFREE и DISKTOTAL - оказывается, они заменяются на вызовы HB_DISKSPACE(d, HB_DISK_FREE) и тп.

При помощи условной компиляции пока отказался от некоторых системных функций.

Со своими функциями походу тоже ясно - ошибка с длинными именами - Clipper все что длинее 10 знаков игнорирует, а тут - строго...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 95
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 22:42. Заголовок: Запустил ! :sm36: ..


Запустил !

Разобрался с кодовой страницей, убрал вызов FILESMAX()

Вопрос: Использую NTX, в некоторых редких случаях требуется, чтoбы вместо расширений *.DBF и *.NTX были немного другие, напрмер: *.XDB, *.XNT - так я отличаю "архивные" таблицы и действующие, чтобы их не копировать при бэкапе.

Harbour этого не любит ?

Вылетает: Unrecoverable error 9108: hb_ntxIndexUnLockRead: unlock error.

Вот на таком коде: USE (cDir+cAlias+cExt) INDEX (cDir+cAlias+cNtx) READONLY NEW



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2923
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 11.08.13 22:43. Заголовок: Sergy пишет: Error:..


Sergy пишет:

 цитата:
Error: Unresolved external '_HB_FUN_KEYSEND' referenced from


Это CT.LIB
Я отказался от неё.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3359
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 22:51. Заголовок: Andrey пишет: Я отк..


Andrey пишет:

 цитата:
Я отказался от неё.


и я

Sergy пишет:

 цитата:
Использую NTX


Тяжелый случай. Тяжело и громоздко. Не надо его юзать. CDX самое то или IDX (CDX) под ADS или LetoDB (CDX)

Dima пишет:

 цитата:
CDX самое то


Но там могут быть свои приколы.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3360
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 22:55. Заголовок: Sergy пишет: (cDir+..


Sergy пишет:

 цитата:
(cDir+cAlias+cExt)


Выведи это дело в ? cDir+cAlias+cExt и глянь что кажет , возможно твой косяк

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 96
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 22:58. Заголовок: Andrey пишет: Это C..


Andrey пишет:

 цитата:
Это CT.LIB
Я отказался от неё.



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

 цитата:
Тяжелый случай. Тяжело и громоздко. Не надо его юзать. CDX самое то или IDX (CDX) под ADS или LetoDB (CDX)



Переделывать NTX на CDX или еще дальше - SQL подобные БД вообще думаю пока нет смысла, когда программа "еле дышит"... Запустить, попробовать, добиться хотя-бы такого-же функционала, как и с 5,2е, обкатать, а потом уж оптимзировать.

Такие вот мысли пока...


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3361
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.08.13 23:01. Заголовок: Sergy пишет: Запуст..


Sergy пишет:

 цитата:
Запустить, попробовать, добиться хотя-бы такого-же функционала, как и с 5,2е, обкатать, а потом уж оптимзировать.


Все правильно. Так и я думал и все получилось и у тебя все будет нормально с переводом. Просто остынь и осмысли
А вопросы сюда ;) Поможем !

ЗЫ
Я тоже не верил что смогу перевести довольно большую прогу с Clipper 5.2 на Harbor , но.......5 дней упорной работы
и добился такого же функционала
5 метров исходников , 300 файлов , пришлось попотеть конечно.
Руки не опускай и все будет норм !
По ходу косяков будет много по началу но со временем все меньше и меньше. Просто поверь.

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 97
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 23:01. Заголовок: Dima пишет: Выведи ..


Dima пишет:

 цитата:
Выведи это дело в ? cDir+cAlias+cExt и глянь что кажет , возможно твой косяк



Мой.

удалил клипперовские *.NTX, а - *.XNT - остались... Удалил, перестроились ок.

Сорри.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 98
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.08.13 23:20. Заголовок: Dima пишет: Все пра..


Dima пишет:

 цитата:
Все правильно. Так и я думал и все получилось и у тебя все будет нормально с переводом. Просто остынь и осмысли
А вопросы сюда ;) Поможем !


А вот за это - отдельное БОЛЬШОЕ Спасибо!


 цитата:
ЗЫ
Я тоже не верил что смогу перевести довольно большую прогу с Clipper 5.2 на Harbor , но.......5 дней упорной работы
и добился такого же функционала
5 метров исходников , 300 файлов , пришлось попотеть конечно.
Руки не опускай и все будет норм !
По ходу косяков будет много по началу но со временем все меньше и меньше. Просто поверь.


У меня чуть скромнее: 34 файла, 2,5 мега исходников. Всегда старался не пользоваться никакими сторонними библиотеками, кроме стандартных Nanforun Toolkit и Clipper Tools - подозревал, что этот день когда-нить настанет...
В первом приближении - Работает!!! И ТАК БЫСТРО, что ппц.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 100
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.13 12:19. Заголовок: Итак, огромное спаси..


Итак, огромное спасибо всем помощникам! Программа запустилась и очень шустро (по сравнению с ntvdm) работает.
Возникающие то тут, то там вопросы - решаемы, связаны с вольностями Clipper - все, что дальше десятого символа считается неважным.

На повестке дня пока два насущных вопроса, связанных с отказом от нескольких системных функций:

1) В программе есть возможность записи клавиатурных нажатий. Типа макросов. И последующего их воспроизведения одним нажатием для автоматизации рутинных операций. Раньше это было организовано при помощи INKEYTRAP/TRAPANYKEY/KEYSEND. Одна из этих функций актвивизировалась и складывала в фоновом режиме все нажатия юзера в массив/строку. После чего в любой момент из массива/строки при помощи KEYSEND эти коды кнопок передавались в буфер клавиатуры. Просто и удобно. Как можно релизовать похожий механизм в Harbour ?

2) Нужен аналог функции BIOSDATE(), она используется сами понимаете для чего. Отказываться полностью не хочется, а использовать что-либо взамен - придется бегать по всем машинам с флэшкой, переделывать ключевые файлы.



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3362
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.08.13 12:32. Заголовок: Sergy пишет: Нужен ..


Sergy пишет:

 цитата:
Нужен аналог функции BIOSDATE()



 
Func Biosdate()
#include "hbwin.ch"

return GetRegistry( WIN_HKEY_LOCAL_MACHINE,"HARDWARE\DESCRIPTION\System" ,"SystemBiosDate" )



Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 101
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.13 12:38. Заголовок: Dima пишет: Func B..


Dima пишет:

 цитата:
Func Biosdate()
#include "hbwin.ch"

return GetRegistry( WIN_HKEY_LOCAL_MACHINE,"HARDWARE\DESCRIPTION\System" ,"SystemBiosDate" )



Спасибо, использую

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3363
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.08.13 12:44. Заголовок: Sergy Можно еще к M..


Sergy
Можно еще к MAC адресу сетевой прицепиться.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 102
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.13 13:04. Заголовок: Dima пишет: Можно е..


Dima пишет:

 цитата:
Можно еще к MAC адресу сетевой прицепиться.


Безусловно, только сейчас первая задача - сохранить и перенести функционал. И только потом развиваться дальше.

Вот с клавиатурными нажатиями - с какой стороны подступить ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3364
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.08.13 13:27. Заголовок: Sergy пишет: Вот с ..


Sergy пишет:

 цитата:
Вот с клавиатурными нажатиями - с какой стороны подступить ?


Можно попробовать FT_OnTick({|| test()},1) в функции Test и пробуй записывать
Или ваять самому https://groups.google.com/forum/#!topic/comp.lang.xharbour/e77vVVb1Kuc

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 106
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.13 15:18. Заголовок: Dima пишет: Можно п..


Dima пишет:

 цитата:
Можно попробовать FT_OnTick({|| test()},1) в функции Test и пробуй записывать
Или ваять самому https://groups.google.com/forum/#!topic/comp.lang.xharbour/e77vVVb1Kuc



Буду пробовать...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 109
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.13 17:52. Заголовок: Dima пишет: Func B..


Dima пишет:

 цитата:
Func Biosdate()
#include "hbwin.ch"

return GetRegistry( WIN_HKEY_LOCAL_MACHINE,"HARDWARE\DESCRIPTION\System" ,"SystemBiosDate" )



Error: Unresolved external '_HB_FUN_GETREGISTRY' referenced from... хотя в проект hbwin.hbc подключил...



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3369
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.08.13 18:13. Заголовок: Sergy пишет: Error:..


Sergy пишет:

 цитата:
Error: Unresolved external '_HB_FUN_GETREGISTRY' referenced from.


попробуй win_regGet()
У меня Harbour 3.2 у тебя 3.0 вот и отличия

ЗЫ
Можно еще сырец глянуть win_reg.prg из Hbwin

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 110
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.13 21:54. Заголовок: Dima пишет: попробу..


Dima пишет:

 цитата:
попробуй win_regGet()
У меня Harbour 3.2 у тебя 3.0 вот и отличия



Получилось.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 111
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.08.13 23:58. Заголовок: Заметил, что ACHOICE..


Заметил, что ACHOICE себя как-то странно ведет. Суть:

REPEAT
pos := ACHOICE(2,10,2,40,show_array,,,pos)
UNTIL (LastKey() == K_ENTER)

Да, весь массив в Clipper прокручивается в одной строке - так выбираю логин входящего юзера, чтобы не вводить с клавиатуры. Компактно и поиск по первой букве работает.
Плюс стрелками можно выбрать:
Savin -> Serebrov -> Silaev...

В Harbour при нажатии "стрелка вверх" неожиданно появляется второй элемент массива на третьей строке, т.е. там, где ACHOICE делать вообще нечего...

Залез в tests\ac_test.prg

Скрытый текст


Запустил, офигел:



У всех так ?

Второй файл, ac_test2 тоже работает через Ж...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2924
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.08.13 00:15. Заголовок: Sergy пишет: Замети..


Sergy пишет:

 цитата:
Заметил, что ACHOICE себя как-то странно ведет.


Да, он от клипера отличается.
Смотри доку и переделывай обработку функций ACHOICE, MEMOEDIT, TBROWSE.

Мне тоже пришлось это переделывать. Разницу сейчас не скажу, но делал маленькие тестовые примеры, а потом код перетаскивал в свои системы.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 112
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 13.08.13 15:26. Заголовок: Andrey пишет: Смотр..


Andrey пишет:

 цитата:
Смотри доку



Какую именно доку ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2925
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.08.13 18:12. Заголовок: Sergy пишет: Какую ..


Sergy пишет:

 цитата:
Какую именно доку ?



http://clipper.borda.ru/?1-6-0-00000007-000-0-0-1365407210

http://clipper.borda.ru/?1-6-0-00000004-000-0-0-1355750592

и т.д.


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 113
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 13.08.13 22:30. Заголовок: Andrey пишет: http:..


Andrey пишет:

 цитата:
http://clipper.borda.ru/?1-6-0-00000007-000-0-0-1365407210

http://clipper.borda.ru/?1-6-0-00000004-000-0-0-1355750592

и т.д.



Вот смотрю конкретно ACHOICE: http://www.elektrosoft.it/tutorials/Harbour-Reference-Guide/harbour-reference-guide.htm#AChoice

Не могу понять - какие в нем отличия от Клипперовского ?
Ведь заявлена полная совместимость, а по сути получается, что просто криво реализована? Может у меня сборка такая, раз даже тестовый пример не работает...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 900
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 14.08.13 08:31. Заголовок: Да, с AChoice косяк ..


Да, с AChoice косяк есть...

Хех... В тех исходниках, что у меня (а они довольно старые, от 30.01.2013), в achoice.prg увидел следующее:
/* TOFIX: 
---
#include "inkey.ch"
CLS
hb_keyPut( { K_DOWN, K_UP } ) // bogus '2' appears out of the area here.
AChoice( 0, 0, 0, 0, { "1", "2" } )
---
*/


Так что баг уже давно замечен. Осталось, чтобы кто-то его вылечил... )))
У кого есть свежие исходники? Там не исправлено еще?

update:
Сечас посмотрел на git. Не исправлено... (((
Ну что ж, либо забить, либо искать косяк в achoice.prg и исправлять.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 14
Зарегистрирован: 24.04.13
ссылка на сообщение  Отправлено: 15.08.13 16:57. Заголовок: По inkeytrap() см. в..

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 121
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 15.08.13 17:53. Заголовок: azoo пишет: По inke..


azoo пишет:

 цитата:
По inkeytrap() см. ветку



Спасибо. Пригодилось.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 137
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 17:50. Заголовок: Не получается подруж..


Не получается подружить русский язык и файловую систему.

Например:

 

FUNC Main()

REQUEST HB_LANG_RU866
REQUEST HB_CODEPAGE_RU866
HB_LANGSELECT("RU866")
HB_CDPSELECT("RU866")

? File("текст.!")
QUIT

RETURN

Всегда дает результат .F.
Файл разумеется есть, лежит рядом с exe. Если переименовать в латиницу - результат File("text.!") сразу .T.

Команда RUN("@echo --- Привет --- ") дает кракозябры на экране.

В hbp указал
-DHB_LANG_DEFAULT=RU866
-DHB_CODEPAGE_DEFAULT=RU866

Что я еще забыл переключить в настройках ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2944
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.08.13 18:06. Заголовок: Есть 2 способа решен..


Есть 2 способа решения этого вопроса:

1. Транслировать имена файлов из cp866 в cp1251

2. Добавить в конец модуля такую функцию:

#pragma BEGINDUMP
#include "windows.h"

HB_FUNC_STATIC( SETFILEAPIS ) // Имена файлов в кодировке OEM
{
SetFileApisToOEM();
}
#pragma ENDDUMP

и вызвать ее при старте программы

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 138
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 18:12. Заголовок: Pasha пишет: Есть ..


Pasha пишет:

 цитата:

Есть 2 способа решения этого вопроса:

1. Транслировать имена файлов из cp866 в cp1251


Переделывать всю программу, искать вызовы файловых функций (а там во всех местах - и FILE() и DIRECTORY() и тд и тп) ... муторно очень...


 цитата:
2. Добавить в конец модуля такую функцию:



Добавил.
RUN("@echo --- Привет ---") теперь пишет нормально, а File() все равно дает .F.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 139
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 18:56. Заголовок: Попробовал даже так:..


Попробовал даже так:

sx := "абв.dbf"
sx := HB_TRANSLATE(sx,"RU866","RU1251")

? File(sx)

все равно дает .F.



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2931
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.08.13 21:05. Заголовок: Попробуй так: FUNC M..


Попробуй так:
FUNC Main()

REQUEST HB_LANG_RU866
REQUEST HB_CODEPAGE_RU866
HB_LANGSELECT("RU866")
HB_CDPSELECT("RU866")

sx := "абв.dbf"
sx := HB_ANSITOOEM(sx)
? File(sx)


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 140
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 21:51. Заголовок: Andrey пишет: Попр..


Andrey пишет:

 цитата:

Попробуй так:
...
sx := HB_ANSITOOEM(sx)



Попробовал. FALSE

Поставил наоборот - HB_OEMTOANSI(sx) - заработало.

Блин... этож сколько переписывать придется... просто ппц... Неужели нет вариантов ???




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1143
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.08.13 22:06. Заголовок: Sergy пишет: Блин....


Sergy пишет:

 цитата:
Блин... этож сколько переписывать придется... просто ппц... Неужели нет вариантов ???



Лично у меня
FUNC Main()

REQUEST HB_LANG_RU866
REQUEST HB_CODEPAGE_RU866
HB_LANGSELECT("RU866")
HB_CDPSELECT("RU866")

? File("текст.!")
QUIT

RETURN

показало .T. если исходник в 866 странице, ну и .F. если в 1251


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 141
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 22:13. Заголовок: Исходник ведь клиппе..


Исходник ведь клипперовский, конечно он в 866 странице...

Базы данных, все сообщения - все работает нормально. А вот с файловой системой какая-то непонятка...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1144
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.08.13 22:22. Заголовок: А какая ось, как зап..


А какая ось, как запускаете программу, что показывает chcp?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 142
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 22:35. Заголовок: Петр пишет: А какая..


Петр пишет:

 цитата:
А какая ось, как запускаете программу, что показывает chcp?



На домашнем компе - XP, запускаю программу из под Far, chcp показывает 866

На работе - сервер 2003 SR3, остальное тоже самое - и из под Far и из проводника тоже самое...


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1145
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.08.13 22:41. Заголовок: Ну не знаю, Win 7, F..


Ну не знаю, Win 7, Far 3.0 build 3249, active code page 866

.T.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 12
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 19.08.13 22:46. Заголовок: Сначала нужно SetFileApis


proc main
Local cfname
// set name before SetFileApis - wrong
cfname:="тест.!"
strfile("1",cfname,.f.)
? file(cfname)
SetFileApis()
? file(cfname)

inkey(100)

// set name after SetFileApis - right
cfname:="тест.!"
strfile("2",cfname,.f.)
? file(cfname)

return

#pragma BEGINDUMP

#include "windows.h"

HB_FUNC_STATIC( SETFILEAPIS ) //
{
SetFileApisToOEM();
}
#pragma ENDDUMP


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 143
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 22:47. Заголовок: Петр пишет: Ну не з..


Петр пишет:

 цитата:
Ну не знаю, Win 7, Far 3.0 build 3249, active code page 866

.T.





Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 144
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 22:56. Заголовок: petr707 пишет: proc..


petr707 пишет:

 цитата:
proc main
Local cfname
// set name before SetFileApis - wrong
cfname:="тест.!"
strfile("1",cfname,.f.)
? file(cfname)
SetFileApis()
? file(cfname)

inkey(100)

// set name after SetFileApis - right
cfname:="тест.!"
strfile("2",cfname,.f.)
? file(cfname)

return

#pragma BEGINDUMP

#include "windows.h"

HB_FUNC_STATIC( SETFILEAPIS ) //
{
SetFileApisToOEM();
}
#pragma ENDDUMP



Прикольно.
У меня получилось
.T.
.T.
.T.

НО имя файла в?бв.!

Компилировал припомощи hbp следующего содержания (скопирован с проекта)

d:\harbour\contrib\hbnf\hbnf.hbc
d:\harbour\contrib\hbct\hbct.hbc
d:\harbour\contrib\hbwin\hbwin.hbc
d:\harbour\contrib\hbblink\hbblink.hbc

-lhbcpage.lib
-inc
-run
-LD:\Harbour\lib\win\bcc
-DHB_LANG_DEFAULT=RU866
-DHB_CODEPAGE_DEFAULT=RU866
-prgflag=/v

lang_test2.prg


Ваще ниче не понимаю...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 13
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 19.08.13 23:04. Заголовок: Удалите все файлы, и перезапустите ,старый файл тест.! мешает


Удалите все файлы, и перезапустите ,старый Ваш файл тест.! картинку портит

Должно быть два файла
в?бв.! ( содержимое="1")
и
тест.! (содержимое="2")

proc main

REQUEST HB_LANG_RU866
REQUEST HB_CODEPAGE_RU866
HB_LANGSELECT("RU866")
HB_CDPSELECT("RU866")

// set name before SetFileApis - wrong
cfname:="тест.!"
strfile("1",cfname,.f.)
? file(cfname)
SetFileApis()
? file(cfname)

inkey(100)

// set name after SetFileApis - right
cfname:="тест.!"
strfile("2",cfname,.f.)
? file(cfname)

return

#pragma BEGINDUMP

#include "windows.h"

HB_FUNC_STATIC( SETFILEAPIS ) //
{
SetFileApisToOEM();
}
#pragma ENDDUMP

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 145
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 23:05. Заголовок: Вот такой пример: p..


Вот такой пример:

proc main
Local cfname
// set name before SetFileApis - wrong
cfname:="тест1.!"
strfile("1",cfname)
? file(cfname)

SetFileApis()

// set name after SetFileApis - right
cfname:="тест2.!"
strfile("2",cfname)
? file(cfname)

return

#pragma BEGINDUMP

#include "windows.h"

HB_FUNC_STATIC( SETFILEAPIS ) //
{
SetFileApisToOEM();
}
#pragma ENDDUMP

дает
.T.
.T.

и два файла: в?бв1.! и в?бв2.!

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 146
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 23:06. Заголовок: почти синхронно отве..


почти синхронно ответили...

ща попробую Ваш пример

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 14
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 19.08.13 23:08. Заголовок: Не работает SetFileApis()


Не работает SetFileApis()

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 147
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 23:09. Заголовок: petr707 пишет: Уда..


petr707 пишет:

 цитата:

Удалите все файлы, и перезапустите ,старый Ваш файл тест.! картинку портит

Должно быть два файла
в?бв.! ( содержимое="1")
и
тест.! (содержимое="2")



Все удалил

получил две шутки TRUE и ОДИН файл в?бв.! с содержимым 2

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 148
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 23:10. Заголовок: petr707 пишет: Не р..


petr707 пишет:

 цитата:
Не работает SetFileApis()



Он работает, но как-то "не до конца".

Без него RUN("@echo -- Привет --") дает кракозябры. С ним - всё нормально.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 15
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 19.08.13 23:15. Заголовок: Harbour - сборка Unicode ?


Запуск test.exe //info -что показывает ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 149
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 23:17. Заголовок: petr707 пишет: Запу..


petr707 пишет:

 цитата:
Запуск test.exe //info -что показывает ?



Harbour Terminal: Windows native console
Harbour 3.0.0 (Rev. 16951)
Windows XP 5.1.2600 Service Pack 3
DS avail=1692828KB OS avail=2079244KB EMM avail=0KB MemStat:Off MT:Off

.T.
.T.
.T.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 16
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 19.08.13 23:18. Заголовок: RUN("@echo -- Привет --") дает кракозябры


RUN("@echo -- Привет --") дает кракозябры

еще раз проверяем кодовую страницу PRG -файла

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 150
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 23:22. Заголовок: petr707 пишет: еще ..


petr707 пишет:

 цитата:
еще раз проверяем кодовую страницу PRG -файла



Вот ascii-коды символов, входящих в слово "Привет", которые выводит встроенный редактор FAR: 143 224 168 162 165 226

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 17
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 19.08.13 23:40. Заголовок: Чтобы не зависеть от кодовой страницы Prg-файла


Чтобы не зависеть от кодовой страницы Prg-файла
замените
cfname:="тест.!"
на
cfname:=CHR(226)+CHR(165)+...//"тест.!"


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 151
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.08.13 23:44. Заголовок: petr707 пишет: Чтоб..


petr707 пишет:

 цитата:
Чтобы не зависеть от кодовой страницы Prg-файла
замените
cfname:="тест.!"
на
cfname:=CHR(226)+CHR(165)+...//"тест.!"



сделал.
результат не изменился.

три штуки TRUE
один файл с именем в кракозябрах
с содержимым "2"



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 18
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 19.08.13 23:50. Заголовок: Начинаем "шаманить"


Начинаем "шаманить"

После строки HB_CDPSELECT("RU866")

Добавляем одну строку
HB_GtInfo(HB_GTI_CODEPAGE, 255) // oem_charset

//HB_GtInfo(HB_GTI_CODEPAGE, 0 ) // ansi_charset
// HB_SETTERMCP("RU256")//, "RU1251", .t. )



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 152
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 00:01. Заголовок: petr707 пишет: Начи..


petr707 пишет:

 цитата:
Начинаем "шаманить"

После строки HB_CDPSELECT("RU866")

Добавляем одну строку
HB_GtInfo(HB_GTI_CODEPAGE, 255) // oem_charset



┌────────────────────────────────────────────┐
│ Error BASE/1003 Переменная не существует: │
│ HB_GTI_CODEPAGE │
│ │
│ Quit Retry │
└────────────────────────────────────────────┘

Подключил hbgtinfo.ch

результат - один в один - три TRUE, один файл с названием из кракозябр и содерджимым 2

Поставил

HB_GtInfo(HB_GTI_CODEPAGE, 0) - тоже самое


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 19
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 20.08.13 00:10. Заголовок: \hb30\tests\gtchars.prg


Похоже дело не в русских именах файлов
а вообще с кодовой страницей

Предлагаю скомпилировать и выполнить тесты
из \hb30\tests\
можно начать с gtchars.prg

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 153
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 00:18. Заголовок: petr707 пишет: можн..


petr707 пишет:

 цитата:
можно начать с gtchars.prg



скомпилировал,
боксики-квадратики видны ok

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 154
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 00:27. Заголовок: вместо польских пост..


вместо польских поставил RU866, вроде все работает:



Или я чего не понимаю ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 156
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 01:15. Заголовок: Вот что нашел тут: h..


Вот что нашел тут: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365534(v=vs.85).aspx

8-bit console apps using the OEM codepage

Note: If you are writing/porting an 8-bit console application, in addition to calling SetFileApisToOem() you should also call setlocale(LC_ALL, ".OCP") followed by _setmbcp(_MB_CP_LOCALE).

Может этих двух вызовов и не хватает?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 157
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 09:48. Заголовок: Помогите плиз... :s..


Помогите плиз...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3405
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.13 11:04. Заголовок: XP SP2 Текст в DOS к..


XP SP2
Текст в DOS кодировке (набирался в FAR)
Harbour 3.2.0dev (Rev. 18899)

 
FUNC Main()

REQUEST HB_LANG_RU866
REQUEST HB_CODEPAGE_RU866
HB_LANGSELECT("RU866")
HB_CDPSELECT("RU866")

fclose(fcreate("текст.!"))
? File("текст.!") // .T.

RUN("@echo -- Привет --") // и тут все норм на экране

QUIT

RETURN


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 158
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 11:18. Заголовок: Dima пишет: Harbour..


Dima пишет:

 цитата:
Harbour 3.2.0dev


я бился и так и эдак - походу дело в версии Harbour. Нужно пробовать 3.2 вместо 3.0.

Подскажите плиз - с чего начать. Там так понимаю, все идет в исходниках, нужно саму систему сначала скомпилить...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3406
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.13 11:29. Заголовок: Sergy Сливай , расп..


Sergy
Сливай , распаковывай и собирай
http://github.com/harbour/core/archive/master.zip

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2945
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.08.13 13:05. Заголовок: Sergy пишет: Помоги..


Sergy пишет:

 цитата:
Помогите плиз...



Действительно, необходимо использовать Harbour 3.2
Это уникодная сборка, а 3.0 - еще не уникодная. 3.2 преобразует имена файлов в UNICODE, и проблем с именами не возникнет, если указана cp866
Вызов SetFileApis в этом случае не нужен.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 159
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 16:35. Заголовок: Pasha пишет: Действ..


Pasha пишет:

 цитата:
Действительно, необходимо использовать Harbour 3.2
Это уникодная сборка, а 3.0 - еще не уникодная. 3.2 преобразует имена файлов в UNICODE, и проблем с именами не возникнет, если указана cp866
Вызов SetFileApis в этом случае не нужен.



Все заработало как нужно.

Правда EXE стал вместо 2,5 мегов почти 4 - но кого это сегодня заботит...

Уважаемые старожилы - предупреждайте новичков о таких вилах, спрятанных в стоге сена по названием Harbour 3.0.

Спасибо за поддержку и помощь.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 160
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 16:37. Заголовок: Dima пишет: Сливай ..


Dima пишет:

 цитата:
Сливай , распаковывай и собирай
http://github.com/harbour/core/archive/master.zip



Видимо "мой кунг-фу недостаточно хорош..." (с) Слил отсюда: https://github.com/harbour/core готовый EXE для Windows - все запустилось.
Какие отрицательные последствия от такого упрощенного шага?
Девелопер Харбора из меня вряд-ли пока получится...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3407
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.08.13 16:37. Заголовок: Sergy пишет: Правда..


Sergy пишет:

 цитата:
Правда EXE стал вместо 2,5 мегов почти 4


А ты его сожми UPX
В файле проекта пропиши
-compr=max

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 161
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 16:54. Заголовок: Dima пишет: А ты ег..


Dima пишет:

 цитата:
А ты его сожми UPX
В файле проекта пропиши
-compr=max



да, тоже мысль.

Кстати, или мне чудится на радостях после вчерашней бессонной ночи, или этот EXE стал ЕЩЕ ШУСТРЕЕ (компилер и комп разумеется те-же самые, что и вчера) ?
Такое возможно ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 164
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.08.13 23:40. Заголовок: Dima пишет: А ты ег..


Dima пишет:

 цитата:
А ты его сожми UPX
В файле проекта пропиши
-compr=max



Попробовал.
Так, для общей инфы: В файле ресурса есть пяток иконок (кому какие понравятся, на выбор взамен старой). Система их не видит в сжатом EXE. Т.е. в диалоге ярлыка "сменить иконку" только один вариант - тот, что был первым в списке.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3409
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.08.13 08:57. Заголовок: Sergy пишет: Так, д..


Sergy пишет:

 цитата:
Так, для общей инфы: В файле ресурса есть пяток иконок (кому какие понравятся, на выбор взамен старой). Система их не видит в сжатом EXE. Т.е. в диалоге ярлыка "сменить иконку" только один вариант - тот, что был первым в списке.


Так вот он в чем косяк оказывается. Это ответ на мой вопрос тут http://clipper.borda.ru/?1-4-0-00000881-000-0-0-1375200620

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 165
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.08.13 09:37. Заголовок: Dima пишет: Так вот..


Dima пишет:

 цитата:
Так вот он в чем косяк оказывается. Это ответ на мой вопрос тут http://clipper.borda.ru/?1-4-0-00000881-000-0-0-1375200620



Наверняка.
Можно будет попробовать другие уровни сжатия - может быть при каком-то из них (не -max) ресурсы будут доступны извне программы.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3410
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.08.13 09:45. Заголовок: Sergy пишет: Можно ..


Sergy пишет:

 цитата:
Можно будет попробовать другие уровни сжатия


Уже. Результат тот же.
Вот и думаю теперь а есть ли смысл паковать EXE. В чистом виде весит 7.3 метра , в упакованном 2.2 метра и
запускается по сети.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 168
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 21.08.13 12:09. Заголовок: а запуск "по сет..


а запуск "по сети" у кого быстрее - у упакованного или у обычного ?
если разницы нет - какой тогда смысл паковки ?

И еще: при запуске "по сети" что показывает EXEPATH() ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2946
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.13 12:16. Заголовок: Если так беспокоит р..


Если так беспокоит размер exe, то почему бы не использовать сборку с harbour*.dll ?
exe сразу же станут фантастически маленькими.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3412
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.08.13 12:37. Заголовок: Pasha пишет: почему..


Pasha пишет:

 цитата:
почему бы не использовать сборку с harbour*.dll ?


Это опция hbmk2 ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2947
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 21.08.13 12:42. Заголовок: Dima пишет: Это опц..


Dima пишет:

 цитата:
Это опция hbmk2 ?



Да, опция -shared

Можно использовать не только harbour*.dll, а и прочие библиотеки как dll, но это уже надо указывать ручками:

заменить

-lhbct

на

-lhbct-bcc

и так далее

Конечно, в целом программа меньше не станет. С учетом dll она станет больше. Но зато обновлять ее будет не в пример удобнее.

Спасибо: 1 
ПрофильЦитата Ответить
администратор




Пост N: 3413
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 21.08.13 12:46. Заголовок: Pasha Спасибо !..


Pasha
Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 187
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 11:49. Заголовок: Возник вопрос: при в..


Возник вопрос: при включенной русской раскладке "точка" на цифровой клавиатуре неожиданно стала "запятой".
Мне понятно, что это по дефолту установлено в винде, но юзеры бесятся.

Есть ли красивый выход из этой ситуции ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3434
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 13:27. Заголовок: Sergy пишет: Возник..


Sergy пишет:

 цитата:
Возник вопрос: при включенной русской раскладке "точка" на цифровой клавиатуре неожиданно стала "запятой".


Точно ,есть такой косяк.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 188
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 15:09. Заголовок: Dima пишет: Точно ,..


Dima пишет:

 цитата:
Точно ,есть такой косяк.



Пока в первом приближении такая мысль:
поставить SETKEY() на "запятую" и анализировать текущее GET-поле.
Если его тип равен N - посылать в буфер клавиатуры CHR(8) и "точку"



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3436
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 15:12. Заголовок: Sergy Это не первый..


Sergy
Это не первый косяк такого рода в этом терминале и если не ошибаюсь в прошлый раз косяк исправил Павел.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 190
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 15:14. Заголовок: Dima пишет: Это не ..


Dima пишет:

 цитата:
Это не первый косяк такого рода в этом терминале и если не ошибаюсь в прошлый раз косяк исправил Павел.



Дабы дважды не наступать на одни и те-же грабли - подскажи плиз - что за косяк и какое решение ?
Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3437
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 15:17. Заголовок: Dima пишет: анализи..


Dima пишет:

 цитата:
анализировать текущее GET-поле


Анализировать надо и еще Procname (в цикле) мне кажется.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3438
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 15:18. Заголовок: Sergy пишет: что за..


Sergy пишет:

 цитата:
что за косяк и какое решение


Был косяк с какой то буквой кажется не помню какой то ли ё то ли еще какой. И он пофиксен.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 191
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 15:23. Заголовок: Dima пишет: И он по..


Dima пишет:

 цитата:
И он пофиксен.



где ? как именно ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3440
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 15:25. Заголовок: Sergy пишет: где ? ..


Sergy пишет:

 цитата:
где ? как именно ?


Паша придет скажет я не помню ;)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 192
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 15:36. Заголовок: Есть ли способ прове..


Есть ли способ проверить существование текущего GET-объекта ?
Чтобы потом сделать проверку наподобие такой: VALTYPE(oGet:varGet() == "N") ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3441
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 15:42. Заголовок: Sergy пишет: Есть л..


Sergy пишет:

 цитата:
Есть ли способ проверить существование текущего GET-объекта ?


а зачем если ты объявишь Set key (46 код) на эту педаль и будешь слать в буфер точку ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 193
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 15:54. Заголовок: Dima пишет: а зачем..


Dima пишет:

 цитата:
а зачем если ты объявишь Set key (46 код) на эту педаль и будешь слать в буфер точку ?



а если там текстовое поле и нужна запятая ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3443
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 16:07. Заголовок: Sergy Если мы говор..


Sergy
Если мы говорим о цифровой панели и о кнопке DEL c точкой , то при нажатии этой педали
всегда должна биться точка если включен NumLock не зависимо от раскладки клавы.
Или я что то не понял ? :)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 195
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 16:31. Заголовок: Dima пишет: Если мы..


Dima пишет:

 цитата:
Если мы говорим о цифровой панели и о кнопке DEL c точкой , то при нажатии этой педали
всегда должна биться точка если включен NumLock не зависимо от раскладки клавы.
Или я что то не понял ? :)



Да, именно о ней. Но разве INKEY() этой запятой чем-то отличается от запятой, набранной на стандартной клавиатуре? Ведь иногда нужна именно запятая.

... пойду проверю...

upd: не отличаются. И в том и другом случае код 44.

Эти кнопки, кстати о птичках, легко отличал TRAPANYKEY() И на его основе (кроме макросов), такая замена была-бы сделана в три строчки кода...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3444
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 17:12. Заголовок: Sergy пишет: Есть л..


Sergy пишет:

 цитата:
Есть ли способ проверить существование текущего GET-объекта ?
Чтобы потом сделать проверку наподобие такой: VALTYPE(oGet:varGet() == "N") ?



Ваял что то ваял я , смотри как можно проанализировать но есть затык
 
Proc Main
local acc:=0
local acc1:=" "
cls
setmode(25,80)
set key 28 to test

@ 0,0 get acc
@ 1,0 get acc1

read
RETURN
************

FUNCTION test()

LOCAL n := 0 ,i


WHILE ! Empty( ProcName( n ) )
n++
if procname(n)=="HBGETLIST:READMODAL"
for i=1 to len(__GETLISTACTIVE())
? __GETLISTACTIVE()[ i ],i

* вот тут можно проверять по идее Valtype(__GETLISTACTIVE()[13]) твоя текущая переменная в GET
* но зараза все время выдает "C" , похоже не там копаю или не так........
next
endif

ENDDO

RETURN NIL



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3445
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.08.13 18:03. Заголовок: Все разобрался Функц..


Все разобрался
Функция Test
 
FUNCTION test()

LOCAL n := 0 ,i

WHILE ! Empty( ProcName( n ) )
n++
if procname(n)=="HBGETLIST:READMODAL"
if valtype(GetActive():varGet())=="N"
hb_keyins(".")
exit
endif
endif

ENDDO

RETURN NIL



Упрощаем ;)
 
FUNCTION test()
if GetActive()#NIL
if valtype(GetActive():varGet())=="N"
hb_keyins(".")
endif
endif

return nil





ЗЫ
Set key вешаем на точку или куда хотел.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 196
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.08.13 21:57. Заголовок: Dima пишет: FUNCTI..


Dima пишет:

 цитата:
FUNCTION test()
if GetActive()#NIL
if valtype(GetActive():varGet())=="N"
hb_keyins(".")
endif
endif

return nil



Красиво. Осталось разрешить ввод собственно запятой, когда она нужна.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 197
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 23.08.13 00:22. Заголовок: Три часа бился, вот ..


Три часа бился, вот что вышло:

Скрытый текст


Все было-бы проще, если-бы удалось запустить Харборовскую функцию SETKEY() с описанным третьим параметром:

SETKEY(44,{||HB_KeyIns(".")},;  
{||GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N"})

Третий параметр как раз задает условное выполнение кодового блока, переданного вторым параметром. Но у меня он полностью игнроруется, не могу понять почему. Пробовал HB_SETKEY() - тоже самое, ноль эмоций.
Поэтому пока так, пока кто-нить не предложит лучший вариант.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3448
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.08.13 11:10. Заголовок: Sergy пишет: SETKEY..


Sergy пишет:

 цитата:
SETKEY(44,{||HB_KeyIns(".")},;
{||GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N"})



а так ?
HB_SETKEY(44,{|| if(GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N",HB_KeyIns("."),"")})


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 198
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 23.08.13 12:18. Заголовок: Dima пишет: а так ?..


Dima пишет:

 цитата:
а так ?
HB_SETKEY(44,{|| if(GetActive() # NIL .AND. VALTYPE(GetActive():varGet())=="N",HB_KeyIns("."),"")})



в таком случае мы никогда не увидим запятую - при любом ее нажатии будет отрабатываться блок кода
я ведь не зря мучался три часа с примером в пред. сообщении

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 228
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.08.13 14:17. Заголовок: может так: HB_SETKE..


может так:
 
HB_SETKEY(44,{|o| o:= GetActive(), if(o # NIL, if(VALTYPE(o:varGet())=="N", HB_KeyIns("."), o:Insert(",")), "")})
где:
Text Entry Methods
insert() Inserts characters into the editing buffer:

insert(<cChar>) --> self

Inserts <cChar> into the editing buffer at the current cursor
position, shifting the existing contents of the buffer to the right.
The cursor is then placed one position to the right of the inserted
string.



Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 199
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 23.08.13 14:22. Заголовок: SergKis пишет: мож..


SergKis пишет:

 цитата:

может так:
...
o:Insert(",")


У меня попытка вставки запятой через буфер клавиатуры вызывала очередной вызов обработчика запятой.
Что разумеется приводило к зависанию программы.

Нужно будет попробовать.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3449
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.08.13 14:57. Заголовок: При нажатии запятой ..


При нажатии запятой в этом случае в GET вставляется пробел почему то

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 215
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 23.08.13 19:31. Заголовок: Dima пишет: При наж..


Dima пишет:

 цитата:
При нажатии запятой в этом случае в GET вставляется пробел почему то



+1

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 230
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.08.13 22:32. Заголовок: Dima пишет: При нажа..


Dima пишет:
 цитата:
При нажатии запятой в этом случае в GET вставляется пробел почему то


пробел не вставляется, вставляется "" и позиция каретки +1, т.е. в tget.prg method insert( cChar ) для
...
::cBuffer := Left( SubStr( ::cBuffer, 1, ::nPos - 1 ) + cChar + SubStr( ::cBuffer, ::nPos ), ::nMaxEdit )
cChar == "" а не "," .
что есть печально.



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3460
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 23.08.13 22:45. Заголовок: SergKis пишет: что ..


SergKis пишет:

 цитата:
что есть печально.


да не все еще отточено в Harbour
а метода твоя была супер

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 231
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.08.13 22:52. Заголовок: Dima а так работает:..


Dima
а так работает:
 
hb_SetKey(44, {|| MyTest44(GetActive()) }, {|| GetActive() != NIL})
...
FUNC myTest44( o )

IF o:pos > 1
o:buffer := left(subs(o:buffer, 1, o:pos-1)+','+subs(o:buffer, o:pos+1), len(o:buffer))
ELSE
o:buffer := ','+subs(o:buffer, 2)
ENDIF
o:varPut(o:buffer)
o:display()

RETURN


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 220
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 24.08.13 19:05. Заголовок: SergKis пишет: а та..


SergKis пишет:

 цитата:
а так работает:


теперь курсор не сдвигается с места после установки запятой Но за идею - спасибо.

Вот что получилось в итоге (upd @22:00)

 
FUNC CommaRepl(oGet) // меняем запятую на точку

IF (VALTYPE(oGet:VarGet()) == "C") // текст ?
IF (VAL(oGet:VarGet()) # 0) // а по сути цифра ?
PutInKbd(".") // меняем на точку
ELSE // не цифра, соотв. нужна запятая
// тк банальный :Insert(",") пока глючит, извращаемся так:
IF oGet:pos > 1
oGet:buffer := LEFT(SUBSTR(oGet:buffer, 1, oGet:pos-1)+','+;
SUBSTR(oGet:buffer, oGet:pos+1), LEN(oGet:buffer))
ELSE
oGet:buffer := ','+SUBSTR(oGet:buffer, 2)
ENDIF
oGet:VarPut(oGet:buffer)
oGet:Display()
oGet:pos += 1 // перемещаем каретку вправо
ENDI
ELSE // цифра, дата и тп...
PutInKbd(".") // меняем на точку
ENDIF

RETURN


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 235
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.08.13 20:22. Заголовок: Sergy пишет:теперь к..


Sergy пишет:
 цитата:
теперь курсор не сдвигается с места после установки запятой


так я делал замену, не вставку, а для упр. позицией каретки служит oGet:pos += 1 или как надо

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 221
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 24.08.13 20:46. Заголовок: SergKis пишет: так ..


SergKis пишет:

 цитата:
так я делал замену, не вставку, а для упр. позицией каретки служит oGet:pos += 1 или как надо


Спасибо

просто "мой кунг-фу недостаточно хорош" (с) - не силен я в классах.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 227
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 10:10. Заголовок: Вопрос. Вот есть та..


Вопрос.

Вот есть такой код:

USE (dx+"mail") INDEX (dx+"mail"),(dx+"mail2") NEW // <<< строка 81
IF NETERR()
CLOSE mail
SELECT(area)
RETURN {area,FALSE,FALSE}
ENDIF

Возникает ошибка:

Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD

Вызов из ORDLISTADD(0)
Вызов из DBSETINDEX(0)
Вызов из OPENMAIL(81)
...

Судя по ошибке, dbf открылся, а ntx - нет.
Переменная dx совершенно точно к этому моменту определена и существует.
Подобный код в Clipper всегда работал и не вызывал ни единой проблемы.
Что тут может быть в данном случае ?

Как в Harbour однозначно определять успех/неуспех открытия индексов ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2955
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 10:21. Заголовок: Sergy пишет: Судя п..


Sergy пишет:

 цитата:
Судя по ошибке, dbf открылся, а ntx - нет.



Наоборот, не открылся dbf, и попытка при этом открыть индекс
Причину ищите. Или dbf файл не найден, или что-то связанное с монопольным доступом к нему

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 229
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 10:24. Заголовок: Pasha пишет: Наобор..


Pasha пишет:

 цитата:
Наоборот, не открылся dbf



Вот еще поймал, на другой машине:
Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD

Вызов из ORDLISTADD(0)
Вызов из DBSETINDEX(0)
Вызов из IP_LOAD(734)
...

USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW // строка 734

local_dir точно существует, ipricev.dbf открылся:

Open Tables:
1. BUYPRICE
2. PRICE
3. RESERV
4. AMOUNT
5. AMIMAGE
6. IPRICEV


 цитата:
что-то связанное с монопольным доступом к нему



В первом примере 100% shared доступ (база с сообщениями - постоянна изменяющаяся, в общем доступе на сервере).
Во втором - локальная, справочник, монопольный.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 910
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.08.13 10:47. Заголовок: IPRICEV - это переме..


IPRICEV - это переменная?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2946
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.13 11:04. Заголовок: Sergy пишет: USE (d..


Sergy пишет:

 цитата:
USE (dx+"mail") INDEX (dx+"mail"),(dx+"mail2") NEW // <<< строка 81


Сделай все поочередно:

// Блок обработки ошибки
bOldError := ERRORBLOCK( {|e| OpenDBF(e, bOldError)} )
BEGIN SEQUENCE
USE (dx+"mail") ALIAS MAIL NEW SHARED
RECOVER
MSG( "Не могу открыть БД " + dx+"mail" + " !"
RETURN( .F. )
END SEQUENCE

BEGIN SEQUENCE
ORDLISTADD( dx+"mail" )
ORDLISTADD( dx+"mail2" )
RECOVER
MSG( " Индекс " + dx+"mail не найден !
RETURN( .F. )
END SEQUENCE


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 230
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 11:37. Заголовок: PSP пишет: IPRICEV ..


PSP пишет:

 цитата:
IPRICEV - это переменная?


вот тут:
USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW
текстовая переменная

в списке OpenTables - алиас открытой области/ Его формирует автоматом обработчик ошибок перед завершением программы.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 231
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 11:43. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделай все поочередно:


во всей программе ?

Дело в том, что определенной логики в возникновении данного явления никак найти не могу.
Тот-же пример с mail вообще вызывается на каждой машине сети каждые 2-3 минуты (для проверки наличия новых писем) - все работает, хоть бы хны...

Вопрос в другом - почему не отрабатывает NETERR() ???

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2947
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.13 11:51. Заголовок: Sergy пишет: во все..


Sergy пишет:

 цитата:
во всей программе ?


Нет. Где вылетает !
Так проще будет тебе понять.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 232
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 12:06. Заголовок: Блин, нафига тогда н..


Блин, нафига тогда нужен NETERR() ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 20
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 26.08.13 12:29. Заголовок: Допустимость и успешность USE EXCLUSIVE - можно и нужно проверять


USE (local_dir+IPRICEV) ... EXCLUSIVE NEW

1) перед USE - можно проверить на возможность EXCLUSIVE
if enable_excl(local_dir+IPRICEV)// функцию легко создать
use
endif
А еще лучше - переопределить команду USE под свою задачу , примеров много есть
2) Явное указание ALIAS xxx - лучше неявного
3) После USE - также проверить - состоялся ли USE .. alias xxxx
if select(xxx)>0
endif
4)NETERR() - ловит не все проблемы открытия таблицы


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 233
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 12:33. Заголовок: petr707 пишет: А ещ..


petr707 пишет:

 цитата:
А еще лучше - переопределить команду USE под свою задачу , примеров много есть



Можно тут по-подробнее плиз ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 911
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.08.13 12:46. Заголовок: Sergy , попробуй зад..


Sergy ,
попробуй задать alias отличный от имени переменной IPRICEV. К примеру, IPV
Что будет?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 21
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 26.08.13 14:17. Заголовок: Команда USE - иллюстрация


Смотрим \include\std.ch
и переделываем функцию в описании команды на свою, подключаем к проекту свой redefine.ch
если добавите в самом переопределении к обслуживанию USE служебные нагрузки( Public масссивы, переменные, статусы таблиц и прочее)
то же нужно сделать и с командами CLOSE и т.д.

ниже - только иллюстрация возможности - замена функции DBUSEAREA на NETUSE
Внутри NETUSE конечно также есть DbUSEAREA, только еще дополнительная сервисная обертка
для обработки ошибок,разнесения блокировок, логирования и прочее..
Этот вариант - когда нет задачи менять PRG-код и можно достичь цели переопределением команд
включением еще одного include redefine.ch
Обертка может быть и в PRG-коде, но тогда - нужно переписывать все вызовы в PRG-коде.
=====\include\std.ch=========

#command USE <(db)> [VIA <rdd>] [ALIAS <a>] [<nw: NEW>] ;
[<ex: EXCLUSIVE>] [<sh: SHARED>] [<ro: READONLY>] ;
[CODEPAGE <cp>] [INDEX <(index1)> [, <(indexN)>]] => ;
dbUseArea( <.nw.>, <rdd>, <(db)>, <(a)>, ;
if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.> [, <cp>] ) ;
[; dbSetIndex( <(index1)> )] ;
[; dbSetIndex( <(indexN)> )]

========== redefine.ch=============

#command USE <(db)> ;
[VIA <rdd>] ;
[ALIAS <a>] ;
[<new: NEW>] ;
[<ex: EXCLUSIVE>] ;
[<sh: SHARED>] ;
[<ro: READONLY>] ;
;
=>if !netuse ( ;
<(db)>, <(a)>,if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), ;
<.new.>,<.ro.> ;
,5,1," Неудачная попытка открытия таблицы. Повторить? " ;
); ;
quit ;;
endif


Спасибо: 1 
ПрофильЦитата Ответить
Администратор




Пост N: 2956
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 14:21. Заголовок: Вопрос же простой, к..


Вопрос же простой, как 5 копеек. Все описано в ng по клипперу.

Sergy пишет:

 цитата:
Блин, нафига тогда нужен NETERR() ?



Используется в 2-х случаях. Для append пропустим, это не наш случай.
Для use не генерируется исключение, когда файл не открыт по причине того, что он либо уже открыт монопольно другим процессом, либо при попытке открыть его монопольно, когда он уже открыт другим процессом в режиме разделения. Вместо этого устанавливается значение для neterr()

Команда
use ... index ...
Это не одна команда, а две или более: открытие файла, и затем открытие одного или более индексов для уже открытого файла. Причем успешность открытия индекса зависит от успешности выполнения use.
Такую команду можно использовать, если есть гарантированная уверенность в успешности открытия файла.
Если такой уверенности нет, то надо использовать проверку neterr. Прямо как в примере из ng:

USE Customer SHARED NEW
IF !NETERR()
SET INDEX TO CustNum, CustOrders, CustZip
ELSE
? "Файл уже используется другим пользователем"
ENDIF

Мораль сей басни такова: если файл может открываться разными процессами, то открывать его надо всегда только в режиме shared. и уж никак не exclusive.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3465
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.13 14:30. Заголовок: Pasha пишет: Мораль..


Pasha пишет:

 цитата:
Мораль сей басни такова: если файл может открываться разными процессами, то открывать его надо всегда только в режиме shared. и уж никак не exclusive.


+1

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 234
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 16:18. Заголовок: Pasha пишет: Мораль..


Pasha пишет:

 цитата:
Мораль сей басни такова: если файл может открываться разными процессами, то открывать его надо всегда только в режиме shared. и уж никак не exclusive.



Вы меня совсем уж за придурка не держите плиз. больше 15 лет разработки и поддержания именно этой задачи. В сети сидят одновременно 20-30 юзеров, которые работали на Clipper задаче. Но медленно.

В EXCLUSIVE открывается локальный файл со справочником, который редко меняется (имена, цены, контрагенты). Целиком берется и целиком сливается с сервера в локальную папку.
Дальше строится локальный индекс и открывается в ESXCLUSIVE.

Первый пример (с mail.dbf) - способ открытия по умолчанию, т.е. SHARED (тк в самом начале программы установка SET EXCLUSIVE OFF).
Второй - аналогичная ситуация, но файл - локальный и открывается монопольно. И не может быть открыт никаким другим процессом. Это временная таблица, которая будет стерта при выходе.

Поэтому вопрос пока открыт: почему с переходом на Harbour стали возникать ошибки такого рода:

Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD




Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 235
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 16:22. Заголовок: PSP пишет: попробуй..


PSP пишет:

 цитата:
попробуй задать alias отличный от имени переменной IPRICEV. К примеру, IPV
Что будет?



сделал по другому - убрал нахрен переменную IPRICEV и тупо вписал:

USE (local_dir+"ipricev") INDEX (local_dir+"ipricev") EXCLUSIVE NEW

посмотрим, что будет. Пока с вероятностью 50/50 возникает ошибка. :(

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3468
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.13 16:25. Заголовок: Sergy пишет: USE (l..


Sergy пишет:

 цитата:
USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) EXCLUSIVE NEW


Попробуй жестко указывать ALIAS , что то было у меня похожее

ЗЫ
USE (local_dir+IPRICEV) INDEX (local_dir+IPRICEV) ALIAS TEMPBASE EXCLUSIVE NEW

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 236
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 16:35. Заголовок: http://www.hmgforum...


http://www.hmgforum.com/viewtopic.php?f=5&t=2169

Походу существует какая-то фигня, из-за которой Harbour не ждет и не пытается повторить несколько раз (как Clipper ?) попытку открыть таблицу и индекс...
Т.е. попытался один раз - сразу ставим юзера в известность...

каким только вот образом ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2957
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 17:39. Заголовок: Sergy пишет: Возник..


Sergy пишет:

 цитата:
Возникает ошибка:

Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD

Вызов из ORDLISTADD(0)
Вызов из DBSETINDEX(0)
Вызов из OPENMAIL(81)
...

Судя по ошибке, dbf открылся, а ntx - нет.



Поясняю второй раз. Ошибка возникла при открытии индекса, вызов из dbSetIndex/OrdListAdd. Код ошибки 2001 - это EDBCMD_NOTABLE, т.е вызов из неоткрытой рабочей области. Это означает, что предыдущая команда use была неудачной.
Чтобы было понятнее, вот исходник OrdListAdd из сырцов харбора:

HB_FUNC( ORDLISTADD )
{
AREAP pArea = ( AREAP ) hb_rddGetCurrentWorkAreaPointer();
// текущая рабочая область

if( pArea )
// Проверка, открыта ли рабочая область
{
// Открытие индекса
...
}
else
// не открыта, возникает ошибка 2001, здесь и только здесь
hb_errRT_DBCMD( EG_NOTABLE, EDBCMD_NOTABLE, NULL, HB_ERR_FUNCNAME );
}



 цитата:
Вы меня совсем уж за придурка не держите плиз. больше 15 лет разработки и поддержания именно этой задачи. В сети сидят одновременно 20-30 юзеров работали на Clipper задаче. Но медленно.

В EXCLUSIVE открывается локальный файл со справочником, который редко меняется (имена, цены, контрагенты). Целиком берется и целиком сливается.
Дальше строится локальный индекс и открывается в ESXCLUSIVE.

Первый пример (с mail.dbf) - способ открытия по умолчанию, т.е. SHARED (тк в самом начале программы установка SET EXCLUSIVE OFF).
Второй - аналогичная ситуация, но файл - локальный и открывается монопольно. И не может быть открыт никаким другим процессом. Это временная таблица, которая будет стерта при выходе.

Поэтому вопрос пока открыт: почему с переходом на Harbour стали возникать ошибки такого рода:

Ошибка DBCMD/2001 Файл не открыт: ORDLISTADD



Что мешает вам вставить проверку на neterr после выполнения use ? Сразу все станет на свои места. По вашему коду не видно, в каком режиме открывается mail.dbf.
Если не устанавливалось никакого нестандартного обработчика ошибок, то что клиппер, что харбор не будет генерировать исключение только в том случае, когда файл не открыт из-за ошибки доступа к нему.
Насчет второго примера, когда открывается локальный файл в режиме exclusive. Возможно, на этом компьютере была запущена вторая копия программы, которая попытается открыть этот файл также монопольно, и возникнет та же ошибка.
Я же ваш код не вижу, могу только сказать по логу ошибки, по какой причине она возникла. Третий раз повторять надо или ограничимся ?

В теме по ссылке на hmgforum ясно видно, что файл открывается монопольно. И что непонятно ? Что хотели, то и получили. Файл уже открыт другой задачей, и не может быть открыт монопольно.
А что это за фантазии насчет того, что клиппер пытается несколько раз открывать файл ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 22
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 26.08.13 17:41. Заголовок: EXCLUSIVE


Цитата: И не может быть открыт никаким другим процессом
Этого (знать наверняка и) утверждать никак невозможно.
Есть , например, Google Desktop, который при своей работе может занимать монопольно файлы DBF, NTX и прочие и легко
может завалить задачу. Да и зависшие блокировки от операционки бывают да мало ли чего.
В терминальном режиме можно потерять сеанс задачи, который будет жить на таблицах самостоятельно.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 237
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 17:53. Заголовок: Pasha пишет: Что ме..


Pasha пишет:

 цитата:
Что мешает вам вставить проверку на neterr после выполнения use ?



Вот лог ошибки:

Скрытый текст


Вот код, который работает в данном случае:

Скрытый текст


Получается, что в рабочей области N6 уже открыт dbf, но не открыт индекс...


 цитата:
// не открыта, возникает ошибка 2001, здесь и только здесь


Мда... нужно будет всерьез задуматься...

Тогда каковы причины не открытия *.dbf ? Ведь он окрывается в 9 случаях из 10 нормально. И юзеры рядом работают...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 238
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 17:56. Заголовок: Pasha пишет: Возмож..


Pasha пишет:

 цитата:
Возможно, на этом компьютере была запущена вторая копия программы,


Это тоже полностью исключено.
Открывается в монопольном режиме mem файл с сохраненными переменными.
Вторая копия за 15 лет ни разу еще не смогла начать работать в таком режиме.
Выдается сообщение пользователю и привет.


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


Х.е. знает - посмотрел по тому примеру, дядька советует вьетнамцу попытаться несколько сек. подождать.
Clipper ведь ни разу на этом месте не спотыкался. Вот и подумал...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3469
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.13 18:00. Заголовок: Sergy пишет: USE (l..


Sergy пишет:

 цитата:
USE (local_dir+"ipricev") INDEX (local_dir+"ipricev") EXCLUSIVE NEW


После того как поюзал эту базу локально , ты ее закрываешь ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2958
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 18:04. Заголовок: В этом фрагменте код..


В этом фрагменте кода ошибки нет. Но неизвестно, что в остальном коде. Возможно, файл ipricev уже был открыт в момент выдачи команды use в строке 734

Сделайте тест:
use ipricev EXCLUSIVE NEW
? Alias(), NetErr()
use ipricev EXCLUSIVE NEW
? Alias(), NetErr()

Результат будет ожидаем:
IPRICEV .T.
.F.

Если к команде use добавить еще опцию index, то как раз получим желаемый результат: попытка открытия индекса в неоткрытой р.о, и ошибка 2001


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 239
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 18:09. Заголовок: Dima пишет: После т..


Dima пишет:

 цитата:
После того как поюзал эту базу локально , ты ее закрываешь ?



Разумеется.
На выходе из каждой процедуры формирования отчета идет CloseAll(), по сути обертка для CLOSE ALL и нескольких внутренних обработок.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 240
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 18:10. Заголовок: Pasha пишет: В этом..


Pasha пишет:

 цитата:
В этом фрагменте кода ошибки нет. Но неизвестно, что в остальном коде. Возможно, файл ipricev уже был открыт в момент выдачи команды use в строке 734

Сделайте тест:
use ipricev EXCLUSIVE NEW
? Alias(), NetErr()
use ipricev EXCLUSIVE NEW
? Alias(), NetErr()

Результат будет ожидаем:
IPRICEV .T.
.F.

Если к команде use добавить еще опцию index, то как раз получим желаемый результат: попытка открытия индекса в неоткрытой р.о, и ошибка 2001



Проблема в том, что на компе с Harbour (где база локальна) я вообще ни разу не смог получить подобные ошибки.

Они возникают только в сети после перехода на Harbour. И то через раз - то есть, то нет...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2959
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 18:21. Заголовок: Sergy пишет: Тогда ..


Sergy пишет:

 цитата:
Тогда каковы причины не открытия *.dbf ? Ведь он окрывается в 9 случаях из 10 нормально. И юзеры рядом работают...



Наиболее вероятную причину я назвал.

Из текста errorsys видно:

// Set NetErr() of there was a database open error
IF oError:genCode == EG_OPEN .AND. ;
oError:osCode == 32 .AND. ;
oError:canDefault
NetErr( .T. )
RETURN .F.
ENDIF

что NetErr( .T. ) устанавливается при ошибке открытия по команде use, когда oError:osCode == 32
32 - это Sharing violation
Что такое Sharing violation думаю обьяснять не надо

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 239
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.08.13 18:25. Заголовок: Sergy Еще с Clipper ..


Sergy
Еще с Clipper делаю примерно так:
 
bOldError := ErrorBlock( { |e|break( e ) } )
BEGIN SEQUENCE
dbUseArea( .F., cRdd, cDbf, cAls, lSha )
IF ! Used()
DO WHILE s-- >= 0
dbUseArea( .F., cRdd, cDbf, cAls, lSha )
IF Used(); EXIT
ENDIF
hb_IdleSleep(0.1)
ENDDO
ENDIF
RECOVER USING oError
lRet := .F.
END SEQUENCE
ErrorBlock( bOldError )

практика использования clipper, hb показала, даже на локальной базе, при больших расчетах, простое use не открывает файл handle нет - на это может влиять антивирус (особенно Касперский - это наш опыт). use в цикле - решение проблеммы

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник


Пост N: 912
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.08.13 18:28. Заголовок: Да, кстати антивирус..


Да, кстати, антивирус - реальная причина.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3471
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.08.13 18:31. Заголовок: SergKis пишет: особ..


SergKis пишет:

 цитата:
особенно Касперский - это наш опыт


а у меня (вернее у моего клиента) тоже делал NOD32 , сканировал и лочил DBF базы

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2960
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 18:37. Заголовок: В конце концов, пове..


В конце концов, поведение совеременных ОС при открытии файла в ntvdm b в реальном режиме действительно может быть различным. Я встречался с случаями, когда серверные ОС ведут себя неадекватно: файл вроде бы уже создан, а открыть его нельзя. Могут гадить и аетивирусы.
И харбор тут ни при чем, и средствами харбора этот вопрос не решить.
А решить его можно простыми приемами:
Если используется локально временный файл, то создавать его именно как временный, и тогда его можно открывать монопольно.
Во всех остальных случаях открывать файл как shared, особенно если он располагается на сетевых ресурсах
Ну и вместо последовательности:

use ... index ... new

использовать

use ...
if ! neterr()
set index to ...


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 240
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.08.13 18:42. Заголовок: Pasha +1 то что use ..


Pasha
+1
то что use м set index надо разделить во времени - однозначно

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 241
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.08.13 18:47. Заголовок: Мысли разумные и дал..


Pasha пишет:

 цитата:
Если используется локально временный файл, то создавать его именно как временный, и тогда его можно открывать монопольно


Именно так и сделано. Локальные - монопольно, удаленные - shared.

В остальном - мысли разумные и дали пищу для размышлений, спасибо.

Поковырялся у себя в errorsys.ch, вот что обнаружил:

Скрытый текст


Откуда это могло у меня взяться - ума не приложу. То-ли это что-то из базовой поставки Clipper еще с 5.01, то-ли где-то нарыл, возможно с этого форума.
У меня просто дописано сохранение сообщений, стека вызовов, открытых алиасов в report.log с последуюущим скидыванием его на сервер, чтобы можно было понять, что происходит у клиентов.
Поэтому этот файл еще жив.

Вопрос: что из этого лишнее и чего (возможно) не хватает ?
там есть некий e:tries - может быть использовать его ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2956
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.08.13 19:14. Заголовок: Sergy пишет: Вопрос..


Sergy пишет:

 цитата:
Вопрос: что из этого лишнее и чего (возможно) не хватает ?


Выкинуть его нафиг и взять из поставки Харбора.
Я писал вам, да и все тоже это скажут: Харбор более требователен к синтаксису ! Что есть очень хорошо.
Харбор не отвечает за старые ошибки Клипера, он более СТАБИЛЬНЕЙ по работе в сети и локально.
НЕ ТАЩИТЕ весь функционал который был на клипере, переделывайте узкие места:
открытие/закрытие/блокировки баз !!!
Я тоже сначала натыкался на это и злился...
После переделок, со временем все становиться прозрачно и понятно !

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2961
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.08.13 19:17. Заголовок: Sergy пишет: IF (e..


Sergy пишет:

 цитата:
IF (e:SubSystem == 'DBFNTX') .AND. ; // специфика dbfntx & Win2K based servers
(e:SubCode == 1035) .AND. ;
(e:tries < 25)
RETURN (.T.)
ENDI



могу только сказать, что 1035 - это LOCKTIMEOUT

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 242
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 27.08.13 10:01. Заголовок: Сделал вот так: #..


Сделал вот так:

Скрытый текст


Получил одно вот такое сообщение:
27.08.2013 09:45:46 NetUse(caroute) tried to open 1 times and OK

и несколько вот таких:

Ошибка DBFNTX/1201 Файл не индексирован

Вызов из DBSEEK(0)
Вызов из GETNOMINALPRICE(322)
Вызов из LOADDATA(148)
...

Ошибка DBFNTX/1201 Файл не индексирован

Вызов из DBSEEK(0)
Вызов из DBVIEW(4752)
Вызов из CARMANAGER(515)
...

Совершенно точно вчера/позавчера и под Clipper этот код работал.
В NetSetIndex() поставил проверку успешности открытия индекса ( res:=DBSETINDEX() ), но почему-то она не сработала ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 387
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 27.08.13 12:48. Заголовок: Из моего опыта перех..


Из моего опыта перехода с Clipper на Харбор (это было уже давно- несколько лет назад).
Пришлось в местах сохранения данных дописать везде Commit. Clipper и так нормально сохранял .А Харбор без этой команды, по- видимому используя буфер Windows, сбрасывал мусор в базы.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 388
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 27.08.13 12:49. Заголовок: От DBFNTX отказался..


От DBFNTX отказался, сразу переделывал под cdx

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3476
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.08.13 16:57. Заголовок: Sergy я что то проп..


Sergy
я что то пропустил а антивирус стоит ? в исключениях числятся у него папки с базами и прогой ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 243
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 27.08.13 16:59. Заголовок: Нашел в коде еще нес..


Нашел в коде еще несколько прямых вызовов DBUSEAREA() и DBSETNDEX() - заменил их на свои NetUse() и NetSetIndex().

Пока конечно рано говорить, но ситуация по ходу стабилизировалась - нет непонятных сообщений о неоткрытых областях, отсутствии индексации и тп...
Одна машина пока прислала несколько отчетов о том, что с первого раза не удалось открыть таблицу.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 244
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 27.08.13 17:01. Заголовок: Dima пишет: я что т..


Dima пишет:

 цитата:
я что то пропустил а антивирус стоит ? в исключениях числятся у него папки с базами и прогой ?


Стоит официальный лицензионный NOD32 - на сервере серверная версия, у клиентов - клиентские. Разумеется на сервере *.dbf и *.ntx стоят в исключениях.
Программу в исключения не ставил никогда - проблем особых не было. Ну проверит один раз при запуске - делов-то... Все-таки EXE - он может быть заражен при определенном стечении обстоятельств...
На рабочих машинах - 100% гарантии нет, но админ сети вроде в курсе. Кстати будет повод проверить...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 242
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.08.13 17:29. Заголовок: Sergy пишет:res:=DBS..


Sergy пишет:
 цитата:
res:=DBSETINDEX(cName)
IF res; EXIT; ENDIF


Clipper ng говорит dbSetIndex() return NIL, в hb dbSetIndex() это вызов hb_func( ORDLISTADD ) и там возвраты разные и написано:
/* Clipper clears NETERR flag when index is open */
hb_rddSetNetErr( HB_FALSE );
может лучше из SET INDEX ... функции в команде использовать, ? OrdCount() даст кол-во подключенных index\tag


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2962
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.08.13 17:37. Заголовок: Sergy пишет: Получи..


Sergy пишет:

 цитата:
Получил одно вот такое сообщение:
27.08.2013 09:45:46 NetUse(caroute) tried to open 1 times and OK



Это говорит о том, что менее чем на секунду файл все-таки был открыт каким-то процессом. А вот каким - в этом мы вряд ли поможем. Возможные предположения уже высказаны.
Хорошо бы еще в лог писать режим открытия - lShared


 цитата:
и несколько вот таких:

Ошибка DBFNTX/1201 Файл не индексирован

В NetSetIndex() поставил проверку успешности открытия индекса ( res:=DBSETINDEX() ), но почему-то она не сработала ?




Если dbSetIndex вернул .t. - значит, индекс был открыт успешно, и никак не иначе. А причина ошибки 1201 может быть другой: индекс был закрыт, был
вызов set order to 0, или set order на несуществующий индекс, или где-то ошибка в имени индекса, в результате чего текущий индекс оказался не установлен.
Сергей, только не говорите, что такого не может быть, иначе мы ничем не сможем помочь. Пересмотрите еще раз свой код, вставьте дополнительные логи в конце концов.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2963
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 27.08.13 17:47. Заголовок: SergKis пишет: Clip..


SergKis пишет:

 цитата:
Clipper ng говорит dbSetIndex() return NIL, в hb dbSetIndex() это вызов hb_func( ORDLISTADD ) и там возвраты разные и написано:
/* Clipper clears NETERR flag when index is open */
hb_rddSetNetErr( HB_FALSE );
может лучше из SET INDEX ... функции в команде использовать, ? OrdCount() даст кол-во подключенных index\tag



Да, правильно, успешность открытия индекса лучше проверять чем нибудь вроде:
IndexOrd() # 0
! Empty(IndexKey())
! Empty(ordName())

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3477
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.08.13 17:52. Заголовок: Sergy Где то есть а..


Sergy
Где то есть аналогичная тема от AndreyZh тоже переходил человек с Clipper и тоже были не увязки и споры.
Сегодня у него кажется все нормально так что даже редко тут появляется ;)

PS
А лагов в сети нет ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 245
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 27.08.13 18:11. Заголовок: Pasha пишет: Сергей..


Pasha пишет:

 цитата:
Сергей, только не говорите, что такого не может быть


Хорошо, не буду.

Dima пишет:

 цитата:
А лагов в сети нет ?


Что имеется в виду и как это выяснить ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3478
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.08.13 19:48. Заголовок: Sergy На "пробл..


Sergy
На "проблемных" станциях как вариант дай команду
ping ipсервера -n 100 -l 1400
и посмотри результат

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник


Пост N: 915
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 27.08.13 19:50. Заголовок: Сеть лучше утилитой ..


Сеть лучше утилитой iperf проверить в режиме трансляции udp-пакетов.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 246
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 27.08.13 21:53. Заголовок: SergKis пишет: Clip..


SergKis пишет:

 цитата:
Clipper ng говорит dbSetIndex() return NIL, в hb dbSetIndex() это вызов hb_func( ORDLISTADD ) и там возвраты разные и написано:
/* Clipper clears NETERR flag when index is open */
hb_rddSetNetErr( HB_FALSE );
может лучше из SET INDEX ... функции в команде использовать, ? OrdCount() даст кол-во подключенных index\tag



Почитал Changelog.txt:


 цитата:
* changed ordListAdd()/dbSetIndex() - now they return logical value with information about success



Пока остановился на этом варианте.
Несколько предыдущих ошибок "Файл не индексирован" выскочили из-за того, что в паре-тройке мест остались прямые вызовы DBUSEAREA/DBSETINDEX вместо замененных мною USE ... INDEX ...

upd: Поймал наконец-то и такие ошибки:

27.08.2013 14:37:33 NetSetIndex(system) tried to open 1 times and OK
27.08.2013 14:47:22 NetSetIndex(F:\WORK\DATA\carjob2.ntx) tried to open 1 times and OK

Что самое странное - программа запускается на сервере и управляется через RDP - т.е. диск с базой у нее вообще локальный, а не по сети.

И проверил, что Харборовский DBSETINDEX() возвращает корректный результат для обработки в NetSetIndex()
... продолжаю наблюдения.

Спасибо коллективному разуму.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 243
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.08.13 10:50. Заголовок: Sergy пишет:Почитал ..


Sergy пишет:
 цитата:
Почитал Changelog.txt


первоисточник SRC hb 3.2
 
HB_FUNC( ORDLISTADD )
{
...
if( ! HB_ISNIL( 1 ) )
hb_errRT_DBCMD( EG_ARG, EDBCMD_ORDLSTADD_BADPARAMETER, NULL, HB_ERR_FUNCNAME );
return; !!!!!!!!!!
}
...
if( ! pOrderInfo.itmResult || HB_IS_NIL( pOrderInfo.itmResult ) )
hb_retl( errCode == HB_SUCCESS ); !!!!
...

FUNCTION dbSetIndex( cIndexName )
RETURN ordListAdd( cIndexName )


Sergy пишет:
 цитата:
Что самое странное - программа запускается на сервере и управляется через RDP - т.е. диск с базой у нее вообще локальный, а не по сети


SergKis пишет:
 цитата:
использования clipper, hb показала, даже на локальной базе ...


причем полгода может работать, а потом кердык - начнет елозить. Разбор полетов покажет как правило анти\вирус обновили, заменили ...

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 247
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 29.08.13 23:44. Заголовок: Мужчины, огромная Ва..


Мужчины, огромная вам всем благодарность за помощь и поддержку!

Третий день программа работает практически как часы на ежедневной нагрузке. И как работает - летает, как ласточка, все юзеры довольны. Ничего того, что-бы меня удивило в ее поведении - нет. А ведь неделей раньше рвал волосы во всех местах и уже подумывал - бросить все нак*й и вернуться на Clipper.

Кое-где выплывают косяки моего программирования, которых не замечал наш старый добрый 5.2e. Потихоньку накапливаются сообщения о том, что таблица/индекс не открылись с первого раза. Пытаюсь понять логику - информации мало, но похоже, что они возникают на "сверхбыстрых" машинах на локальных ресурсах. Например, "разгруженном" от юзеров терминальном сервере (рано утром или поздно вечером).

Благодаря Вашим наработкам в этой ветке, научил программу "пипикать" wave-файлами из ресурсов, блокировать крестик, менять заголовок Windows-окошка. Так классно!

Спасибо еще раз!
На этом не прощаюсь - искренне надеюсь, еще будут интересные вопросы и обсуждения.


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2969
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.08.13 16:26. Заголовок: Запускаю свою харбор..


Запускаю свою харбор-программу, которая открывает файлы через dbfcdx - shared. Запускаю dosbox, а в нем - программу, которая открывает dbf-файл монопольно (свой старый dbview под ms dos). Файл не должен открываться, но он открывается.
Если попытаться открыть этот файл монопольно win32-программой, то попытка будет неуспешной, как и должно быть. Выходит, что открытие файлов под ntvdm/dosbox происходит не по правилам.
Вот поэтому старая клиппер-программа и всегда открывала файлы, которые не должна была открывать, в отличие от харбор-программы, которая ведет себя, как ей и положено.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3494
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.08.13 16:55. Заголовок: Pasha пишет: Запуск..


Pasha пишет:

 цитата:
Запускаю свою харбор-программу, которая открывает файлы через dbfcdx - shared. Запускаю dosbox, а в нем - программу, которая открывает dbf-файл монопольно (свой старый dbview под ms dos). Файл не должен открываться, но он открывается.


Попробовал повторить (без DOSBOX разумеется). Файл не открылся.

Первой запустил Harbour прогу
 
proc main
use test shared new
browse()
return


Вторая на Clipper
 
use test exclusive new
browse() // бровса я не увидел и прога сразу завершила свою работу


ЗЫ
неисповедимы пути господни NTVDM


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 266
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 06.09.13 21:41. Заголовок: Возникло подозрение,..


Возникло подозрение, что сохранение длинной CHAR переменной в поле таблицы "портит" символы "нижней" части ASCII с кодом, меньшим CHR(32).

Чтобы проверить это, хочу попробовать USE (cTable) CODEPAGE (...)

Подскажите плиз, какую страницу нужно указать, чтобы полностью отказаться от перекодировки ?
Нужен какой-нить "NULL" или "WESTERN EUROPE".
Какие они вообще бывают, кроме "RU866" и "RU1251" - попробую методом перебора...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 119
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 07.09.13 10:07. Заголовок: HB_FUNC_EXTERN( HB_C..


HB_FUNC_EXTERN( HB_CODEPAGE_BG866 );
HB_FUNC_EXTERN( HB_CODEPAGE_BGISO );
HB_FUNC_EXTERN( HB_CODEPAGE_BGMIK );
HB_FUNC_EXTERN( HB_CODEPAGE_BGWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_CS852 );
HB_FUNC_EXTERN( HB_CODEPAGE_CS852C );
HB_FUNC_EXTERN( HB_CODEPAGE_CSISO );
HB_FUNC_EXTERN( HB_CODEPAGE_CSKAMC );
HB_FUNC_EXTERN( HB_CODEPAGE_CSWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_DE850 );
HB_FUNC_EXTERN( HB_CODEPAGE_DE850M );
HB_FUNC_EXTERN( HB_CODEPAGE_DEISO );
HB_FUNC_EXTERN( HB_CODEPAGE_DEWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_DK865 );
HB_FUNC_EXTERN( HB_CODEPAGE_EL437 );
HB_FUNC_EXTERN( HB_CODEPAGE_EL737 );
HB_FUNC_EXTERN( HB_CODEPAGE_ELISO );
HB_FUNC_EXTERN( HB_CODEPAGE_ELWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_EN );
HB_FUNC_EXTERN( HB_CODEPAGE_ES850 );
HB_FUNC_EXTERN( HB_CODEPAGE_ES850C );
HB_FUNC_EXTERN( HB_CODEPAGE_ES850M );
HB_FUNC_EXTERN( HB_CODEPAGE_ESISO );
HB_FUNC_EXTERN( HB_CODEPAGE_ESMWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_ESWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_FI850 );
HB_FUNC_EXTERN( HB_CODEPAGE_FR850 );
HB_FUNC_EXTERN( HB_CODEPAGE_FR850M );
HB_FUNC_EXTERN( HB_CODEPAGE_FRISO );
HB_FUNC_EXTERN( HB_CODEPAGE_FRWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_HR646 );
HB_FUNC_EXTERN( HB_CODEPAGE_HR852 );
HB_FUNC_EXTERN( HB_CODEPAGE_HRISO );
HB_FUNC_EXTERN( HB_CODEPAGE_HRWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_HU852 );
HB_FUNC_EXTERN( HB_CODEPAGE_HU852C );
HB_FUNC_EXTERN( HB_CODEPAGE_HUISO );
HB_FUNC_EXTERN( HB_CODEPAGE_HUWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_IS850 );
HB_FUNC_EXTERN( HB_CODEPAGE_IS861 );
HB_FUNC_EXTERN( HB_CODEPAGE_IT437 );
HB_FUNC_EXTERN( HB_CODEPAGE_IT850 );
HB_FUNC_EXTERN( HB_CODEPAGE_IT850M );
HB_FUNC_EXTERN( HB_CODEPAGE_ITISB );
HB_FUNC_EXTERN( HB_CODEPAGE_ITISO );
HB_FUNC_EXTERN( HB_CODEPAGE_ITWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_LT775 );
HB_FUNC_EXTERN( HB_CODEPAGE_LTWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_NL850 );
HB_FUNC_EXTERN( HB_CODEPAGE_NL850M );
HB_FUNC_EXTERN( HB_CODEPAGE_NO865 );
HB_FUNC_EXTERN( HB_CODEPAGE_PL852 );
HB_FUNC_EXTERN( HB_CODEPAGE_PLISO );
HB_FUNC_EXTERN( HB_CODEPAGE_PLMAZ );
HB_FUNC_EXTERN( HB_CODEPAGE_PLWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_PT850 );
HB_FUNC_EXTERN( HB_CODEPAGE_PT860 );
HB_FUNC_EXTERN( HB_CODEPAGE_PTISO );
HB_FUNC_EXTERN( HB_CODEPAGE_RO852 );
HB_FUNC_EXTERN( HB_CODEPAGE_ROISO );
HB_FUNC_EXTERN( HB_CODEPAGE_ROWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_RU1251 );
HB_FUNC_EXTERN( HB_CODEPAGE_RU866 );
HB_FUNC_EXTERN( HB_CODEPAGE_RUISO );
HB_FUNC_EXTERN( HB_CODEPAGE_RUKOI8 );
HB_FUNC_EXTERN( HB_CODEPAGE_SK852 );
HB_FUNC_EXTERN( HB_CODEPAGE_SK852C );
HB_FUNC_EXTERN( HB_CODEPAGE_SKISO );
HB_FUNC_EXTERN( HB_CODEPAGE_SKKAMC );
HB_FUNC_EXTERN( HB_CODEPAGE_SKWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_SL646 );
HB_FUNC_EXTERN( HB_CODEPAGE_SL852 );
HB_FUNC_EXTERN( HB_CODEPAGE_SLISO );
HB_FUNC_EXTERN( HB_CODEPAGE_SLWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_SR646 );
HB_FUNC_EXTERN( HB_CODEPAGE_SR646C );
HB_FUNC_EXTERN( HB_CODEPAGE_SRWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_SV437C );
HB_FUNC_EXTERN( HB_CODEPAGE_SV850 );
HB_FUNC_EXTERN( HB_CODEPAGE_SV850M );
HB_FUNC_EXTERN( HB_CODEPAGE_SVISO );
HB_FUNC_EXTERN( HB_CODEPAGE_SVWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_TR857 );
HB_FUNC_EXTERN( HB_CODEPAGE_TRISO );
HB_FUNC_EXTERN( HB_CODEPAGE_TRWIN );
HB_FUNC_EXTERN( HB_CODEPAGE_UA1125 );
HB_FUNC_EXTERN( HB_CODEPAGE_UA1251 );
HB_FUNC_EXTERN( HB_CODEPAGE_UA866 );
HB_FUNC_EXTERN( HB_CODEPAGE_UAKOI8 );


Спасибо: 1 
ПрофильЦитата Ответить
Администратор




Пост N: 2974
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.09.13 22:08. Заголовок: Sergy пишет: Подска..


Sergy пишет:

 цитата:
Подскажите плиз, какую страницу нужно указать, чтобы полностью отказаться от перекодировки ?



Перекодировка не выполняется, если кодовая страница программы совпадает с кодовой страницей, указанной в команде use. Если в use не указана codepage, то она будет такой же, что в hb_cdpSelect, и перекодировки также не будет.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 267
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 08.09.13 22:11. Заголовок: Pasha пишет: Переко..


Pasha пишет:

 цитата:
Перекодировка не выполняется, если кодовая страница программы совпадает с кодовой страницей, указанной в команде use. Если в use не указана codepage, то она будет такой же, что в hb_cdpSelect, и перекодировки также не будет.


А может быть какая-нибудь петрушка с SAVESCREEN / RESTSCREEN ?

В одном месте программы, среди кучи однотипных вызовов: сохранение экрана - диалог - восстановление наблюдаю такой глюк: символы CHR(16) заменяются на "?" и соотв. выводятся назад уже не в виде треугольников, а в виде знаков вопроса.

Сначала думал на запись в файл (экраны складываются локально, чтобы не тратить память Clipper). Поигрался с CODEPAGE, потом переделал на сохранение в memvar-переменных - тоже самое.

Косяк совершенно незначительный, но бесит... Не люблю я эту неопределенность...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3536
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 08.09.13 22:42. Заголовок: Sergy пишет: символ..


Sergy пишет:

 цитата:
символы CHR(16) заменяются на "?" и соотв. выводятся назад уже не в виде треугольников, а в виде знаков вопроса.


Простой и понятный исходник сюда. У себя такого не наблюдал.

PS
GTWVT

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2975
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.09.13 23:01. Заголовок: Sergy пишет: А може..


Sergy пишет:

 цитата:
А может быть какая-нибудь петрушка с SAVESCREEN / RESTSCREEN ?



Совершенно непонятно, в чем заключается ваша проблема. Разве трудно сделать простейшие тесты, чтобы проверить, как работает кодовая страница в rdd, вроде такого:

REQUEST HB_CODEPAGE_RU866
hb_cdpSelect( "RU866" )
dbCreate('aa', {{'CC','C',1,0}},, .t., 'aa',, 'RU866')
for i := 0 to 255
aa->(dbAppend())
aa->CC := Chr(i)
next

и посмотреть на выходной файл ?
Да и протестировать savescreen/restscreen ?

@ 0,0 say chr(16)
cc := SaveScreen(0,0,0,0)
RestScreen(0,2,0,2,cc)


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 35
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 09.09.13 06:49. Заголовок: chr(16) - треугольник, это из Dos(Clipper)


Нет никакой перекодировки и треугольника уже нет
Просто в используемом Вами шрифте на этом месте другое изображение.
Есть стандартноая утилита Windows TableMap ( Пуск\Все программы\Служебные\Таблица символов)
Если треугольник сильно нужен, можно создать свой шрифт.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 268
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 09.09.13 09:36. Заголовок: Все эти выкладки кон..


Все эти выкладки конечно здорово, но факт остается фактом... :(

По поводу шрифта - тестировал Lucida Console. Эффект повторяется 1:1. 900 вызовов проходят нормально, а один - корявится. Поэтому пока не могу создать тест...

Такая вот петрушка.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2976
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 09.09.13 10:00. Заголовок: Так огласите наконец..


Так огласите наконец-то, что за факт. Все телепаты в отпуске. Сначала вы говорили что-то перекодировку в use, потом про savescreen. Трудно отвечать на незаданный вопрос, а разгадывать шарады не хочется.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 269
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 09.09.13 10:11. Заголовок: Pasha пишет: Так ог..


Pasha пишет:

 цитата:
Так огласите наконец-то, что за факт. Все телепаты в отпуске. Сначала вы говорили что-то перекодировку в use, потом про savescreen. Трудно отвечать на незаданный вопрос, а разгадывать шарады не хочется.



Есть функция SaveConsole(), которая делает SAVESCREEN и кладет его в локальную DBF таблицу, чтобы не расходовать память. Ровно в одном месте программы в таблицу стали попадать символы "?" вместо CHR(16).

И соотв. при восстановлении экрана в RestConsole() происходит RESTSCREEN(0,0,MAXROW(),MAXCOL(), console->buffer)

Ровно в одном месте программы.

Первая мысль была на USE ... CODEPAGE. Спросил, знающий человек быстро откликнулся (за что ему спасибо), проверил - не помогло.
Стал копать дальше. Оказывается, SAVESCREEN именно в этом месте программы возвращает "испорченные" коды. Которые попадают в таблицу и USE уже ни причем - он пишет в таблицу то, что ему вернул SAVESCREEN().

Во всей программе все работает как нужно. В этом, одном, единственном месте, написанном на чистом Clipper безо всяких наворотов - такая вот петрушка...

Поэтому, собственно, пока единственный вопрос - были ли у кого-нить на Harbour проблемы с SAVESCREEN() / RESTSCREEN() или нет.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 928
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 09.09.13 10:30. Заголовок: Я никогда, даже во в..


Я никогда, даже во времена работы с Клиппером, не сохранял экраны в dbf.
Просто делал сохранение в массив, выполнявший роль стека LIFO (last in first out). Даже с Клиппером память ни разу не исчерпалась.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3537
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.09.13 10:36. Заголовок: PSP пишет: Я никогд..


PSP пишет:

 цитата:
Я никогда, даже во времена работы с Клиппером, не сохранял экраны в dbf.


+1

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 36
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 09.09.13 10:56. Заголовок: символы "?" вместо CHR(16) - это несравнимо по определению


символы "?" ( это картинка) вместо CHR(16) ( а это - число,байт,...)
Либо - символы "?" вместо символа "x" ,
либо CHR(n) вместо CHR(16)

Сохраняейте в бинарный файл (типа TXT) и смотрите содержимое любым Hex-вьюером(editor)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 270
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 09.09.13 11:06. Заголовок: PSP пишет: Я никогд..


PSP пишет:

 цитата:
Я никогда, даже во времена работы с Клиппером, не сохранял экраны в dbf.
Просто делал сохранение в массив, выполнявший роль стека LIFO (last in first out). Даже с Клиппером память ни разу не исчерпалась.



Выключить эту опцию сегодня - дело трех строчек кода. Наверное так и сделаю. Но это пока не решает этого мелкого вопросика, о котором речь.

petr707 пишет:

 цитата:
символы "?" ( это картинка) вместо CHR(16) ( а это - число,байт,...)
Либо - символы "?" вместо символа "x" ,
либо CHR(n) вместо CHR(16)

Сохраняейте в бинарный файл (типа TXT) и смотрите содержимое любым Hex-вьюером(editor)



Символ CHR(16) - это такой треугольник, который изображает, что данный пункт имеет вложенное подменю.
Например: "Документы >" при выборе этого пункта вызывается меню с документами.

После SAVESCREEN/RESTSCREEN получается так: "Документы ?"

т.е. вместо CHR(16) получается CHR(63) - как раз выяснилось из сравнения слитых в txt результатов SAVESCREEN()
Надеюсь, что понятно объяснил.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 929
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 09.09.13 11:14. Заголовок: А какой тип поля в d..


А какой тип поля в dbf?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2977
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 09.09.13 11:32. Заголовок: Символ CHR(16) - это..



 цитата:
Символ CHR(16) - это такой треугольник, который изображает, что данный пункт имеет вложенное подменю.
Например: "Документы >" при выборе этого пункта вызывается меню с документами.



Я точно также отмечаю меню с подменю символом Chr(16), и тоже использую при этом savescreen/restscreen. Правда, сохраняю все в структурах типа стек. Проблем не возникало.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 271
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 09.09.13 12:28. Заголовок: PSP пишет: А какой ..


PSP пишет:

 цитата:
А какой тип поля в dbf?


CHAR, с размером ширина*высота экрана * 2 (для атрибутов)

Pasha пишет:

 цитата:
Я точно также отмечаю меню с подменю символом Chr(16), и тоже использую при этом savescreen/restscreen. Правда, сохраняю все в структурах типа стек. Проблем не возникало.



Сейчас стало совершенно понятно, что структуры точно не причем. RESTSCREEN() возвращает вместо треугольника знак вопроса.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 926
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 09.09.13 12:52. Заголовок: Sergy пишет: RESTSC..


Sergy пишет:

 цитата:
RESTSCREEN() возвращает вместо треугольника знак вопроса.

Самодостаточный пример в студию, как говорится.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3538
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.09.13 13:47. Заголовок: Sergy А вот так буд..


Sergy
А вот так будут BAD ? ;)

 
proc main
local csave
local csave1
local i
cls

for i=1 to 10000
@ 10,10 say chr(16) color "gr+/r"

csave:=savescreen(10,10,10,10)

if left(csave,1)#chr(16)
? "Bad Savescreen "
wait
endif
@ 10,10 say " " color "n/n"

restscreen(10,10,10,10,csave)

csave1:=savescreen(10,10,10,10)
if left(csave1,1)#chr(16)
? "Bad Restscreen"
wait
endif


next

return


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 272
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 09.09.13 13:59. Заголовок: AlexMyr пишет: Само..


AlexMyr пишет:

 цитата:
Самодостаточный пример в студию, как говорится.



Если-бы было все так просто... Из нескольких сотен вызовов SAVESCREEN/RESTSCREEN все работает ровно. Заковыка только в одном-единственном. Может еще где есть в программе - там вызовов десятки, если не сотни разбросаны. Ведь все происходит довольно быстро: SAVESCREEN - диалог - RESTSCREEN и практически сразу идет перепрорисовка меню. Заметить сложно.

Пока вычислил один, но совершенно точно - врет... Либо глюк.

Dima пишет:

 цитата:
Sergy
А вот так будут BAD ?



Вечером смогу ответить.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 930
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 09.09.13 14:13. Заголовок: Sergy пишет: Заковы..


Sergy пишет:

 цитата:
Заковыка только в одном-единственном


Пошагово выполнить программу. Может там действительно перед выполнением savescreen() знаки вопроса на экране.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 273
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 09.09.13 22:21. Заголовок: Dima пишет: Sergy ..


Dima пишет:

 цитата:
Sergy
А вот так будут BAD ?



Не очень понял смысла кода (память/видеоадаптер проверялся что-ли...), но ни одной надписи "Bad savescreen" не получил.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3539
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 09.09.13 22:30. Заголовок: Sergy Думаю где то ..


Sergy
Думаю где то твой косяк , просто подумай где он.
У меня тоже при переводе программы на Harbour c Сlipper был глюк который не мог долго поймать.
Психовал даже маленько ;) Но поймал.

PS
на форуме таких примеров при "переводе" достаточно, о якобы глюках Harbour.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 274
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 09.09.13 22:53. Заголовок: PSP пишет: Пошагово..


PSP пишет:

 цитата:
Пошагово выполнить программу.


Так и сделал.
И акуел, если честно:

Скрытый текст


Загвоздка оказалась в команде RUN. Как она может повлиять на SAVESCREEN() - ума не приложу.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2978
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.09.13 08:09. Заголовок: Sergy пишет: Загвоз..


Sergy пишет:

 цитата:
Загвоздка оказалась в команде RUN. Как она может повлиять на SAVESCREEN() - ума не приложу.



Харбор-программа разделяет консоль с внешним приложением (cmd.exe), которое изменяет какие-то параметры консоли.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3540
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.09.13 09:07. Заголовок: Sergy Вместо RUN по..


Sergy
Вместо RUN поюзай hb_processrun , WAPI_ShellExecute , EXECANDWAIT

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2979
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.09.13 13:51. Заголовок: Делаем тест: Local ..


Делаем тест:

#include "hbgtinfo.ch"

proc main

Local i, j, cc

REQUEST HB_CODEPAGE_RU866
REQUEST HB_LANG_RU866
hb_cdpSelect( "RU866" )

cls
//hb_gtinfo(HB_GTI_COMPATBUFFER, .f.)
for i := 0 to 15
cc := ''
for j := 0 to 15
cc += Chr(i*16 + j)
next
@ i, 0 say cc
next
cc := SaveScreen(0,0,15,15)
RestScreen(0,20,15,35,cc)
run('dir >nul')
cc := SaveScreen(0,0,15,15)
RestScreen(0,40,15,55,cc)
wait
retu

На экране видим бяку на месте кодов меньше 32
А теперь фокус-покус: добавляем вызов

hb_gtinfo(HB_GTI_COMPATBUFFER, .f.)

и все исправляется. Только при этом буфер для savescreen/restscreen будет в 2 раза больше.


Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник


Пост N: 931
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 10.09.13 14:14. Заголовок: Ну да: HB_GTI_COMPAT..


Ну да:
HB_GTI_COMPATBUFFER /* Use DOS CGA/EGA/VGA character/attribute buffer in SAVE/REST SCREEN */

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 276
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 10.09.13 18:01. Заголовок: Pasha пишет: На экр..


Pasha пишет:

 цитата:
На экране видим бяку на месте кодов меньше 32
А теперь фокус-покус: добавляем вызов

hb_gtinfo(HB_GTI_COMPATBUFFER, .f.)

и все исправляется. Только при этом буфер для savescreen/restscreen будет в 2 раза больше.



Пока остановился на замене #define RUN(x) HB_ProcessRun(x) - SAVESCREEN заработал нормально. Понятно, что под Windows памяти дофига - но жалко же какой смысл ее транжирить...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 277
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.09.13 11:04. Заголовок: Sergy пишет: #defin..


Sergy пишет:

 цитата:
#define RUN(x) HB_ProcessRun(x)



Так не пойдет - только что наступил на грабли: не выполняются команды shell - dir, copy, ren и тп... При этом не выдаются никакие сообщения об ошибке. Просто игнор и всё.

Нужно вот так: #define RUN(x) HB_ProcessRun("cmd /c "+x)

буффер не портится и команды command shell выполняются.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3541
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.09.13 11:11. Заголовок: Sergy пишет: При эт..


Sergy пишет:

 цитата:
При этом не выдаются никакие сообщения об ошибке. Просто игнор и всё.


Оно пишется в 3-й параметр этой функции если его указать

Sergy пишет:

 цитата:
не выполняются команды shell - dir, copy, ren и тп...


А зачем ? Все это можно делать средствами Harbour

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 120
Зарегистрирован: 19.05.05
ссылка на сообщение  Отправлено: 11.09.13 12:04. Заголовок: А почему нельзя сох..


А почему нельзя сохранять экран ДО команды RUN ? Так было бы логичнее.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 278
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.09.13 13:22. Заголовок: nick_mi пишет: А по..


nick_mi пишет:

 цитата:
А почему нельзя сохранять экран ДО команды RUN ? Так было бы логичнее.



Изначально вопрос стоял так: в процессе перехода с Clipper на Harbour были устранены шероховатости и программа была запущена в работу на предприятии. Все возникающие в процессе работы вопросы решались, за исключением непонятки, "портившей" символы с кодом ниже CHR(32) при восстановлении на экран.

После детального изучения вопроса (а версии возникали самые разные - они описаны тут, на пред. страницах) выяснилось, что уже SAVESCREEN возвращает "испорченный" буфер экрана. Пошаговое выполнение программы привело к выяснению причины - ею оказалась команда RUN().

Понятно, что анализировать сотни/тысячи строк кода и выяснять, где идет RUN(), а потом SAVESCREEN() вряд-ли имеет смысл и решение с #define кажется мне на сегодня вполне достаточным.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 279
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.09.13 13:26. Заголовок: Dima пишет: А зачем..


Dima пишет:

 цитата:
А зачем ? Все это можно делать средствами Harbour



Безусловно. Но речь идет о запуске тысяч строк кода Clipper под Harbour, а не его переделке "с учетом возможностей".

А в Clipper, к примеру, невозможно было работать нормально с каталогами/файлами, не соответствующими формату 8.3.
Да и в Harbour сейчас проще записать RUN("del local\*.dbf >nul") чем городить такой огород:
dim:=DIRECTORY(cPath,"*.dbf") ; AEVAL(dim,{|x| cPath+x[F_NAME]...}).

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 283
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 16.09.13 12:37. Заголовок: Решил поднять старую..


Решил поднять старую тему: http://clipper.borda.ru/?1-20-0-00000475-000-0-0-1208757116

Речь в ней идет о DIRTYREAD/TURBOREAD/DBOI_READLOCK

Подскажите плиз - к каким все-таки результатам приводит включение этого "ускорителя" ?

Общая ситуация такая: есть куча пользователей, которые что-то пишут в таблицу с продажами.
Есть пара пользователей, которые на основании таблицы продаж в READONLY режиме хотят построить отчет.

Вот тут я немного не понял, чем все кончилось, а тема закрыта: если я у этой пары пользователей ("читателей") включу dbOrderInfo(DBOI_READLOCK,,, .t.) - что, помимо ускорения выборки, произойдет? Если в таблице за время построения отчета появятся какие-то записи - "читателям" по барабану: отчеты обычно строятся за прошлые периоды, изменение которых юзерам запрещено программно.

Будут ли ошибки у "читателей" таблицы? Или у "писателей" в неё?

Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 39
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 16.09.13 13:46. Заголовок: Отчеты за прошлые периоды


Если технология - файл-серверная и
данные за прошлые периоды не изменяются, зачем нагружать доступ ко всей базе "грязным" чтением ?
Можно сверить текущую базу с предыдущей локальной выборкой( копией ) и строить отчеты
по локальной копии продаж, не нагружая рабочую базу.
Создание файла локальной копии происходит гораздо быстрее и менее напряжно, чем подготовка отчетов по общей базе,
и в общем случае, затраты ресурсов и времени на создание локальной копии окупаются.
Заодно - получается точная фиксация "точки отсечения" - на какой момент фиксировано состояние продаж.
if local_file_not_exist or local_file_is_old ;use .. shared readonly; copy to (local_file) for ..; close ..

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2991
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.09.13 14:13. Заголовок: Sergy пишет: Вот ту..


Sergy пишет:

 цитата:
Вот тут я немного не понял, чем все кончилось, а тема закрыта: если я у этой пары пользователей ("читателей") включу dbOrderInfo(DBOI_READLOCK,,, .t.) - что, помимо ускорения выборки, произойдет? Если в таблице за время построения отчета появятся какие-то записи - "читателям" по барабану: отчеты обычно строятся за прошлые периоды, изменение которых юзерам запрещено программно.

Будут ли ошибки у "читателей" таблицы? Или у "писателей" в неё?



DBOI_READLOCK касается только выборки по управляющему индексу.
Если этот параметр включен, то на время включения другие клиенты не смогут ничего ни прочитать, ни записать в рабочую область, т.к. индекс блокируется для чтения. Внешне это будет выглядеть как "зависание" клиента. Поэтому использовать эту опцию надо аккуратно, и на очень непродолжительное время. Можно сделать тест:

dbOrderInfo(DBOI_READLOCK,,, .t.)
wait

и попробовать с другого клиента выдась go top/skip, и посмотреть, что получится. Ничего хорошего, естественно.
Это все проблемы файл-сервера. Для клиент-сервера вроде ads/letodb такой проблемы нет в принципе.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 284
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 16.09.13 23:03. Заголовок: petr707, Pasha Мысл..


petr707, Pasha Мысли понятны. С letodb скоро разберусь. И загрузку локально для справочников я провожу всегда, практически с первого дня написания программы. Для большой кучи отчетов (в начале месяца, например) есть функция "работать локально" - через 5-7 минут ожидания (пока вся база скопом копируется в локальную папку) - программа работает с ней, как ни в чем не бывало, но в READONLY - чтобы никто не навыписывал по забывчивости накладных.

А вот если юзеру нужно всего один-два отчета, не окажется ли процесс "копирование всей таблицы продаж + локальная индексация" длительнее, чем просто чтение нужного периода по индексу ? Т.е. овчинка не будет стоить выделки... Думал, что DBOI_READLOCK поможет ускорить чтение по индексу.

Спасибо.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3007
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.13 02:16. Заголовок: Уже перешел на Харбо..


Уже перешел на Харбор ! Поздравляю !
Sergy пишет:

 цитата:
А вот если юзеру нужно всего один-два отчета, не окажется ли процесс "копирование всей таблицы продаж + локальная индексация" длительнее, чем просто чтение нужного периода по индексу ?



Для различных выборов из баз, делай условную индексацию по уже сформированным индексам.
Отчеты будут строиться влет, даже не успеешь заметить...
Здесь на форуме обсуждалось это, и не раз.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 40
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 17.09.13 06:33. Заголовок: все можно проверить..и нужно проверять


для каждой задачи можно проверить и выбрать подходящую схему..
set order to 0; copy to () for...; index on ...
может оказаться быстрее чем
index on ...; copy to () for...;

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2992
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.09.13 08:33. Заголовок: Sergy пишет: Думал,..


Sergy пишет:

 цитата:
Думал, что DBOI_READLOCK поможет ускорить чтение по индексу.



Сергей, я подзабыл эти вещи, и неправильно написал: DBOI_READLOCK блокирует выборку на запись с других клиентов, а не на чтение. А так да, когда я использовал DBFCDX, установка DBOI_READLOCK меня реально выручала. В сетевом окружении скорость выборки возрастала многократно.
Что же касается остальных вариантов, то надо иметь в виду: все эти приемы: динамическое построение индекса, или индекса с условием, или копирование таблицы с set order to 0 для больших таблиц неприемлемы, поскольку предполагают цикл по всем записям, что быстрым быть не может. Надо применять обычное решение: иметь правильный набор индексов для возможных выборок, и использовать их. Для файл-сервера DBOI_READLOCK реально помогает. Проблем из-за его использования у меня не было. Только, как я отмечал, его надо использовать аккуратно.

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 286
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 17.09.13 10:08. Заголовок: Pasha пишет: DBOI_R..


Pasha пишет:

 цитата:
DBOI_READLOCK блокирует выборку на запись с других клиентов, а не на чтение.



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

Тк первый вариант для меня подходит, а второй - нет.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 287
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 17.09.13 10:15. Заголовок: Andrey пишет: Для р..


Andrey пишет:

 цитата:
Для различных выборов из баз, делай условную индексацию по уже сформированным индексам.


Не очень знаком с условной индексацией, если честно... Направьте плиз на путь истинный.

Вот допустим, у меня есть таблица продаж:
date D8 // дата продажи
stk1 N5 // продавец
stk2 N5 // покупатель
code C10 // код товара
num N10 // кол-во
price N10.2 // цена

И два индекса:
1) по CODE (чтобы быстро находить нужный товар в куче продаж)
2) по DATE (чтобы быстро найти нужный период для отчета)

Для построения отчета использую таблицу продаж только со вторым индексом в режиме READONLY
Как условная индексация может тут помочь ?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2993
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.09.13 10:31. Заголовок: Sergy пишет: Требуе..


Sergy пишет:

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



Блокирует весь индекс, то есть любое изменение. Причем ошибка не возникает, клиент просто ждет, пока другой клиент не отпустит индекс.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3008
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.13 10:48. Заголовок: Sergy пишет: Для по..


Sergy пишет:

 цитата:
Для построения отчета использую таблицу продаж


Какая таблица ?
Какие критерии построения отчета ?
Дайте примеры что ищите...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2994
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.09.13 10:53. Заголовок: Sergy пишет: Как ус..


Sergy пишет:

 цитата:
Как условная индексация может тут помочь ?



Никак. Каждый инструмент хорош для своих целей. Условная индексация применяется, если надо полностью исключить из индекса данные по некоторому условию.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 290
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 19.09.13 22:45. Заголовок: Вопрос. Существует ..


Вопрос.

Существует ли какой-нибудь способ "снести" работающую программу на Harbor с клавиатуры с установленным SETCANCEL(.F.) ?

Суть в следующем: есть довольно сложный участок кода, приводить его здесь в качестве "самодостаточного примера" нет никакой возможности: куча RELATION, FILTER по нескольким открытым таблицам: типичная работа юзера: открыть накладную, нажать Insert, выбрать (отфильтровать) нужный товар, нажать ENTER, ввести нужно кол-во -> товар добавляется в накладную.

Опять начались необъяснимые вылеты программы: ни стандартный обработчик ошибок, ни hb_out.log ничего не дают: в обоих случаях пусто. Программа просто схлопывает окно без малейшего сообщения. По диспетчеру задач утечек памяти (как было с ошибками 9ххх) точно нет. Зависаний, подтормаживаний - тоже. Все летает, потом - бац - окна нет.

Сделал тест: в основном цикле обработки нажатий юзера сделал примерно следующее: при нажатии K_ALT_F1 в буфер клавиатуры засылаются типичные нажатия на клавиши юзера (K_INS + случайная последовательность цифр (типа, поиск товара) + K_ESC (отмена) или K_ENTER (выбор) + заново K_ALT_F1 (чтобы зациклить процесс). В ходе чего тупо увеличивается счетчик и при помощи STRFILE() сбрасывается в локальный файл, чтобы понять, сколько раз цикл проработал.

В результате: цикл отрабатывает уже несколько тысяч раз - гораздо больше, чем за день набивает среднестатистический юзер - все ровно. И в локальной базе на компе с Harbour и в реальной сети.

Может там какой CTRL в комбинации с ALT позволяет сделать что-то типа ALT_C при SETCANCEL(.T.) ?


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 41
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 20.09.13 06:44. Заголовок: Полное логирование пользователя


Добавить режим работы программы (по настройке) - запись в лог всех действий юзеров ,
с указанием места в коде программы,
до отдельных клавиш клавиатуры можно не детализировать.
Можно поймать момент времени, когда и в каком месте кода произошло прекращение работы.

Применяется ли EXIT procedure и что фиксируете при нормальном завершении?

Можно организовать отдельный поток ( с логированием) который просто через интервал ( 10 сек)
в этот же лог работы юзеров будет скидывать состояние некоторых ключевых параметров состояния

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 291
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.09.13 11:15. Заголовок: petr707 пишет: Прим..


petr707 пишет:

 цитата:
Применяется ли EXIT procedure и что фиксируете при нормальном завершении?


При запуске программы из mem-файла берется error_counter (изначально равный -1, увеличивается на единицу и сохраняется назад в mem-файл. При нормальном завершении уменьшается на единицу и еще раз сохраняется в mem-файл. Во время работы значение err_count мониторится. Если не равно нулю - значит был вылет.


 цитата:
Можно организовать отдельный поток ( с логированием) который просто через интервал ( 10 сек)
в этот же лог работы юзеров будет скидывать состояние некоторых ключевых параметров состояния


Спасибо за идею. Организовывать MT для задачи, которая и так себя нестабильно ведет, наверное не совсем верно. Попытаюсь решить через SaveConsole()/RestConsole() - мою обертку для SAVESCREEN()/RESTSCREEN() - они вызывается чаще всего и регулярно при входе/выходе в большинство процедур.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 936
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 20.09.13 11:37. Заголовок: Sergy пишет: ни ста..


Sergy пишет:

 цитата:
ни стандартный обработчик ошибок, ни hb_out.log ничего не дают: в обоих случаях пусто.

Т.е. hb_out.log появляется, но он пустой? А про обработчик ошибок что имеется ввиду что тоже пустой?

Можно пересобрать harbour c опцией:
## Memory statistics/tracking
Build Harbour with:
HB_USER_CFLAGS=-DHB_FM_STATISTICS

потом пересобрать прогу и смотреть появится ли fm.log (вроде так) при очередном падении, если да, то смотреть что там.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 42
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 20.09.13 12:54. Заголовок: errorsys - корректный ?


Есть еще идеи
1) Если всю программу обернуть в begin..recover.. end
то можно обнаружить некорректно перееопределенный ERRORSYS
begin sequence
... all_program()
recover using oError
// В этой секции
? " Undefined error"
end sequence
2) MT тем и хорош, что можно в поток обернуть проблемный вызов,
и если он грохнется, основной поток будет жить и сможет разобраться,почему поток свалился.
3) Аналогично пункту 1 - почти весь код оборачивается во второй поток, в главном -только
хорошо отлаженная диагностика свала второго потока



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 292
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.09.13 14:18. Заголовок: AlexMyr пишет: Т.е...


AlexMyr пишет:

 цитата:
Т.е. hb_out.log появляется, но он пустой?


Сейчас вижу, что я некорректно выразился. Имелось в виду, что hb_out.log не появляется.


 цитата:
А про обработчик ошибок что имеется ввиду что тоже пустой?


Еще с давних времен я сделал свой обработчик ошибок, который при запуске программы устанавливается и больше не меняется. В случае возникновения программных ошибок, он выводит сообщение на экран и дублирует в файл, вместе со стеком вызовов, номерами строк, состоянием памяти, открытыми таблицами и тп. При следующем успешном запуске программы этот файл сливается в каталог с dbf таблицами - и не вставая с кресла можно понять, что именно, где, у кого и когда именно произошло. Для отлова программынх ошибок - самое то.

Так вот в данном случае обработчик тоже "ни гу-гу".

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 293
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.09.13 14:20. Заголовок: petr707 пишет: Есть..


petr707 пишет:

 цитата:
Есть еще идеи


Хм... надо подумать в этом направлении.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 295
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.09.13 14:29. Заголовок: Поднял лог изменений..


Поднял лог редактирований исходников и сравнил с ростом "неожиданных вылетов", которые начались в начале этой недели. Из значительных изменений, сделанных в программе было: #define RUN(x) HB_ProcessRun("cmd /c "+x)

Вчера вечером отменил этот код, сегодня держу пальцы крестиком, но половину рабочего дня вылет был один раз и только на одной машине.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 297
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 20.09.13 17:16. Заголовок: Попутно возник еще в..


Попутно возник еще вопрос.

Есть dbf таблица на сервере с одной записью. Каждая машина в свой отдельный файл скидывает в нее свое состояние: стек вызовов, снимок экрана, дату/время и тп - как раз для диагностики происходящих вылетов. Вызов происходит в процессе FT_OnTick() каждые 10 секунд.

Я на своем компе открываю мониторинг и вижу, что происходит на других компах. Обратил внимание, что дата модификации этого dbf файла не совпадает со штампом времени, в который сделана запись. Например: я смотрю у юзера состояние, присланное в 18:02, а сам файл имеет 4 штампа:

 
Far CTRL-A:
ДД.ММ.ГГГГГ чч:мм:сс,мс
Время последней записи: 20.09.2013 16:31:46,158
Время создания: 20.09.2013 15:25:15,916
Время последнего доступа: 20.09.2013 17:34:39,906
Время изменения: 20.09.2013 16:31:46,158


Почему уже полтора часа (с 16-30) не обновляется "время изменения" ?

Может, до тех пор, пока пишущая программа не закроет эту таблицу не произойдет изменение ?
Но почему тогда не меняется "время последнего доступа", если я смотрел только что с другого компа ?

Раньше не обращал внимания на такие вопросы и мне кажется, в Clipper все было предельно четко: прошла запись - атрибуты файла соотв. образом изменились. Был лаг из-за небольшого отставания/спешки часов в ntvdm машине - но это было понятно хоть почему.




Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3581
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 20.09.13 18:11. Заголовок: Sergy Где то подним..


Sergy
Где то поднимался на форуме такой вопрос , попробуй поиск помучать.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3008
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.09.13 13:04. Заголовок: Sergy пишет: Почему..


Sergy пишет:

 цитата:
Почему уже полтора часа (с 16-30) не обновляется "время изменения" ?



Современные ОС еще не так чудят. 5 минут назад:
Win7. Делаю xml-файл с помощью классов А.Кресина. Размер - 1.5М. Штатно закрываю его на локальном диске посредством

oXml:Save( cFile )

Закрываю программу, перехожу в фар. Фар показывает его размер - 0 байт. Открываю его редактором, вьювером. Файл создан нормально, но его размер - 0. Только после копирования файла на другой диск исходный файл получил размер.
Не верю своим глазам (изыди, нечистый). Плюю через левое плечо. Удаляю файл и проделываю все по новой. Размер появляется сразу. Изгнание беса помогло.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 311
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.09.13 16:13. Заголовок: Еще вопрос. Под Cli..


Еще вопрос.

Под Clipper работали сочетания клавиш ALT+цифры. Иногда, в некоторых местах программы довольно удобно было поставить "специальную" метку в реквизитах клиента, описании и тп. Например, "сеточка" ALT+1+7+6, "квадратик" ALT+2+5+4 и тп.

Как активировать подобный функционал в Harbour ?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 943
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.09.13 16:21. Заголовок: Sergy пишет: Как ак..


Sergy пишет:

 цитата:
Как активировать подобный функционал в Harbour ?


Сейчас проверил, работает. Терминал GTWVT.
Пример простейший:
FUNCTION  Main() 
LOCAL c := " "
CLS
@ 0, 0 GET c
READ
QUIT


В get-е появляются символы с набранными на цифровой клавиатуре кодами.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3590
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.09.13 16:23. Заголовок: Sergy пишет: Как ак..


Sergy пишет:

 цитата:
Как активировать подобный функционал в Harbour ?


Ни чего не нужно активировать , все и так работает ALT + твой код на цифровой клавиатуре

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 312
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 26.09.13 17:37. Заголовок: Эк меня приглючило. ..


Эк меня приглючило. И действительно, работает...
Оказывается, для Harbour главное, чтобы NumLock был включен. В Clipper (ntvdm) работало в любом состоянии NumLock. Только что проверил.

Спасибо!


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 944
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 26.09.13 19:30. Заголовок: Sergy пишет: Оказыв..


Sergy пишет:

 цитата:
Оказывается, для Harbour главное, чтобы NumLock был включен. В Clipper (ntvdm) работало в любом состоянии NumLock. Только что проверил.

Спасибо!


Во как! Спасибо тоже! :)


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 315
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 28.09.13 19:53. Заголовок: Подскажите плиз, уже..


Подскажите плиз, уже намаялся:

Вот, допустим, накосячил я где-то в исходнике (ENDIF забыл, ну или там DO / WHILE перепутал...) - возникает несколько десятков ошибок в цепочке. Компилятор выплевывает их всех, разумеется, на экране консоли виден только их "хвост". Как понять, с чего все началось ?

Использую hbmk2 под Far. Пока временно приходится ставить высоту буфера экрана под 300 символов, компилировать и потом снова возвращать нормальные 25. Надоело...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 46
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 28.09.13 20:27. Заголовок: Самое простое - вывод hbmk2 направить в log


hbmk2 test.hbp -otest.exe> build_test.log
и смотреть log
а лучше - выбрать среду разработки или редактор с вызовом компилятора

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 316
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 28.09.13 21:46. Заголовок: petr707 пишет: hbmk..


petr707 пишет:

 цитата:
hbmk2 test.hbp -otest.exe> build_test.log
и смотреть log



Разумеется, пробовал в первую очередь. Вот что в логе:

Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 47
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 29.09.13 09:39. Заголовок: Для 3.2 можно так hbmk2 ... 1> compile.log 2>error.log


hbmk2 ... 1> compile.log 2>error.log



Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 318
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 03.10.13 11:27. Заголовок: Возвращаясь к вопрос..


Возвращаясь к вопросу ускорения загрузки справочников с сервера в локальную папку:
Sergy пишет:

 цитата:
Речь в ней идет о DIRTYREAD/TURBOREAD/DBOI_READLOCK

Подскажите плиз - к каким все-таки результатам приводит включение этого "ускорителя" ?


...
petr707 пишет:

 цитата:
для каждой задачи можно проверить и выбрать подходящую схему..
set order to 0; copy to () for...; index on ...
может оказаться быстрее чем
index on ...; copy to () for...;



Поставил пару экспериментов в сети с таблицами, которые в данный момент активно используются юзерами.
У меня код
USE (cTable) READONLY // без индекса
COPY TO (cLocalFile)
CLOSE
работает примерно в 50 раз медленнее, чем COPY FILE (cTable) TO (cLocalFile)
и примерно в 70 раз медленнее, чем STRFILE(FILESTR(cTable),cLocalFile)

Но третий способ почему-то не копирует файлы больше 30-40 мегабайт, хотя оперативной памяти явно с избытком в данном случае. Кто знает ограничения на длину строки? У кого какой результат в сравниваемых способах?

С учетом того, что часто в локальной папке все равно нужно выстраивать индекс, ускорение получается в 5..10 раз. После перехода с Clipper на Harbour и так всё залетало, а тут получается вообще TwinPower Turbo...



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 256
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.10.13 14:27. Заголовок: Sergy смотри http://..

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 319
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 03.10.13 16:41. Заголовок: SergKis пишет: Serg..


SergKis пишет:

 цитата:
Sergy
смотри http://clipper.borda.ru/?1-4-40-00000872-000-0-0



Там идет сравнение различных функций копирования файлов, а у меня волосы дыбом встают от разницы между "файловым" COPY FILE TO и "табличным" COPY TO, которым всегда пользовался...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 49
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 03.10.13 17:18. Заголовок: Скорость обработки в режиме MEMIO


Посмотрите примеры обработки таблиц в памяти - скорость впечатляет,
может и не потребуется копировать файлы
Тэги поиска mem: hb_memio

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 257
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.10.13 17:25. Заголовок: Sergy пишет:Там идет..


Sergy пишет:
 цитата:
Там идет сравнение различных функций копирования файлов, а у меня волосы дыбом встают от разницы между "файловым" COPY FILE TO и "табличным" COPY TO, которым всегда пользовался...


COPY TO FILE это __Copyfile()
по ссылке gfilatov2002 пишет:
 цитата:
По-видимому, Hb_fcopy() будет побыстрее, поскольку она использует буфер размером 65536 (против 8192 у функции __Copyfile())


COPY TO имеет смысл, если надо урезать по полям или условиям выборки сразу. В VO в COPY TO если задан только файл выполнялась FileCopy(...)

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 320
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 05.10.13 19:13. Заголовок: Возник вопрос: нужен..


Возник вопрос: нужен встроенный просмотр картинок, но под терминал GTWIN. Такое возможно ?
Хочу отказаться от Irfan View, который нужен только для того, чтобы вывести одну картинку на экран (образец товара).

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3611
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 05.10.13 19:48. Заголовок: Sergy пишет: нужен ..


Sergy пишет:

 цитата:
нужен встроенный просмотр картинок, но под терминал GTWIN


Встроенный вряд ли и придется лепить отдельную прогу под GTWVT

PS
Тоже вывожу образцы товара но прога под GTWVT поэтому и проблем нет.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 321
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 10.10.13 22:56. Заголовок: Короче, я обессилел ..


Короче, я обессилел и нифига не понимаю...

Месяц уже ищу причину ничем не объяснимых вылетов программы. Поступил следующим образом: расставил в "критических" местах команды
...
Trace("before some action 1")
...
do some action 1
...
Trace("after some action 1")
...
do some action 2
...
Trace("after some action 2")
...
Функция Trace просто сбрасывает дату+время+строчку в "свой" лог, чтобы не путать машины.

Выяснил, что программа без единого сообщения падает на вот таком коде:

Скрытый текст


Или вот на таком:

Скрытый текст

В среднем примерно в 3х случаях из тысячи на любом из пяти рабочих компьютеров, где эти операции происходят...
Самое убийственное для меня в том, что до расстановки этих Trace вылеты были в среднем 10 раз на тысячу.
Тысяча "чистых" отработок взяты не с потолка, это примерное количество строчек в накладных, соответствующее кол-ву "вылетов".

Подобные вылеты "на ровном месте" происходят и в других местах программы. Расставлять там Trace() уже не понимаю, зачем... :(

Короче, полный ппц какой-то - программа валится как карточный домик от малейшего дуновения... Пару раз при мне, лично сам видел - тупой зависон на ровном месте, программа ни на что не реагирует, загрузка одного ядра процессора под 100% - ничего кроме убийства приложения через диспетчер не помогает... :(((

Подумал, может дело в компилере mingw, попробовал сделать hbmk2 myproject.hbp -comp=bcc (остался от версии 3.0.0) - Turbo linker не может найти библиотеку HBNF.LIB... не от версии 3.0.0 же ее брать... руки опускаются, черная дыра какая-то...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 58
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 10.10.13 23:23. Заголовок: Во втором сегменте - возможно деление на 0 ?


s_buy_price := ROUND(amount->buy_sum / amount->num,0)

... / amount->num ?!

Можно смоделировать ошибку и проверить, как работает обработчик ошибок
Если "..программа без единого сообщения падает " , то обработчика реально - нет.

Вызовите где-нить рядом что-нить типа
...
err_simulate()
..

Function err_simulate()
Local a:=0,b:=1

b:= 2/a

return .t.

Стремные места можно обрамить не trace , а break recover sequence

BEGIN SEQUENCE with {|e| Break(e) }
// segment
RECOVER
Trace("Erron in segment ..")
END SEQUENCE



При тупом зависоне 100% - ищем hb_out.log немерянного размера - там критическии свалы во множестве


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 322
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 10.10.13 23:36. Заголовок: petr707 пишет: s_bu..


petr707 пишет:

 цитата:
s_buy_price := ROUND(amount->buy_sum / amount->num,0)

... / amount->num ?!


amount->num - целое числовое поле, вполне может быть нулем. Там чуть ниже проверка идет: IF (ABS(s_buy_price) < 0.0005) .OR. (amount->num==0)
это алгоритм расчета закупочной цены товара: сумма закупки делится на кол-во в остатках. Если кол-во равно нулю (например, оформляется возврат) - берется цена последнего поступления.
Остаток равен нулю примерно... в каждой 50й операции...

Ведь с давних времен еще в Clipper повелось:

 d:\Harbour sources\src\rtl\errsys.prg 

// By default, division by zero results in zero
IF e:genCode == EG_ZERODIV .AND. ;
e:canSubstitute
RETURN 0
ENDIF


Обработчик точно есть, он устанавливается в самом начале и исправно скидывает в лог полную информацию об ошибках. Но они точные и четкие: код ошибки, стек вызовов, номера строк, состояние памяти, список открытых таблиц и тп.

petr707 пишет:

 цитата:
При тупом зависоне 100% - ищем hb_out.log немерянного размера - там критическии свалы во множестве


Нету. У меня по умолчанию локальные report.log (сообщения об ошибках, туда-же идет трассировка) и hb_out.log сливаются при каждой команде CloseAll() на сервер под "своим" именем, зависящим от "имени" машины в сети.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 59
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 10.10.13 23:44. Заголовок: Вот как раз сюда и поставьте - Trace




// By default, division by zero results in zero
IF e:genCode == EG_ZERODIV .AND. ;
e:canSubstitute
TRACE("zerodiv was !")
RETURN 0
ENDIF

Если увидите Trace - то работает обработчик, но позволять этого в качестве рабочих вычислений - нельзя.
При неудачном раскладе такое вольное обращение с делением на 0 - может зациклить процесс.



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 60
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 10.10.13 23:46. Заголовок: hb_out.log - легко упрется в 2 Гига - через 5 минут


hb_out. log - легко упрется в 2 Гига - и тогда ничего никуда не сольется

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 323
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 10.10.13 23:48. Заголовок: Хм. поставлю. Уверен..


petr707 пишет:

 цитата:
TRACE("zerodiv was !")


Хм. поставлю. Уверен, что будут трассировки.
Понимаю, что в математике делить на ноль нельзя. Но почему нельзя этого делать в Harbour ?? Это ведь стандартный текст обработчика, я его скопировал и дополнил дополнительной инфой.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 324
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 10.10.13 23:49. Заголовок: petr707 пишет: hb_o..


petr707 пишет:

 цитата:
hb_out. log - легко упрется в 2 Гига - и тогда ничего никуда не сольется


Эвона как...
Поставлю проверку на это дело... Хотя не совсем понятно, чем помешают именно 2 гига... FAT ни на одной машине давно не используется - только NTFS.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 61
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 10.10.13 23:55. Заголовок: Разве тяжело сделать аккуратнее ?!


IF (ABS(s_buy_price) < 0.0005) .OR. ABS(amount->num) <0.0005
s_buy_price := amount->buy_price
else
s_buy_price := ROUND(amount->buy_sum / amount->num,0)
ENDIF

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 325
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.10.13 00:03. Заголовок: petr707 пишет: Разв..


petr707 пишет:

 цитата:
Разве тяжело сделать аккуратнее ?!



Вовсе нет. Сделаю. Прямо сейчас.

Как попробовать другой компилер с Harbour 3.2.0 ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 62
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 11.10.13 00:18. Заголовок: Другой компилер - можно разному


Не уверен, что в поставке 3.2 есть BCC
отладить - можно и на 3.0
=========
rem @echo off
cls
echo
echo .. building P ...

set HB_PLATFORM=win
set HB_ROOT=C:\hb30
set HB_BIN_INSTALL=C:\h30\bin
set path=%HB_ROOT%\bin;c:\borland\bcc55\bin;%path%

%HB_ROOT%\bin\hbmk2.exe test_bcc.hbp -oTEST_bcc.EXE > build_.log
...
==========
set HB_PLATFORM=win
set HB_ROOT=C:\hb30
set HB_BIN_INSTALL=C:\hb30\bin

set path=%HB_ROOT%\bin;C:\hb30\comp\mingw\bin;%path%

%HB_ROOT%\bin\hbmk2.exe test_m3.hbp -oTEST_m3.EXE 1> build_m3.log 2>error_m3.log

..


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 326
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.10.13 00:21. Заголовок: Поставил в обработчи..


Поставил в обработчик трассировку:

// By default, division by zero results in zero
IF e:genCode == EG_ZERODIV .AND. ;
e:canSubstitute
TRACE(STR(++static_counter)+". Division by zero. ")
RETURN 0
ENDIF

Нажимаю на кнопку "Расчет заказа по результатам торговли" - в логе 12809 сообщений...

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 63
Зарегистрирован: 21.04.13
ссылка на сообщение  Отправлено: 11.10.13 00:35. Заголовок: Образцы .hbp - где-то есть на форуме


примеры, нужно затачивать под себя

=================test_bcc.hbp===
#
-platform=win
-compiler=bcc
#-inc
-info
-trace


#further link options
-W3
-es2
#-mt

# compile options
#-m
#-n
#-es0
-w0
#-b

# libs
-liphlpapi
-lxhb
-lhbxpp
-lhbmzip
-lvfw32
-lhbwin
-lhbct
-lhbrtl
-lhbvm
-lhbnf

#-llibpng
-lhbtip
-lhbmisc


-std
-gtwvt
-prgflag=-D_HBMK_ -DIN_NET -DHARB3
-ldflag=-aa

-nohbc

#-run

#source
TEST.PRG
...

===============test_m3.hbp==
#
-platform=win
-compiler=mingw
#-inc
-info
-trace
#--hbinfo
-quiet

-oTEST_m3.EXE
-workdir=C:\temp

#further link options
#-W3
#-es2
#-mt

-ldflag=-Wl,--allow-multiple-definition

# compile options
#-m
#-n
#-es0
-w0
#-b

# libs
....

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 327
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.10.13 16:00. Заголовок: Я вот чего думаю - м..


Я вот чего думаю - может придумать какой-нить "стресс-тест", который позволит по максимуму нагрузить подсистему Harbour/С и выяснить - в чем проблема? Может дело в железе/памяти/системных ошибках на конкретной машине?

У кого-нить есть опыт построения подобных вещей? Первая мысль - построить массив на пару миллионов записей (учесть свободную память перед этим, разумеется) и погонять как следует по нему: сложить/вычесть/посчитать контрольные суммы... Может таблицу какую сгородить и прокрутить ее по сети...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3026
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 22.10.13 09:57. Заголовок: Сергей, ну вкратце р..


Сергей, ну вкратце расскажите, решена ли проблема со сваливанием программы ? Помогли советы в harbour users list ?
Насколько я понял, после внесения правок в реестр (обычный трюк для клиппера) проблема исчезла ? Или это только в тестах ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 960
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 22.10.13 11:20. Заголовок: Pasha пишет: Может ..


Pasha пишет:

 цитата:
Может дело в железе/памяти/системных ошибках на конкретной машине?

Если проблема в этом, то были б "синие екраны смерти виндовс", плюс к этому создаются дампы памяти, по к-м можно узнать причину. Т.к. вылетала эта прога написанная на clippere, то проблема в коде, как уже было сказано в harbour users list исходников никто не видит и потому все работают в этом случае телепатами. Как я понимаю исходных кодов много, и то что все это завелось под harbour, то это большой плюс harbour-у, а код надо пересмотреть, оптимизировать, лишнее убрать, и т.д...

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 356
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.10.13 21:33. Заголовок: Pasha пишет: Сергей..


Pasha пишет:

 цитата:
Сергей, ну вкратце расскажите, решена ли проблема со сваливанием программы ? Помогли советы в harbour users list ?
Насколько я понял, после внесения правок в реестр (обычный трюк для клиппера) проблема исчезла ? Или это только в тестах ?


Спасибо, что не остались равнодушны.

Сегодня под вечер три раза сработала вот эта мышеловка:

 
FUNC Main()

... some inits

BEGIN SEQUENCE
MainMenu()
RECOVER
OutReportLog("Unexpected break in the sequence catched")
END SEQUENCE
ExitProgram()

RETURN // Main()


Теперь вот сижу, ломаю голову, как понять, откуда она вызвана. Получается, что ProcStack() в RECOVER блоке уже ничего не показывает.
Посмотрел - в std.ch нет команды переопределения BREAK <x>, например, на функцию Break(x). У меня в некоторых местах есть, к примеру, BREAK 1, BREAK 2 и потом - RECOVER USING nValue.
Хочу сделать что-то наподобие
#command BREAK <x> => OutReportLog("Break call"+ProcStack(,,TRUE,CRLF)) ; Break(<x>)
Но не уверен в синтаксисе... hbmk2 завис на компиляции одного из *.prg файлов после внесения таких изменений в общий для всего проекта *.ch ...


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 357
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.10.13 21:36. Заголовок: AlexMyr пишет: Если..


AlexMyr пишет:

 цитата:
Если проблема в этом, то были б "синие екраны смерти виндовс", плюс к этому создаются дампы памяти, по к-м можно узнать причину. Т.к. вылетала эта прога написанная на clippere, то проблема в коде, как уже было сказано в harbour users list исходников никто не видит и потому все работают в этом случае телепатами. Как я понимаю исходных кодов много, и то что все это завелось под harbour, то это большой плюс harbour-у, а код надо пересмотреть, оптимизировать, лишнее убрать, и т.д...



А чего толку от 2.5 мегабайт исходников? Я их сам 15 лет уже вижу практически каждый день, почти всё наизусть помню - а у меня на рабочем месте ни разу!!! за все время такого вылета не было... Да и на половине рабочих мест предприятия - тоже.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 961
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 22.10.13 21:52. Заголовок: Sergy пишет: А чего..


Sergy пишет:

 цитата:
А чего толку от 2.5 мегабайт исходников?

Ну да, че толку, винда ж глючит, а она у вас лицензионная?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 358
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.10.13 21:54. Заголовок: AlexMyr пишет: Ну д..


AlexMyr пишет:

 цитата:
Ну да, че толку, винда ж глючит, а она у вас лицензионная?


Честно говоря, не очень понял связи.



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 965
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 22.10.13 22:15. Заголовок: Sergy пишет: Честно..


Sergy пишет:

 цитата:
Честно говоря, не очень понял связи.

Вы говорите о вылетах своей проги и не придаете никакого значения исходникам
Sergy пишет:

 цитата:
А чего толку от 2.5 мегабайт исходников?

принимая их за валидный и оптимальный код. За эти дни можно было уже в каждую ф-ю и процедуру вначале и в конце вписать "начало работы такой-то func", "конец работы такой-то func" все вывести в лог файл и каждый день парсить его на предмет аномалий. Я говорю о том, что вы один на один со своей проблемой, давая только куски кода, где все вроде нормально, а в общем контексте имете то, что имете, и об этом говорили в user list.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 3657
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.10.13 22:19. Заголовок: AlexMyr пишет: и о..


AlexMyr пишет:

 цитата:
и об этом говорили в user list


Ссылку напомни плиз

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 359
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 22.10.13 22:22. Заголовок: AlexMyr пишет: прин..


AlexMyr пишет:

 цитата:
принимая их за валидный и оптимальный код. За эти дни можно было уже в каждую ф-ю и процедуру вначале и в конце вписать "начало работы такой-то func", "конец работы такой-то func" все вывести в лог файл и каждый день парсить его на предмет аномалий. Я говорю о том, что вы один на один со своей проблемой, давая только куски кода, где все вроде нормально, а в общем контексте имете то, что имете, и об этом говорили в user list.


Честно говоря, не понимаю, с чего Вы так решили. Вовсе не считаю свой код валидным и оптимальным. Ищу ошибку. Сложную.
По поводу "вставить в каждую функцию трассировку" - возможно и дойдет до этого, куда деваться?
Пока хочу разобраться с этой болячкой путем наименьшего затрагивания исходников. Поскольку в 99.999% нажатий на кнопки клавиатуры все происходит так, как положено. И по-хорошему, можно было-бы забить на 2-3 вылета в день. Раньше вылетало чаще. Ну подумаешь, делов-то... Но я так не могу.

Спасибо за поддержку в любом случае.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 966
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 22.10.13 22:37. Заголовок: Sergy пишет: И по-х..


Sergy пишет:

 цитата:
И по-хорошему, можно было-бы забить на 2-3 вылета в день. Раньше вылетало чаще. Ну подумаешь, делов-то...

Не хочу Вас обидеть, но у юзеров должны быть крепкие нервы в такой ситуации на протяжении 15 лет.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 967
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 22.10.13 22:51. Заголовок: Dima пишет: Ссылку ..


Dima пишет:

 цитата:
Ссылку напомни плиз

пересмотрю user list, покажу, но там прямо так не сказано.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 968
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 23.10.13 09:29. Заголовок: AlexMyr пишет: Dima..


AlexMyr пишет:

 цитата:
Dima пишет:

цитата:
Ссылку напомни плиз

пересмотрю user list, покажу, но там прямо так не сказано.



Вот продолжение темы https://groups.google.com/forum/#!topic/harbour-users/zTxmANrh2oU

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3028
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.10.13 09:39. Заголовок: Sergy пишет: Сегодн..


Sergy пишет:

 цитата:
Сегодня под вечер три раза сработала вот эта мышеловка:



Скорее всего это не наш загадочный случай, а обычная ошибка, которую поймал обрработчик.

Можно немного видоизменить код:

recover using oErr

и в протокол выдавать параметры oErr, чтобы было понятно, что это за зверь.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 360
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 23.10.13 10:54. Заголовок: Pasha пишет: Скорее..


Pasha пишет:

 цитата:
Скорее всего это не наш загадочный случай, а обычная ошибка, которую поймал обрработчик.

Можно немного видоизменить код:

recover using oErr

и в протокол выдавать параметры oErr, чтобы было понятно, что это за зверь.


А если это обычный BREAK, не завернутый в BEGIN SEQUENCE ... RECOVER ... END? Таких команд в тексте много, но все они предназначены для обработки критических ситуаций с таблицами, дисками и тп... Вчера полночи просматривал исходники - вроде все ровно...

Пока сделал так:
#command BREAK [<x>] => BreakList(<x>)
BreakList() выведет стек вызовов включая себя самого и вызовет стандартный Break(x). В случае перехвата в Main() - будет нормальный ExitProgram. Поставил там-же еще Alert() с требованием вызвать админа или программера. В тексте программы сейчас включен отладчик, сырцы на флэшке. Если буду на месте в этот момент - надеюсь поймать.

Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3029
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.10.13 14:49. Заголовок: Для анализа ошибок о..


Для анализа ошибок открытия файла в протокол можно выдавать значение hb_osError(). Это код ошибки последней операции, который дает windows.

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 409
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 14.09.14 20:21. Заголовок: Решил двинуться даль..


Решил двинуться дальше, в сторону подключения мыши к изначально "клавиатурной" программе.
Не то, чтобы очень нужно, но задают вопросы "а с планшета можно" ? Говорю - "можно, но неудобно, тк экранная клавиатура терминального клиента занимает пол-экрана".
Но какие-то шаги в этом направлении пора делать...

Практически все "окна" в программе рисуются "виртуально" при помощи @ a,b,c,d BOX ..., устанавливаются "временные" относительные координаты от начала текущего окна и осуществляется SAY ... GET.

Мне нужно сделать так, чтобы при нажатии мышью за пределами определенного прямоугольника в буфер клавиатуры попала команда Esc, соотв. выбранный отчет/операция будут отменены.

Подскажите пожалуйста - в каком направлении двигаться для адаптирования программы под мышь?
Спасибо.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 410
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 14.09.14 21:22. Заголовок: И еще вопрос: переше..


И еще вопрос: перешел на GTWVT.
Какие шрифты для работы с ним кто использует?
Кроме "стандартных" Courier и Lucida Console разумеется.

Очень хочется сделать похожим на вот это:



Для себя "нашел" ещё удачными Consolas и Andale Mono.

Какие вообще требования к шрифтам, которые можно подключить к GTWVT? Так понимаю, что шрифт должен быть OpenType и Unicode ?
Может быть, где-то есть готовый список ?



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 415
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.09.14 21:45. Заголовок: Sergy пишет:для адап..


Sergy пишет:
 цитата:
для адаптирования программы под мышь


в каталоге test\mouse.prg, и поищи mouse в test\*.prg для начала.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 416
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.09.14 21:57. Заголовок: Sergy еще глянь tes..


Sergy
еще глянь test\wvtext.prg, может понравится

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 4209
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 15.09.14 18:03. Заголовок: Sergy пишет: Может ..


Sergy пишет:

 цитата:
Может быть, где-то есть готовый список ?


Скорее всего его нет а шрифты лучше брать моноширинные.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3633
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.09.14 18:38. Заголовок: Я сделал функцию для..


Я сделал функцию для пользователей - выбор шрифта.
http://file.qip.ru/arch/8e-shgP3/GTWVT-ChoiceFont-xHarbour.html


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 413
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 16.09.14 12:50. Заголовок: Andrey пишет: Я сде..


Andrey пишет:

 цитата:
Я сделал функцию для пользователей - выбор шрифта.


Спасибо за пример.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 414
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 16.09.14 12:51. Заголовок: SergKis пишет: еще ..


SergKis пишет:

 цитата:
еще глянь test\wvtext.prg, может понравится



Там 4 "импортных" моноширинных шрифта. Нужны "отечественные". Может кто использует ещё что-то, кроме перечисленных.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 285 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 87
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет