powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Нужно перевести с FoxPro на Delphi или C++
7 сообщений из 7, страница 1 из 1
Нужно перевести с FoxPro на Delphi или C++
    #35558247
user32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно перевести листинг программы с FoxPro на Delphi или C++. Языка FoxPro не знаю и потому сходу перевести не могу. Буду признателен если кто поможет.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
*********************************************************************
* Назначение : Приведение в соответствие значение количества записей
* в заголовке таблице и реального количества записей
* Автор : Владимир Максимов
* Дата :  31 . 08 . 2008 
* Версия FoxPro: Visual FoxPro с  3  по  9 
* Возможно, этот код будет работать и в версиях FoxPro  2 .x
* если убрать объявления LOCAL и MessageBox()
* Но это не проверялось
*********************************************************************

* Пользователь выбирает файл для проверки
*  5  параметр в функции GetFile() был введен только в версии Visual FoxPro  6 
* для младших версий FoxPro его надо удалить
Local lcFileName
lcFileName = GetFile("DBF","","", 0 ,"Выбор файла для проверки количества записей")
If Empty(m.lcFileName)
* Файл не был выбран
Return
EndIf

* Открываю файл и запоминаю его дескриптор (идентификатор)
Local lnFD
lnFD = Fopen(m.lcFileName, 12 )
If m.lnFD <  0 
MessageBox("Не удалось открыть файл" + Chr( 13 ) + ;
m.lcFileName + Chr( 13 ) + ;
"Возможно, он открыт другим приложением")
EndIf

* Теоретически, здесь хорошо бы добавить проверку на тот факт,
* что данный файл - это DBF-таблица (анализ первого байта)
* Но в данном случае предполагается, что пользователь понимает, что он делает
* Если, тем не менее, Вы хотите создать универсальную утилиту, то
* посмотрите код программы CPZERO.PRG из поставки FoxPro.
* Эта программа находится в каталоге TOOLS\CPZERO корневой папки FoxPro

* Определяю количество записей записанное в заголовке файла
* байты с  4  по  7 
LOCAL lnReccount
=FSEEK(m.lnFD, 4 )
lnReccount = ASC(FREAD(m.lnFD, 1 )) + ;
ASC(FREAD(m.lnFD, 1 )) *  256  + ;
ASC(FREAD(m.lnFD, 1 )) *  256  *  256  + ;
ASC(FREAD(m.lnFD, 1 )) *  256  *  256  *  256 

* Определяю позицию, с которой начинается собственно данные (первая запись)
* байты с  8  по  9 
LOCAL lnDataStart
lnDataStart = ASC(FREAD(m.lnFD, 1 )) + ;
ASC(FREAD(m.lnFD, 1 )) *  256 

* Определяю количество символов в одной записи, включая метку на удаление
* байты с  10  по  11 
LOCAL lnRecLength
lnRecLength = ASC(FREAD(m.lnFD, 1 )) + ;
ASC(FREAD(m.lnFD, 1 )) *  256 

* Определяю общий размер файла, через порядковый номер последнего байта
LOCAL lnFileSize
=FSEEK(m.lnFD, 0 , 0 )
lnFileSize = FSEEK(m.lnFD, 0 , 2 )

* Определяю значение самого последнего байта файла
LOCAL lnEndByte
=FSEEK(m.lnFD,- 1 , 1 )
lnEndByte = ASC(FREAD(m.lnFD, 1 ))

* И реальное количество записей в файле
LOCAL lnFaktCount
DO CASE
CASE m.lnFileSize = m.lnDataStart
* Т.е. в таблице вообще нет информации
lnFaktCount =  0 
CASE m.lnEndByte =  26 
* Если последний байт файла имеет ASCII код  26  (0x1A),
* то общее число информационных байтов надо уменьшить на  1 
lnFaktCount = (m.lnFileSize - m.lnDataStart -  1 ) / m.lnRecLength
OTHERWISE
lnFaktCount = (m.lnFileSize - m.lnDataStart) / m.lnRecLength
ENDCASE


LOCAL lnResult
* Анализ полученных результатов
DO CASE
CASE INT(m.lnFaktCount) <> m.lnFaktCount

* Есть дробная часть. Т.е. выделить целое количество записей невозможно
* повреждения более существенные, чем разница в количестве записей
* лучше ничего не трогать
lnResult = - 1 
=Fclose(m.lnFD)

