Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

*.dbf => функция смены кодировки => отобразить в гриде ? [D7, dBase, FoxPro]


DancerMan ©   (2006-03-03 10:45:00) 

Приветствую всех!
DBF, ADOConnection.
Информация в *.dbf хранится в одной кодировке.
Есть функция перекодирования.
В TDBGrid необходимо отобразить уже в перекодированном виде.
В ADOQuery на событие AfterOpen пишу такое:
   ADOQuery.First;
   while not ADOQuery.Eof do
   begin
     ADOQuery.Edit;
     MainGrid.Fields[0].AsString :=
     ConvertEncoding(
     ADOQuery.FieldByName('TMCNAME').AsString,  
     cmOemDosToAnsi);
     ADOQuery.Post;
     ADOQuery.Next;
   end;
В dbf информацию менять не надо, но если не пишу       ADOQuery.Edit, то пишет, что DataSet не в режиме вставки или редактирования. А так на Post пишет, что не достаточно сведений ключевого поля для обновления.
Просьба предложить свои варианты решения задачи. Спасибо.


sniknik   (2006-03-03 13:54:00) [1]

> Кстати, и цикл - лишний :)
естественно. один пункт с другим не пересекается.  а если воспользоваться пунктами 1 или 2 то это просто настройки (установка 1-го свойства), тут и приведенный в > DancerMan ©   (03.03.06 13:31) [3]
код будет лишним. и фукция ConvertEncoding тоже.


DancerMan   (2006-03-03 13:31:00) [2]


> + ADODataSet.Post; в приведенном цикле лишний, он в любом
> случае делается при Next;


Кстати, и цикл - лишний :)

Вот так работает. Спасибо за помощь!

procedure TMainForm.ADOQueryAfterOpen(DataSet: TDataSet);
begin
 MainGrid.Fields[0].OnGetText := MyGetText;
end;

procedure TMainForm.MyGetText(Sender: TField; var Text: string; DisplayText: Boolean);
begin
 Text:= ConvertEncoding(Sender.AsString, cmOemDosToAnsi);
end;


sniknik   (2006-03-03 11:48:00) [3]

решений несколько, например
1 установить у фонта в гриде кодировку OEM_CHARSET (или какая она у тебя в таблице. чтобы совпадало)

2 настроить автоматическую перекодировку у движка (jet, или что там у тебя используется... в выдержке обрати внимание на упоминание о BDE)
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase
DataCodePage
Этот параметр используется только в том случае, если на данном компьютере не установлено приложение BDE.
Определяет способ сохранения текстовых страниц. Возможные значения:

OEM — Преобразования из OEM в ANSI и из ANSI в OEM выполняются.
ANSI — Преобразования из OEM в ANSI и из ANSI в OEM не выполняются.

По умолчанию задается значение «OEM». Значения имеют тип String в Windows 95 и Windows NT 4.0 или тип REG_SZ в Windows NT 3.51.


3 подменять (перекодировать) только то что отображается "руками", можно использовать вычисляемое поле например (показывать его естественно), либо у самого поля события OnGetText/OnSetText (второе не нужно если не собираешся сохранять из грида)

4 твой путь, перекодировка всего рекордсета вручную
в выборку обязательно должно входить ключевое поле (не только потому что не дает записать по причине "не достаточно сведений ключевого поля для обновления", но и по тому что по ключу идентификация записи быстрее и однозначнее)
чтобы давало редактировать рекодсет не трогая таблицу надо открыть ее в режиме ltBatchOptimistic и не делать UpdateBatch. (почитай в общем про режим кешированных изменений. ключевые слова + F1)

или "оторвать" рекордсет от конекта (ADODataSet.Connection:= nil), после этого изменения "оригинала" из этого рекордсета становятся недоступны совсем.

+ ADODataSet.Post; в приведенном цикле лишний, он в любом случае делается при Next;

5 хз. надоело "напрягаться", но наверняка есть еще чтото  (например сменить тип базы на ту у которой колайтионы выставляются... и т.д.)


clickmaker   (2006-03-03 11:20:00) [4]

TField.OnGetText


Наверх

Титульная страница Поиск, карта сайта Написать письмо