Есть рабочий код:
...
private
//!!! Добавить эту процедуру
procedure From1251(Sender: TField; var AText: string; DisplayText: Boolean);
...
{ TForm1 }
//!!! Добавить эту процедуру
procedure TForm1.From1251(Sender: TField; var AText: string; DisplayText: Boolean);
begin
AText:= CP1251ToUTF8(Sender.AsString); //Преобразование из WIN1251 в UTF8
//Если кодировка другая, то можно пробовать другие функции:
//CP866ToUTF8
//KOI8ToUTF8
end;
...
процедура:
begin
Dbf1.Open;
for i:=0 to Dbf1.Fields.Count-1 do
if Dbf1.Fields[i].DataType=ftString then
Dbf1.Fields[i].OnGetText := @From1251;
end;
...
Тут совершенно не ясно как работает строка
Dbf1.Fields[i].OnGetText := @From1251;
Собственно, работает не совсем так, как хочется.
А хочется так:
1. Открыли файл ( не читая записей, еще не описывая структуру)
2. Получить описание полей и CodePage из самого файла (866|1251|кои8...). (как? Предполагаю читать заголовок DBF как цепочку байт)
3. Читаем записи не теряя половину текста (для слова "Привет" поле в DBF L=6 символов CP866 из под OC=Windows)
4. Формируем экранный список данных из DBF, где длина текстового поля экрана =2х длина поля в DBF.
5. Меняем любую ячейку экрана без проблемы с кодировкой
6. Сохраняем, что меняли в экранной таблице, в экранной кодировке UTF8 (по умолчанию).
7. Завершая сохраняем (по кнопке или кресту) данные из экранной таблицы DBGrid в DBF c предварительным преобразованием в CP866.
То что есть - портит данные при попытке редактирования, преобразование происходит, видимо, в полях DBF и половина текста теряется.
Как такое сделать попроще и чтоб наглядность была?
А то не понятно, где источник данных при использовании @From1251или @From866.
И можно ли как-то так:
DBGrid1.Columns.Text := CP866toUTF8(Dbf1.Fields[i].OnGetText);
Len(DBGrid1.Columns.Text):=2*Len(Dbf1.Fields[i].OnGetText); //Двойная экранная длина для преобразований кодировок (в DBF ничего лишнего)
тут хоть видно откуда взять и куда положить. (Вот только не работает - фиг знает как туда обратиться в цикле по полям и записям или конкретно на Pointer к DBF).
Не программа, а какие-то клочки. ХЗ что за чем исполняется.
Какие куски кода в какие закоулки/свойства прописать нужно?
Может кто-то уже делал подобное?