powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / перенести код foxpro 2.6 в delphi
5 сообщений из 5, страница 1 из 1
перенести код foxpro 2.6 в delphi
    #37862445
ValiullinAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
помогите написать функцию преобразование строки x в строку y
строка X : 2012BXDD
строка Y : 201299905

есть часть кода в фоксе которая это делает мне нужно написать функцию аналог этого кода в delphi
код
автор
#define cvt_p2 36
#define cvt_p3 1296
#define cvt_p4 46656

* akcvt45
*
FUNCTION akcvt45
PARAMETERS cAK4
PRIVATE n

IF ISDIGIT(LEFT(cAK4,1))
RETURN '0' + cAK4
ELSE
n = 10000 + ( ;
(ASC(UPPER(SUBSTR(cAK4,1,1))) - ASC('A')) * cvt_p4 + ;
cvt8n(UPPER(SUBSTR(cAK4,2,1))) * cvt_p3 + ;
cvt8n(UPPER(SUBSTR(cAK4,3,1))) * cvt_p2 + ;
cvt8n(UPPER(SUBSTR(cAK4,4,1))) ;
)

RETURN PADL(n,5,'0')
ENDIF
* END FUNCTION akcvt45

*─────────────────────────────────────────────────────────────────────
* akcvt89
*
FUNCTION akcvt89
PARAMETERS cAK8
RETURN ( ;
SUBSTR(cAK8,1,4) + ;
akcvt45(SUBSTR(cAK8,5,4)) ;
)
* END FUNCTION akcvt89

*─────────────────────────────────────────────────────────────────────
* cvt8n
*
FUNCTION cvt8n
PARAMETERS c

RETURN IIF( ;
ISDIGIT(c), ;
ASC(c) - ASC('0'), ;
ASC(c) - ASC('A') + 10 ;
)
* END FUNCTION cvt8n

*--------------------------------------------------------------------
...
Рейтинг: 0 / 0
перенести код foxpro 2.6 в delphi
    #37862570
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
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.
#define cvt_p2 36 
#define cvt_p3 1296
#define cvt_p4 46656
--тут определяются константы, как это сделать в Дельфи, знаете?
--только лучше запихните их внутрь определения функции "akcvt45"

FUNCTION akcvt45 --как писать функции в Дельфи, знаете?
    PARAMETERS cAK4 --это параметр функции //К.О.
    PRIVATE    n --это внутренняя переменная функции

    IF ISDIGIT(LEFT(cAK4,1)) --если первая цифра параметра - число (как писать ветвление в Дельфи, знаете?)
        RETURN '0' + cAK4 --возвратить "0"+параметр
    ELSE --в противном случае
        n  = 10000 + (                                              ;
            (ASC(UPPER(SUBSTR(cAK4,1,1))) - ASC('A')) * cvt_p4 +    ;
            cvt8n(UPPER(SUBSTR(cAK4,2,1)))            * cvt_p3 +    ;
            cvt8n(UPPER(SUBSTR(cAK4,3,1)))            * cvt_p2 +    ;
            cvt8n(UPPER(SUBSTR(cAK4,4,1)))                          ;
        )
--посчитать взвешенную сумму значений функции функции "cvt8n" от первых 4 символов параметра
             RETURN PADL(n,5,'0') --превратить её в строку, добить строку слева символами "0" до длины в 5 символов и возвратить результат
    ENDIF
* END FUNCTION akcvt45


FUNCTION akcvt89 
--эта функция возвращает (первые 4 символа параметра)+(функцию "akcvt45" от следующих четырёх символов)
--какбе имхо это ясно просто из синтаксиса, тут ничего типичного фоксового вообще нет


FUNCTION cvt8n --возвращает либо число, если символ - числовой
--либо номер по алфавиту+9 (для "А" вернёт 0)
...
Рейтинг: 0 / 0
перенести код foxpro 2.6 в delphi
    #37864699
ValiullinAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
функции я перевел работает, но как-то не так работает числа не сходятся где-то на 60-80
вот листинг кода на дельфи
Код: pascal
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.
function PADL(Src: string; Lg: Integer): string;
begin
  Result := Src;
  while Length(Result) < Lg do
    Result := ' ' + Result;
end;

FUNCTION cvt8n(c:Char):integer;

begin
if c in['0'..'9'] then
cvt8n:=ord(c)-ord('0')
else
cvt8n:=ord(c) - ord('A') + 10;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
ak:=edit1.Text[5]+edit1.Text[6]+edit1.Text[7]+edit1.Text[8];
if ak[1] in['0'..'9'] then
label2.Caption:=ak
else
n:=10000+((ord(ak[1])-ord('A')) *cvt_p4+
cvt8n(ak[2])                    *cvt_p3+
cvt8n(ak[3])                    *cvt_p2+
cvt8n(ak[4]));
s := PADL(inttostr(n),5);
label2.Caption:=s;
end;


может кто подскажет где что не так
строки должны быть такими
на входе: 2012BXDD
на выходе: 201299905
а получается
на входе: 2012BXDD
на выходе: 201299853
...
Рейтинг: 0 / 0
перенести код foxpro 2.6 в delphi
    #37865320
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
function PADL(Src: string; Lg: Integer): string;
begin
  Result := Src;
  while Length(Result) < Lg do
    Result := ' ' + Result;
end;

ЕМНИП в Дельфи есть какая-то функция (fillchar, что ли), позволяющая создать строку определённой длины, состоящую из повторений одного символа. Это к вопросу о скорости работы вашей реализации PADL. И, кстати, тот padl добивал нулями (третий параметр), а ваш почему-то пробелами.
Код: pascal
1.
ak:=edit1.Text[5]+edit1.Text[6]+edit1.Text[7]+edit1.Text[8];

не проще ли использовать функцию выбора подстроки (copy, если не ошибаюсь)?
авторможет кто подскажет где что не такС виду всё нормально.Может быть, вы ошиблись при задании констант cvt_p2-cvt_p4?
...
Рейтинг: 0 / 0
перенести код foxpro 2.6 в delphi
    #37865374
ValiullinAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо все получилось
действительно я напутал с константами))
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / перенести код foxpro 2.6 в delphi
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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