Nomadic отвечает:
Откpываешь help и смотpишь:
....... var List:TStrings; ....... BEGIN ....... List.Add ( 'LANGDRIVER=db866ru0 '); ....... Session.ModifyDriver( 'DBASE', List ); ....... END; |
Это действие я пpовожy пеpед откpытием таблицы
Ivan Sboev
(2:5049/36.15)
Это о "русификации" таблицы. В таблицах 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.
[001270]