powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CP866 Grid
8 сообщений из 8, страница 1 из 1
CP866 Grid
    #33362520
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне надо применять Visual Fox 9 с базой данных в свободных
таблицах в кодировке CP866. Задача осложнена использованием
искуственных ключей по полям Character, в которых есть двоично
нулевые начальные символы (DOS-аналог Character Binary). Команды
SEEK и SET RELATION в сеансе с CONFIG.FPW!CODEPAGE=1251 по таким
полям не работают независимо от SET NOCPTRANS. Как обеспечить
визуальное проектирование форм с Grid.RecordSourceType = Table
или Alias с "прямым" доступом к таблицам данных, не прибегая
к выборке в курсор?

Мой опробованный подход не очень удобен. Разработка ведётся
с CONFIG.FPW!CODEPAGE=1251. В контролах для правки таблиц
используется шрифт CP866 и ON KEY LABEL для перекодировки клавишных
посылок из 1251 в 866. Запуск приложения с CONFIG.FPW!CODEPAGE=866.
При этом приходится все отображаемые на форме текстовые литералы
в контролах (например, Caption) перекодировать в Object.Init из
CP866 в CP1251, т.к. среда выполнения при запуске приложения без
спроса переводит литералы из CP1251 в CP866.

Хотелось бы найти в Grid такой метод-событие, в котором можно было бы
перехватить загрузку Column.TexBox.Value значением из таблицы и
выгрузку его обратно в таблицу. Методы Value_Assign и Value_Access
не годятся, т.к. данные изменения TextBox.Value Grid делает
"за кулисами", не вызывая _Assign/_Access.
...
Рейтинг: 0 / 0
CP866 Grid
    #33362556
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сранно, что NOCPTRANS не помогает, мне как-то пришлось иметь дело с таблицей от FPD в 866 кодировке с зашифрованными полями типа Char, в которой при шифровании использовались символы псевдографики и прочие. Насчет Relation ничего не могу сказать, а вот Seek работал абсолютно без проблем.
...
Рейтинг: 0 / 0
CP866 Grid
    #33362615
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WORKSNS. А ты вспомни, что у тебя было в CONFIG.FPW!CODEPAGE. В этом суть.
Работает только при CONFIG.FPW!CODEPAGE=866. Ты не врубился в ситуацию.
...
Рейтинг: 0 / 0
CP866 Grid
    #33363183
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, сейчас только глянул - codepage=1251
...
Рейтинг: 0 / 0
CP866 Grid
    #33364246
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Вас неверное представление о работе FoxPro с кодовыми страницами.

Настройка CODEPAGE=... в файле конфигурации выполняет 2 функции:

Включается сам факт автоматической трансляции (конвертации) разных кодовых страниц

В качестве текущей кодовой страницы среды FoxPro устанавливается указанная после равенства кодовая страница.

Если указать NOCPTRANS для ряда полей открытой таблицы, то это означает, что эти данные не надо транслировать (конвертировать). Их следует восприниамть "как есть", т.е. как созданные в текущей кодовой странице FoxPro.

Т.е., если у Вашей таблицы явно прописан признак кодовой страницы (CPDBF()=866), и в файле конфигурации указано CODEPAGE=1251, то данные из этой таблицы будут автоматически траслироваться из кодовой страницы 866 в кодовую страницу 1251.

Если же наложить ограничение NOCPTRANS, то данные из этих полей транслироваться не будут и будут восприниматься как созданные в кодовой странице 1251.


Теперь, что имеем с индексами (SEEK и RELATION)

Индексный файл - это отдельный (другой) файл. Приблизительно, содержимое индексного файла - это пары: значение ключа - идентификатор записи.

В данном случае, нас интересует то, как именно записано это самое значение ключа. В какой кодовой странице. Точнее так, как связана кодовая страница собственно файла DBF и кодовая страница, в которой записано значение ключа в индексном файле.

Вот фрагмент объяснения Алексея Цингауза (представитель MSFT - разработчик FoxPro)

Алексей ЦингаузПри построении идекса нужно учитывать следующую деталь. Когда индексное выражение вычисляется, значения полей читаются с диска как есть, без трансляции в текущую кодовою страницу. А вот многие функции оперируют по разному, в зависимости от текущей кодовой страницы. UPPER один из примеров такой функции. Если текущая кодовая страница 1251 а кодовая страница таблицы 866, то к букве "а" в кодировке 866 UPPER применит кодовую страницу 1251. Естественно, буквы "А" в кодировке 866 не получится. Если планируется строить индексы или модифицировать данные под разными текущими кодовыми страницами, то индексное выражение должно быть инвариантно отностельно текущей кодовой страницы.

Всю дискуссию полностью по этому вопросу можешь почитать здесь

