В том случае, когда вы собираетесь использовать содержимое текстового файла
таким образом, как будто он имеет поля, вам необходим файл схемы, содержащий
описание формата текстового файла и который необходим для осуществления вызовов
при работе с полями (Fields / FieldByName / Post / и др.). Ниже приводится код,
который вы можете использовать при создании своей программы:
{ Подразумеваем, что Table1 - файл, который мы хотим скопировать
в ASCII-файл. Используем TBatchMove, поскольку быстро работает.
Также это автоматически создаст файл схемы }procedure TForm1.Button1Click(Sender: TObject);
var
oDest: TTable;
oBMove: TBatchMove;
begintry
oDest := nil;
oBMove := nil;
Table1.Close;
oDest := TTable.Create(nil);
with oDest dobegin
DatabaseName := 'c:\delphi\files';
TableName := 'Test.Txt';
TableType := ttASCII;
end; {Обратите внимание на то, что нет необходимости вызывать CreateTable}
oBMove := TBatchMove.Create(nil);
with oBMove dobegin
Source := Table1;
Destination := oDest;
Mode := batCopy;
Execute;
end;
finallyif Assigned(oDest) then
oDest.Free;
if Assigned(oBMove) then
oBMove.Free;
end;
end;
{ Теперь, допустим, файл схемы существует;
сам текстовый файл может как быть, так его может и не быть.
С помощью файла схемы мы уже можем работать с полями }procedure TForm1.Button2Click(Sender: TObject);
var
oTxt: TTable;
i: Integer;
f: System.Text;
begintry
oTxt := nil;
ifnot FileExists('c:\delphi\files\Test.Txt') thenbegin
AssignFile(f, 'c:\delphi\files\Test.Txt');
Rewrite(f);
CloseFile(f);
end;
oTxt := TTable.Create(nil);
with oTxt dobegin
DatabaseName := 'c:\delphi\files';
TableName := 'Test.Txt';
TableType := ttASCII;
Open;
end;
with Table1 dobegin
DisableControls;
ifnot Active then
Open;
First;
whilenot EOF dobegin
oTxt.Insert;
{ В данном случае файл схемы описывает формат текстового файла; в этом
примере фактически один к одному воспроизводятся поля таблицы
в логическое определение полей в .sch-файле }for i := 0 to FieldCount - 1 do
oTxt.Fields[i].AsString := Fields[i].AsString;
oTxt.Post;
Next;
end;
end;
finally
Table1.EnableControls;
if Assigned(oTxt) then
oTxt.Free;
end;
end;
Here's the improved code with comments, meaningful variable names, error handling, and a loop in Button2Click:
procedureTForm1.Button1Click(Sender:TObject);vardestinationTable:TTable;batchMove:TBatchMove;begintry// Close the source tableTable1.Close;// Create a new table with the specified name and formatdestinationTable:=TTable.Create(nil);trywithdestinationTabledobeginDatabaseName:='c:\delphi\files';TableName:='Test.Txt';TableType:=ttASCII;end;batchMove:=TBatchMove.Create(nil);try// Set the source and destination tableswithbatchMovedobeginSource:=Table1;Destination:=destinationTable;Mode:=batCopy;Execute;end;finallybatchMove.Free;end;finallydestinationTable.Free;end;except// Handle any unexpected errorsShowMessage('An error occurred: '+GetExceptionMessage);end;end;procedureTForm1.Button2Click(Sender:TObject);vartextFile:TTable;fileHandle:Text;begintry// Check if the file exists, and create it if notifnotFileExists('c:\delphi\files\Test.Txt')thenbeginAssignFile(fileHandle,'c:\delphi\files\Test.Txt');Rewrite(fileHandle);CloseFile(fileHandle);end;textFile:=TTable.Create(nil);trywithtextFiledobeginDatabaseName:='c:\delphi\files';TableName:='Test.Txt';TableType:=ttASCII;Open;end;// Disable controls and open the source tableTable1.DisableControls;ifnotTable1.ActivethenTable1.Open;try// Read and write records using a loopwhilenotTable1.EOFdobegintextFile.Insert;fori:=0toTable1.FieldCount-1dotextFile.Fields[i].AsString:=Table1.Fields[i].AsString;textFile.Post;Table1.Next;end;finallyTable1.Next;// Move back to the first record after the loopend;// Enable controls and free the table objectTable1.EnableControls;finallytextFile.Free;end;except// Handle any unexpected errorsShowMessage('An error occurred: '+GetExceptionMessage);end;end;
Note that I've used meaningful variable names, added comments to explain what each section of code does, and included error handling using try-except blocks. In Button2Click, I've replaced the manual calls to First and Next with a loop that reads and writes records.
Статья описывает использование файлов схемы для работы с текстовыми файлами в программе на языке Delphi, обеспечивая возможность управления полями и операций над ними.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.