MessageBox("Выделить целое количество записей невозможно"+Chr( 13 ) + ;
"Повреждения более существенные, чем разница в количестве записей")

CASE m.lnFaktCount <> m.lnReccount

* Записанное и фактическое количество записей отличаются
* корректирую записанное количество записей
=FSEEK(m.lnFD, 4 , 0 )
FOR lnI= 1  TO  4 
=FWRITE(m.lnFD,CHR(MOD(INT(m.lnFaktCount /  256 **(m.lnI- 1 )), 256 )))
ENDFOR

lnResult =  1 
=Fclose(m.lnFD)

MessageBox("Значение количества записей исправлено")

OTHERWISE

* Ошибки в определении количества записей не обнаружено
lnResult= 0 
=Fclose(m.lnFD)

MessageBox("Ошибки в количестве записей не обнаружено")

ENDCASE

* Результат возвращается на случай, если есть необходимость в подобном анализе
RETURN m.lnResult 
...
Рейтинг: 0 / 0
Нужно перевести с FoxPro на Delphi или C++
    #35558421
user32Нужно перевести листинг программы с FoxPro на Delphi или C++. Языка FoxPro не знаю и потому сходу перевести не могу. Буду признателен если кто поможет.
Если Вы знаете С++ или/и Делфи, то по приведенным в тексте комментариям Вам не составит большого труда написать аналогичную программу даже не зная языка FoxPro... Так как комментарии очень подробные...
З.Ы. Комментарии - это строки со знаком звездочки (*) в начале строки...

Повторю еще раз смысл данной программы (по комментариям, приведенным в ней):
Пользователь вводит имя поврежденного файла. Файл DBF открывается как бинарный на чтение и запись. Анализируется заголовок DBF-файла: количество записей (тип данных: long = 4 байта), длина записи (тип данных: int = 2 байта), байт с которого начинаются данные.
Считывая последний байт файла определяем размер файла; рассчитываем количество записей на основании данных о размере файла (в байтах), байта, с которого начинаются данные и длины одной записи (в байтах):

число записей = (длина файла - № байта начала данных)/длина записи

Если в конце файла стоит байт с кодом 0х1А, то формула для расчета будет:

число записей = (длина файла - № байта начала данных - 1)/длина записи

Если получили не целое количество записей (например, 123.345, а не 123 или 124), то файл поврежден серьезно и его надо лечить как-то по-другому. Если число записей - целое число, то сравниваем полученное значение с тем, что получили при чтении заголовка файла. Если данные не совпадают, то записываем в соответствующие байты файла рассчитанное значение...

Вот и все...
...
Рейтинг: 0 / 0
Нужно перевести с FoxPro на Delphi или C++
    #35558551
Samvel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы попросите у Владимира Максимова, все таки он автор, хотья бы ради приличия
...
Рейтинг: 0 / 0
Нужно перевести с FoxPro на Delphi или C++
    #35558650
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SamvelА вы попросите у Владимира Максимова, все таки он автор, хотья бы ради приличия
Что людей смешить. Задача примитивная, можно даже без этого кода ее решить, достаточно взять описаловку структуры заголовка DBF для написания проверялки.
Мало того что 50% это комментарии, десяток функций использовано (и те никакой фоксовой специфики не имеют. русский хэлп тут ) Остальная сложность кода из-за неприспособленности фокса к подобным операциям.
На Си или Паскале это пишется в 10-15 строчек кода, алгоритм понятен из поста Станислава, поэтому достаточно знать правила работы с фалами из этих языков.
...
Рейтинг: 0 / 0
Нужно перевести с FoxPro на Delphi или C++
    #35558758
Samvel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там всего то 5-6 функций нижнего уровня fopen, fseek, fread, fwrite, fclose...
...
Рейтинг: 0 / 0
Нужно перевести с FoxPro на Delphi или C++
    #35559339
Это
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поиск в нете по словам "Бухучет + Контрольная сумма", удивлений у тебя будет море, обещаю.
...
Рейтинг: 0 / 0
Нужно перевести с FoxPro на Delphi или C++
    #35562986
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fopen, fseek, fread, fwrite, fclose
точнго были в турбо с 20
не думаю что они исчезли из с++
:)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Нужно перевести с FoxPro на Delphi или C++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]