2014-10-02 3 views
1

Delphi XE3, Win7 профDelphi: ADOConnection, DBASE3 и набор символов (? Ошибка)

мне нужно написать в DBASE 3 (старый формат) файлов для экспорта данных для DOS-приложения, как (? Clipper) , Хорошо, я подумал: драйвер MS DBASE может это сделать.

Но у меня проблема с венгерскими акцентами.

Я попытался это строка соединения:

Driver={Microsoft dBASE Driver (*.dbf)};DriverID=21;Dbq=c:\temp;Extended Properties=dBASE III;charSet=CP 852;Locale Identifier=1038;Character Set=CP 852;CODEPAGE=852 

Как я видел, что это не может написать только ANSI файлов (приложение DOS принимает CP852 символов).

Я попытался преобразовать контент с помощью AnsiToOEM, но некоторые символы были потеряны при сохранении. В записи я вижу хороший контент, но сохраненный файл содержит неправильные акценты. Тестовый текст - «árvíztűrő tükörfúrógép». В результате отсутствуют «í», «ó», «Ó».

И я нашел какую-то странную вещь!

Если основная форма имеет открытое ADOConnection (связанное свойство истинно в DFM), то я буду читать хорошие символы из файлов DBASE, и я могу записать их в файл - символы ANSI будут преобразованы правильно. «Все нормально», «нормально». Этот объект ADOConnection может отличаться от чтения.

Если я закрою это ADOConnection в режиме IDE, открытые файлы не будут преобразованы, поэтому я увижу некоторые странные акцентированные символы, и я не буду писать хороший текст в файл.

Это странно, потому что, если я открою это соединение на FormCreate по коду, проблема появится ... Я могу читать и записывать записи ADOQuery, если поток ресурсов читает активное соединение ADOConnection (истинное значение) собственность от DFM!

Я не знаю, что произошло в фоновом режиме, и как заставить эту процедуру преобразования символов ADO работать, но я потратил больше времени на то, чтобы найти работающего экспортера DBASE III, и я нашел только ошибку. .

Кто-нибудь знает, что это? Почему кодировщик/декодер ADO работает только в том случае, если у меня было подключенное ADOConnection в DFM? Или как я могу использовать ADODB.Connection вместо объекта ADOConnection, чтобы избежать этого побочного эффекта?

Спасибо за любую идею!

ответ

0

Как я вижу, мне нужно установить кодовую страницу для исправления строки для ADO.

var 
    s: string; 
    aStr1, aStr2: AnsiString; 

begin 
... 

s := 'árvíztûrõ tükörfúrógép'; 
aStr1 := s; 
SetLength(aStr2, Length(aStr1)); 
AnsiToOemBuff(PAnsiChar(aStr1), PAnsiChar(aStr2), Length(aStr1)); 
SetCodePage(RawbyteString(aStr2), 852, False); // THIS IS THE SOLUTION 
ADOQuery1.FieldBYName('name').AsAnsiString := aStr2; 

В противном случае что-то преобразует мою AnsiString снова в фоновом режиме.

Смежные вопросы