http://forum.foxclub.ru/read.php?f=29&i=325&t=307
...
Рейтинг: 0 / 0
CP866 Grid
    #33375290
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для WORKSNS - не знаю, что сказать. У меня не так!
Для Владимира М. Спасибо за подробные объяснения. Я действительно не всё
разобрал в CPCURRENT - для чего аргументы 1 или 2. Ещё хуже с CP в DLL
COM-серверах - там у меня вообще 1252. Но как мое непонимание сказывается
на результатах такого простого кода? Они не согласуются с приведённой
Вами теорией. В чем моя ошибка? Если не трудно, намекните, пожалуйста.

* DMake866.PRG in FPD 2.6 WITH CONFIG.FP!CODEPAGE=866
SET TALK OFF
SET SAFETY OFF
CREATE TABLE D866;
(HEX C (2);
,DEC N (3);
)
FOR m.i = 0 TO 255
INSERT INTO D866 (HEX, DEC);
VALUES (CHR(0)+CHR(m.i), m.i)
ENDFOR
INDEX ON HEX TAG HEX
INDEX ON DEC TAG DEC ADDITIVE

* Tst866.PRG WITH CONFIG.FPW!CODEPAGE=1251
* Run on VFP9 under WinXP-rus with SP2
SET TALK OFF
CLOSE DATABASES
USE D866 IN 0 AGAIN ALIAS A1
USE D866 IN 0 AGAIN ALIAS B2
SELECT B2
SET NOCPTRANS TO HEX
SET ORDER TO HEX
SELECT A1
SET NOCPTRANS TO HEX
SET ORDER TO DEC
SET EXACT ON && of no matter
SET RELATION TO HEX INTO B2
COUNT TO m.k1 FOR DEC != ASC (RIGHT (HEX, 1))
COUNT TO m.k2 FOR A1.DEC != B2.DEC
WAIT STR (m.k1, 4) + STR (m.k2, 4) WINDOW && Shows 0 128
BROWSE FIELDS DEC, H1 = STR (ASC (RIGHT (HEX, 1)));
,B2.DEC, H2 = STR (ASC (RIGHT (B2.HEX, 1)));
FOR A1.DEC != B2.DEC
...
Рейтинг: 0 / 0
CP866 Grid
    #33375683
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Rostislav!

Поищи в форуме на foxclub.ru - была довольно большая дискуссия про
использование таблиц с "неродной" CP в VFP - речь шла про индексы с
UPPER() - но оно касается на самом деле и простых индексов. То что ты
"отменил" конвертацию для поля - НИКАК не повлияло на индекс. А в свою
очередь использование такого "неродного" индекса и приводит к описанному
результату.
Единственное утешение - это то что при выполнении SQL запросов в 9-ке
отключается оптимизатор - "неродные" индексы не используются - и результат
является ПРАВИЛЬНЫМ. Например попробуй для своей тестовой таблицы выполнить
такой запрос (ессно что предварительно установив NOCPTRANS на поле hex):
SELECT * FROM d866 a1 INNER JOIN d866 a2 ON a1.hex=a2.hex
Получишь вполне корректный результат - 256 элементов. В VFP7/8 (и наверное
во всех прочих более старых) из-за использования оптимизатором неродного
индекса мы ошибочно получаем только 128 элементов (первые 128 записей - для
них коды символов что в 1251 что в 866 одинаковы).
Т.е. В принципе МОЖНО работать из 9-ки с FPD таблицами, НО не пользовать
нигде индексы (а значит и SET RELATION) - ни напрямую, ни косвенно (т.е. для
оптимизации). стати в SP1 "по просьбам трудящихся" будет включена
возможность старой КРИВОЙ работы движка - конечно при SET ENGINEBEHAVIOUR <
90 - т.е. у "жалобщиков" появится выбор - работать НЕПРАВИЛЬНО но быстро,
или ПРАВИЛЬНО но медленно. Впрочем для англичан "неправильность" не должна
сказываться - если они конечно не пользуют ИМЕННО hex поля - а только
строковые поля со своими английскими буковками (128 элементов из "нижней"
части таблицы символов).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
CP866 Grid
    #33377772
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov, спасибо.
Я так понял, поиски принципиального решения можно оставить.
Если ты следил за моими вариантами темы CP866 ..., я опробовал два
обходных решения. 1) Правка в Grid через Control с Font на CP866
и перехватом/перекодировкой клавишных посылок для Control из 1251
в 866. 2) Показ CPCONVERT (866, 1251, Data) через Control1 и
правка/валидация через Control2, вывешиваемый на Form когда надо
поверх Grid.Control1. Пришёл к мысли: способ 1 легче. По способу 2
слишком много возни с отключением (LostFocus) Control2 при навигации,
Resize/Move для Column/Rows и т.п.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / CP866 Grid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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