Как программно изменить LangDriver для таблиц dBase и Paradox
Автор: Nomadic
Откpываешь help и смотpишь:
.......
var List:TStrings;
.......
BEGIN
.......
List.Add ( 'LANGDRIVER=db866ru0 ');
.......
Session.ModifyDriver( 'DBASE', List );
.......
END;
|
Это действие я пpовожy пеpед откpытием таблицы
Автор: Ivan Sboev
Это о "русификации" таблицы. В таблицах dBase и Paradox имеется байт, который
определяет CodePage содержимого таблицы. Раньше он не использовался и был
зарезервирован. Тебе нужно его правильно установить. Это делается через DBD
Restructure table. Если хочешь программно, можешь воспользоваться следующей
процедурой:
uses DbiTypes, DbiProcs, DbiErrs, DB, WinProcs, SysUtils;
procedure ChangeLangDriver(DatabaseName, TableName, LDName: string);
var
TblExt: string;
Database: TDatabase;
TblDesc: CRTblDesc;
OptDesc: FLDDesc;
OptData: array[0..250] of Char;
Cur: hDBICur;
Rec: CFGDesc;
begin
if (TableName = '') or (LDName = '') then
raise Exception.Create('Unknown TableName or LDName');
Database := Session.OpenDatabase(DatabaseName);
try
if Database.IsSQLBased then
raise Exception.Create(
'Function ChangeLangDriver working only with dBase or Paradox tables');
FillChar(OptDesc, SizeOf(OptDesc), #0);
FillChar(TblDesc, SizeOf(TblDesc), #0);
StrCopy(OptDesc.szName, 'LANGDRIVER');
OptDesc.iLen := Length(LDName) + 1;
with TblDesc do
begin
StrPCopy(szTblName, TableName);
TblExt := UpperCase(ExtractFileExt(TableName));
if TblExt = 'DBF' then
StrCopy(szTblType, szDbase)
else if TblExt = '.DB' then
StrCopy(szTblType, szParadox)
else
begin
AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData);
if DbiOpenCfgInfoList(nil, dbiREADONLY, cfgPersistent,
StrPCopy(OptData, '\DATABASES\' + StrPas(OptData) + '\DB INFO\')
Cur) <> DBIERR_NONE then
raise Exception.Create('Unknown table type');
try
while DbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil) <> DBIERR_EOF do
if StrComp(Rec.szNodeName, 'DEFAULT DRIVER') = 0 then
begin
StrCopy(szTblType, Rec.szValue);
Break;
end;
finally
Check(DbiCloseCursor(Cur));
end;
end;
iOptParams := 1;
pfldOptParams := @OptDesc;
pOptData := @OptData;
end;
StrPCopy(OptData, LDName);
Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil,
nil, nil, False));
finally
Session.CloseDatabase(Database);
end;
end;
|
Примеры использования:
ChangeLangDriver( 'DBDEMOS', 'EMPLOYEE', 'ancyrr' );
ChangeLangDriver( 'DBDEMOS', 'EMPLOYEE.DB', 'ancyrr' );
ChangeLangDriver( 'C:\DELPHI\DEMOS\DATA', 'CLIENTS.DBF', 'db866ru0' );
|
LDName: для D1 - имя .LD файла в каталоге IDAPI\LANGDRV; для D2 и
CB - из BDECFG32.HLP поле Short name в табличке по указателю language drivers,
dBASE или поле Internal в табличке по указателю language drivers,
Paradox; для D3 и выше - не знаю так как у меня её нет, но думаю, что также,
как и в D2.
|