Как программно изменить LangDriver для таблиц dBase и Paradox

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: 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.

{/codecitation}

Добавить комментарий