unit Cdbascii;
interfaceuses
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;
procedureRegister;
implementationuses DBConsts;
procedureRegister;
begin
RegisterComponents('Data Access', [TAsciiDelimTable]);
end;
constructor TAsciiDelimTable.Create(AOwner: TComponent);
begininherited Create(AOwner);
Exclusive := True;
TableType := ttASCII;
fQuote := '"';
fDelim := ',';
end;
destructor TAsciiDelimTable.Destroy;
begininherited Destroy;
end;
{ Рабочий код }function CheckOpen(Status: DBIResult): Boolean;
begincase Status of
DBIERR_NONE:
Result := True;
DBIERR_NOTSUFFTABLERIGHTS:
beginifnot 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;
beginif TableName = '' then
DBError(SNoTableName);
AnsiToNative(DBLocale, TableName, STableName, SizeOf(STableName) - 1);
StrPCopy(SDriverType, 'ASCIIDRV-' + Quote + '-' + Delim);
Result := nil;
whilenot CheckOpen(DbiOpenTable(DBHandle, STableName, SDriverType,
nil, nil, 0, OpenModes[ReadOnly], ShareModes[Exclusive],
xltField, False, nil, Result)) do{Повтор}
;
end;
procedure TAsciiDelimTable.SetQuote(newValue: Char);
beginif Active then{ DBError(SInvalidBatchMove); };
fQuote := newValue;
end;
procedure TAsciiDelimTable.SetDelim(newValue: Char);
beginif Active then{ DBError(SInvalidBatchMove); };
fDelim := newValue;
end;
end.
Программный файл Delphi Pascal для пользовательского компонента базы данных TAsciiDelimTable, который позволяет читать и записывать данные из текстовых файлов, разделенных ASCII-символами. Вот обзор кода:
Интерфейс
Секция интерфейса объявляет класс TAsciiDelimTable, который наследуется от TTable. В ней также определены несколько процедур и функций:
CreateHandle: создает новый handle для базы данных
SetQuote и SetDelim: устанавливают символы цитаты и разделителей для таблицы
CheckOpen: проверяет, открыта ли база данных, и возвращает булевое значение
Имплементация
Секция имплементации содержит код для процедур и функций, объявленных в интерфейсе:
RegisterComponents: регистрирует компонент TAsciiDelimTable в палетке Delphi
Create и Destroy: конструктор и деструктор методы класса TAsciiDelimTable
CheckOpen: проверяет, открыта ли база данных, и возвращает булевое значение
SetQuote и SetDelim: устанавливают символы цитаты и разделителей для таблицы
Конструктор
Метод Create инициализирует свойства компонента, включая установку режима эксклюзивного доступа и типа таблицы в ASCII.
Деструктор
Метод Destroy вызывает метод деструктора, наследуемый от класса TTable, для освобождения системных ресурсов, используемых компонентом.
Работающий код
Функция CheckOpen проверяет, открыта ли база данных, и возвращает булевое значение. Она также записывает сообщение об ошибке с помощью процедуры DbiError, если база данных не открыта.
Функция CreateHandle создает новый handle для базы данных с помощью функции DbiOpenTable. Она принимает несколько параметров, включая имя таблицы, тип драйвера и режим. Функция возвращает handle для базы данных или nil, если произошла ошибка.
SetQuote и SetDelim
Процедуры устанавливают символ цитаты и разделителя для таблицы. Если компонент активен (то есть подключен к базе данных), они записывают сообщение об ошибке с помощью процедуры DBError.
В целом, этот код предоставляет пользовательский компонент базы данных, который позволяет читать и записывать данные из текстовых файлов, разделенных ASCII-символами. Он включает в себя функциональность для создания и управления соединениями с базой данных, установки символов цитаты и разделителя, а также проверки, открыта ли база данных.
Импорт CSV-файла в Delphi с помощью компонента TAsciiDelimTable.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.