Форум » Clipper » Динамическая смена алиаса открытого файла » Ответить

Динамическая смена алиаса открытого файла

Pasha: Вот возникла такая потребность Есть некоторые алгоритмы (функции), которые делают выборку из определенных таблиц, обращаясь к ним по алиасу Возникла потребность использовать эти же функции в той же программе, но для других файлов (с другим именем), но с той же структурой, и использующих такие же индексы Чтобы не закрывать/открывать файлы, хотелось бы иметь возможность изменить алиас уже открытого файла. Это ведь всего лишь строковая переменная В харборе все открыто, и этот вопрос там решить несложно А как в клиппере ? Есть ли функция изменения имени алиаса через api rdd ? Может такое уже делали ?

Ответов - 11

Pasha: Наверное сделаю так Память освобождать/выделять мне в лом, я просто обеспечу, чтобы длина алиаса была токой же самой #include <extend.h> #include <rdd.api> #include <item.api> #include <string.h> CLIPPER NEWALIAS(void) { extern WORKAREAP* _workareas; WORKAREAP AreaInfo = * _workareas; strcpy(AreaInfo->alias, _parc(1)); _ret(); }

wad1: Я делаю проще: завожу переменную, скажем MALIAS и присваиваю ей разные значения, а в процедуре, которая занимается обработкой, все обращения к таблице выполняю через эту переменную, например: (MALIAS)->FIELD Такой метод используется уже давно. Работает нормально.

Григорьев Владимир: А если вызывать эти функции с указанием алиаса перед ними самими?


Pasha: Эти функции используют несколько таблиц

Pasha: Не работает моя функция. Неправильная значит Ибо сказано в rdd.api: FARP alias; // Pointer to the alias symbol for this workarea Может быть это ссылка не на алиас, а на symbol, его содержащий ? Вообще функция Alias() выглядит так: ALIAS: push bp mov bp,sp sub sp,26H push si mov byte ptr -20H[bp],0 mov ax,1 push ax call far ptr __lparam add sp,2 mov word ptr -22H[bp],ax or ax,ax jne L$76 mov ax,word ptr __selection mov word ptr -22H[bp],ax L$76: cmp word ptr -22H[bp],100H jae L$77 mov bx,word ptr -22H[bp] shl bx,1 shl bx,1 les si,dword ptr __Workareas mov ax,word ptr es:[bx+si] mov dx,word ptr es:2[bx+si] mov word ptr -26H[bp],ax mov word ptr -24H[bp],dx or ax,dx je L$77 lea ax,-20H[bp] push ss push ax push dx push word ptr -26H[bp] les bx,dword ptr -26H[bp] les bx,dword ptr es:[bx] call dword ptr es:70H[bx] add sp,8 L$77: lea ax,-20H[bp] push ss push ax call far ptr __retc add sp,4 pop si mov sp,bp pop bp retf Может быть это наведет на какую то мысль ?

SergeJa: .286 SMART JUMPS LOCALS public RnAlias extrn __parc : far extrn __chk_sym : far extrn __get_sym : far RNALIAS_TEXT SEGMENT BYTE PUBLIC 'CODE' ASSUME CS: RNALIAS_TEXT ; Функция RnAlias переименовывает алиас открытой базы данных. ; Формат вызова: RnAlias( AliasName, NewName ), где AliasName - строка с ; именем алиаса, который будет переименован, NewName - строка нового имени ; для алиаса. Если алиас с именем NewName уже существует, то его старое ; содержимое ( т. е. старый номер рабочей области ) будет потеряно. Символ с ; именем AliasName после отрабатывания функции алиасом быть перестает, хотя ; остается определенным. Возвращаемое значение отсутствует. RnAlias PROC pascal far push SI BP mov BP,SP push 1 call __parc push DX AX call __chk_sym or DX,DX jz @@ret mov ES,DX mov BX,AX xor SI,SI xchg SI,word ptr ES:[BX][6] push 2 call __parc push DX AX call __get_sym mov ES,DX mov BX,AX mov word ptr ES:[BX][6],SI @@ret: leave pop SI ret RnAlias ENDP RNALIAS_TEXT ENDS END

Pasha: Спасибо ! Мысль понятна. В глобальной таблице выполняется поиск нужного символа, и затем он подменяется

Pasha: wad1 пишет: Я делаю проще: завожу переменную, скажем MALIAS и присваиваю ей разные значения, а в процедуре, которая занимается обработкой, все обращения к таблице выполняю через эту переменную, например: (MALIAS)->FIELD Такой метод используется уже давно. Работает нормально. Я тоже иногда использую такой прием, но тут возникла необходимость использовать разные файлы в одном большом модуле, и переделок слишком уж много Собственно задача такая. Есть архивная БД и рабочая БД. При формировании отчета определяется, рабочий это период или архивный, и соответсвенно используется нужная БД Захотелось обойтись без постоянного открытия/закрытия файлов

Григорьев Владимир: SergeJa пишет: call __chk_sym or DX,DX jz @@ret mov ES,DX mov BX,AX ... В этом коде есть неточность после call __chk_sym. Вместо or Dx,dx точнее было бы проверить or AX,dx, то есть адрес передается в регистрах DX:AX. Если функция не нашла, что хотела, то она в DX и AX заносит нули. И вообще функция написана криво! Особенно мне не нравится предложения push SI BP mov BP,SP Правильнее было бы написать push bp mov bp,sp push si А еще лучше воспользоваться упрощающими директивами типа USES, если код пишется на Borland Tasm.

Pasha: Старый добрый ассемблер :) Эх, давненько я не брал в руки шашек

SergeJa: Pasha пишет: Эх rnalias.obj 0000000000: 80 0D 00 0B 72 6E 61 6C │ 69 61 73 2E 61 73 6D 0F 0000000010: 96 02 00 00 68 88 03 00 │ 40 A1 94 96 13 00 0C 52 0000000020: 4E 41 4C 49 41 53 5F 54 │ 45 58 54 04 43 4F 44 45 0000000030: 7E 98 07 00 28 54 00 02 │ 03 01 DF 8C 2C 00 06 5F 0000000040: 5F 70 61 72 63 00 09 5F │ 5F 63 68 6B 5F 73 79 6D 0000000050: 00 09 5F 5F 67 65 74 5F │ 73 79 6D 00 0B 5F 5F 57 0000000060: 6F 72 6B 61 72 65 61 73 │ 00 F2 90 0E 00 00 01 07 0000000070: 52 6E 41 6C 69 61 73 00 │ 00 00 B0 88 04 00 40 A2 0000000080: 01 91 A0 58 00 01 00 00 │ 56 55 8B EC 6A 01 9A 00 0000000090: 00 00 00 52 50 9A 00 00 │ 00 00 0B D2 74 3B 8E C2 00000000A0: 8B D8 33 F6 26 87 77 06 │ 6A 02 9A 00 00 00 00 52 00000000B0: 50 9A 00 00 00 00 8E C2 │ 8B D8 26 89 77 06 C1 E6 00000000C0: 02 74 16 C4 1E 00 00 26 │ 83 78 02 00 74 0B 26 C4 00000000D0: 18 26 89 47 06 26 89 57 │ 08 C9 5E CB 3C 9C 15 00 00000000E0: CC 07 56 01 CC 0E 56 02 │ CC 23 56 01 CC 2A 56 03 00000000F0: C4 3D 56 04 03 8A 02 00 │ 00 74



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