unit
Cdbascii;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
Controls,
Forms, Dialogs, DbiErrs, DbiTypes, DbiProcs, DB,
DBTables;
type
TAsciiDelimTable = class(TTable)
private
{ Private declarations }
fQuote :Char;
fDelim :Char;
protected
{ Protected declarations }
function CreateHandle: HDBICur; override;
Procedure SetQuote(newValue :Char);
Procedure SetDelim(newValue :Char);
public
{ Public declarations }
constructor Create(AOwner: TComponent);
override;
destructor Destroy; override;
{ Эти свойства не должны больше публиковаться
}
property IndexFieldNames;
property IndexName;
property MasterFields;
property MasterSource;
property UpdateMode;
published
{ Published declarations }
Property Quote:Char Read fQuote Write
setQuote Default '"';
Property Delim:Char Read fDelim Write
setDelim Default ',';
end;
procedure
Register;
implementation
uses
DBConsts;
procedure Register;
begin
RegisterComponents('Data Access',
[TAsciiDelimTable]);
end;
constructor
TAsciiDelimTable.Create(AOwner: TComponent);
Begin
Inherited Create(AOwner);
Exclusive:=True;
TableType:=ttASCII;
fQuote := '"';
fDelim := ',';
End;
destructor
TAsciiDelimTable.Destroy;
Begin
Inherited Destroy;
End;
{ Рабочий код }
function CheckOpen(Status:
DBIResult): Boolean;
begin
case Status of
DBIERR_NONE:
Result := True;
DBIERR_NOTSUFFTABLERIGHTS:
begin
if not Session.GetPassword then DbiError(Status);
Result := False;
end;
else
DbiError(Status);
end;
end;
function
TAsciiDelimTable.CreateHandle: HDBICur;
const
OpenModes: array[Boolean] of DbiOpenMode =
(dbiReadWrite, dbiReadOnly);
ShareModes: array[Boolean] of DbiShareMode =
(dbiOpenShared, dbiOpenExcl);
var
STableName: array[0..SizeOf(TFileName) - 1] of
Char;
SDriverType: array[0..12] of Char;
begin
if TableName = '' then
DBError(SNoTableName);
AnsiToNative(DBLocale, TableName, STableName, SizeOf(STableName) -
1);
StrPCopy(SDriverType, 'ASCIIDRV-'+Quote+'-'+Delim);
Result := nil;
while not CheckOpen(DbiOpenTable(DBHandle, STableName,
SDriverType,
nil, nil, 0,
OpenModes[ReadOnly], ShareModes[Exclusive],
xltField, False, nil, Result)) do {Повтор};
end;
Procedure
TAsciiDelimTable.SetQuote(newValue :Char);
Begin
If Active Then
{ DBError(SInvalidBatchMove);
};
fQuote := newValue;
End;
Procedure
TAsciiDelimTable.SetDelim(newValue :Char);
Begin
If Active Then
{ DBError(SInvalidBatchMove);
};
fDelim := newValue;
End;
end.