TextFile
Я реализовал работу со структурой TextFile следующим образом
unit Un_FsTextFile;
interface
implementation
uses SysUtils, Classes,
fs_iinterpreter, fs_itools;
type
TFunctions = class(TObject)
private
function CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; var Params: Variant): Variant;
public
constructor Create;
destructor Destroy; override;
end;
PTextFile = ^TextFile;
var
Functions: TFunctions;
TextFileList: TList;
{ TFunctions }
constructor TFunctions.Create;
begin
TextFileList:= TList.Create;
with fsGlobalUnit do
begin
AddedBy:= Self;
AddType('TextFile',fvtInt);
AddMethod('proceudre AssignFile(var F: TextFile,FileName: string)',CallMethod,'ctFile');
AddMethod('procedure Rewrite(var F: TextFile)',CallMethod,'ctFile');
AddMethod('procedure CloseFile(var F: TextFile)',CallMethod,'ctFile');
AddMethod('procedure WriteLn(var F: TextFile;StrLine: string)',CallMethod,'ctFile');
AddedBy:= nil;
end;
end;
destructor TFunctions.Destroy;
begin
TextFileList.Free;
if fsGlobalUnit <> nil then
fsGlobalUnit.RemoveItems(Self);
inherited;
end;
function TFunctions.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; var Params: Variant): Variant;
var
ATextFile: PTextFile;
begin
if ClassType=nil then
begin
if MethodName='ASSIGNFILE' then
begin
New(ATextFile);
Params[0]:= TextFileList.Add(ATextFile);
AssignFile(ATextFile^,String(Params[1]))
end
else if MethodName='REWRITE' then
begin
ATextFile:= TextFileList.Items[Integer(Params[0])];
Rewrite(ATextFile^);
end
else if MethodName='CLOSEFILE' then
begin
ATextFile:= TextFileList.Items[Integer(Params[0])];
CloseFile(ATextFile^);
Dispose(ATextFile);
end
else if MethodName='WRITELN' then
begin
ATextFile:= TextFileList.Items[Integer(Params[0])];
WriteLn(ATextFile^,String(Params[1]));
end
end
end;
initialization
Functions := TFunctions.Create;
finalization
Functions.Free;
end.
Может есть другой вариантик , потому что , хоть и не сильно (практически нет), но засоряется лишними элементами TList , после закрытия файла - удалить не могу , так как работаю по номеру в TList
unit Un_FsTextFile;
interface
implementation
uses SysUtils, Classes,
fs_iinterpreter, fs_itools;
type
TFunctions = class(TObject)
private
function CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; var Params: Variant): Variant;
public
constructor Create;
destructor Destroy; override;
end;
PTextFile = ^TextFile;
var
Functions: TFunctions;
TextFileList: TList;
{ TFunctions }
constructor TFunctions.Create;
begin
TextFileList:= TList.Create;
with fsGlobalUnit do
begin
AddedBy:= Self;
AddType('TextFile',fvtInt);
AddMethod('proceudre AssignFile(var F: TextFile,FileName: string)',CallMethod,'ctFile');
AddMethod('procedure Rewrite(var F: TextFile)',CallMethod,'ctFile');
AddMethod('procedure CloseFile(var F: TextFile)',CallMethod,'ctFile');
AddMethod('procedure WriteLn(var F: TextFile;StrLine: string)',CallMethod,'ctFile');
AddedBy:= nil;
end;
end;
destructor TFunctions.Destroy;
begin
TextFileList.Free;
if fsGlobalUnit <> nil then
fsGlobalUnit.RemoveItems(Self);
inherited;
end;
function TFunctions.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; var Params: Variant): Variant;
var
ATextFile: PTextFile;
begin
if ClassType=nil then
begin
if MethodName='ASSIGNFILE' then
begin
New(ATextFile);
Params[0]:= TextFileList.Add(ATextFile);
AssignFile(ATextFile^,String(Params[1]))
end
else if MethodName='REWRITE' then
begin
ATextFile:= TextFileList.Items[Integer(Params[0])];
Rewrite(ATextFile^);
end
else if MethodName='CLOSEFILE' then
begin
ATextFile:= TextFileList.Items[Integer(Params[0])];
CloseFile(ATextFile^);
Dispose(ATextFile);
end
else if MethodName='WRITELN' then
begin
ATextFile:= TextFileList.Items[Integer(Params[0])];
WriteLn(ATextFile^,String(Params[1]));
end
end
end;
initialization
Functions := TFunctions.Create;
finalization
Functions.Free;
end.
Может есть другой вариантик , потому что , хоть и не сильно (практически нет), но засоряется лишними элементами TList , после закрытия файла - удалить не могу , так как работаю по номеру в TList
Комментарии
А зачем тебе вообще эта экзотика с AssignFile и прочим WriteLn? Я, например, ей не пользовался кажись со времени ТурбоПаскаля. ИМХО TStringList и TxxxStream должно вполне хватать и гораздо удобнее. Обертки на все это в FS есть, если чего не хватает можно довернуть. Поправь меня, если я ошибаюсь
Поправь если не такать.
Давай разберемся, что действительно нужно? Я не думаю, что у тебя стоит задача обучать юзеров стандартному паскалю, да и скажи на милость, что на нем можно сделать без добавления библиотечных ф-ций? Добавь необходимость минимального документирования этих ф-ций и отними отутствие струтур и прочие ограничения ФС...
Скорей всего нужно решение задач из какой-то конкретной предметной области. Мы даем специалисту в данной области предметно-ориентированное, сверхвысокоуровневое, интуитивно понятное ему средство и все ОК. Пример - бизнесмену нужно узнать сколько получено прибыли за период, и он пишет на SQL почти как он писал бы на родном английском:
select sum(profit) from sales where sales_date beween '01.01.04' and '31.03.04'
Другой пример - бухгалтеру нужно развернутое сальдо и он пишет в 1С, почти как на родном русском: Правда здорово? Ни хрена не здорово!!! Потому что, как только запрос чуть сложнее чем select * from приходится обращаться к программисту БД, а бухгалтера, прошедшие курсы программирования 1С рисуют процедуры ПриПроведении документа в 1000(!) строк, в которых черт ногу сломит на вложенных Если... Это кстати т.н. сверхвысокоуровневое программирование, да профи на ассемблере написал бы более компактный и структурированный код. Какой же выход? На деле имеем жесткое разделение труда - каждый должен заниматься своим делом и внятно ставить задачи для специалистов в других областях. Таким образом на стороне конечного пользователя видится 2 крайних варианта - 1) нашим софтом никто не занимается по причине отсутствия подходящих кандидатур, или же софт настолько безобразен в обслуживании 2) этим занимается вменяемый человек с алгоритмическим мышлением, понимающий суть проблем - по сути ПРОГРАММИСТ.
В 1м случае или нас постоянно дергают или софт умирает сам собой, во 2м случае, при добротно написаном софте и минимальной поддержке с нашей стороны программист прекрасно со всем справится. 1 случай не рассматриваем, как писать для 2го? Да так, чтобы самим в 1ю очередь было удобно этим пользоваться, тогда есть шанс на долгую жизнь софта. Вот фаст-репортовцы молодцы - насколько я знаю ФР писался для своих нужд, и с ним работать можно, по крайней мере лучше, чем с кривым QuickReport'ом или Rave'ом. Таких примеров много - тот же РНР, UNIX вообще вырос из написания игры
Ну я нафлудил однако - накипело...))
Возвращаясь к топику, ИМНО попытка калькирования в лоб стандартных паскалевских рутин, а тем более WinAPI не есть хорошо, да и средствами ФС не решаемо, а вот хорошо продуманные удобные обьекты-обертки облегчат жизнь и себе и ПОЛЬЗОВАТЕЛЯМ КОНЦА(С).
(все права на вольный перевод end-user принадлежат автору, т.е мне - в т.ч варианты: ПОЛЬЗОВАТЕЛИ-ТЕРМИНАТОРЫ и просто ВРЕДОВАТЕЛИ 8-) )