Текущий архив: 2006.04.23;
Скачать: CL | DM;
Вниз*.dbf => функция смены кодировки => отобразить в гриде ? Найти похожие ветки
← →
DancerMan © (2006-03-03 10:45) [0]Приветствую всех!
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 пишет, что не достаточно сведений ключевого поля для обновления.
Просьба предложить свои варианты решения задачи. Спасибо.
← →
clickmaker © (2006-03-03 11:20) [1]TField.OnGetText
← →
sniknik © (2006-03-03 11:48) [2]решений несколько, например
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 хз. надоело "напрягаться", но наверняка есть еще чтото (например сменить тип базы на ту у которой колайтионы выставляются... и т.д.)
← →
DancerMan © (2006-03-03 13:31) [3]
> + 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 13:54) [4]> Кстати, и цикл - лишний :)
естественно. один пункт с другим не пересекается. а если воспользоваться пунктами 1 или 2 то это просто настройки (установка 1-го свойства), тут и приведенный в > DancerMan © (03.03.06 13:31) [3]
код будет лишним. и фукция ConvertEncoding тоже.
Страницы: 1 вся ветка
Текущий архив: 2006.04.23;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.012 c