![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вызвать B из A
начинающий1993 © (2011-01-11 16:26:00)как можно в процедуре A вызвать процедуру B, которая объявлена позже. Можно ли обойтись без объявления перед используемой процедурой.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure A;
begin
B;
end;
procedure B;
begin
ShowMessage('B');
end;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Медвежонок ХМЛ (2011-01-11 17:30:00) [1]Гибчее вместо всей этой дури написать одну функцию перебора узлов по переданному ей выражению xpath
и несколько специфичных callback функций для конкретных проверок-модификаций.
Плохиш (2011-01-11 17:26:00) [2]
> procedure WorkXMLLoad(const AFileName: string);
>
совместить с конструктором
> TestWorkXMLAnalyseErrorHandling(Msg);
>
добавить два параметра старое и новое значение и выкинуть ерунду написанную в описании в скобках
Ega23 (2011-01-11 17:24:00) [3]
TTestWorkXML = class(TObject)
private
FWorkXML: TXMLDocument;
procedure WorkXMLLoad(const AFileName: string);
public
constructor Create(const AFileName: string);
function WorkXMLAnalyseErrorHandling: string;
procedure WorkXMLSave;
end;
использование класса:
with TTestWorkXML.Create('Work.xml') do
try
WriteLn(AnalyseErrorHandling);
Save('Work.xml');
finally
Free;
end;
начинающий1993 (2011-01-11 17:19:00) [4]Задача: Открыть xml-файл, пройти по всем узлам, включая вложенные, проверить значение атрибута "error_handling", если значение равно "critical" заменить его на "not_critical" (В будущем таких проверок может быть больше, на каждую проверку отдельная процедура). Если файл был изменен, сохранить изменения.
Основные процедуры:
WorkXMLLoad(const AFileName: string); // загружает XML-файл в объект TXMLDocument
WorkXMLAnalyseErrorHandling; // анализирует содержимое XML-файла
WorkXMLSave; // сохраняет изменения
Сначала думал объединить все в класс.
TTestWorkXML = class(TObject)
private
FWorkXML: TXMLDocument;
public
constructor Create;
procedure WorkXMLLoad(const AFileName: string);
procedure WorkXMLAnalyseErrorHandling(out AMsg: string);
procedure WorkXMLSave;
end;
использование класса:
TestWorkXML := TTestWorkXML.Create;
try
TestWorkXML.WorkXMLLoad('Work.xml');
TestWorkXMLAnalyseErrorHandling(Msg);
WriteLn(Msg);
TestWorkXMLSave('Work.xml');
finally
TestWorkXML.Free;
end;
Ega23 (2011-01-11 16:58:00) [5]
> Может объединить все процедуры в один класс?
Может и объединить. А может и нет.
Всё зависит от задачи.
начинающий1993 (2011-01-11 16:50:00) [6]
> у меня консольное приложение и несколько взаимосвязанных
> процедур
приложение по сути разбирает xml-файл (для этого используются написанные процедуры) и выводит WriteLn сообщения. Может объединить все процедуры в один класс?
sniknik (2011-01-11 16:47:00) [7]правильнее их взаиморазвязать
начинающий1993 (2011-01-11 16:43:00) [8]а как будет правильнее, у меня консольное приложение и несколько взаимосвязанных процедур
Amoeba_ (2011-01-11 16:41:00) [9]
> как можно в процедуре A вызвать процедуру B, которая объявлена
> позже.
Так, просто объявив ее без реализации, но с директивой forward:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure B; forward;
procedure A;
begin
B;
end;
procedure B;
begin
ShowMessage('B');
end;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
MBo (2011-01-11 16:37:00) [10]можно использовать ключевое слово forward
Закончивший давно (2011-01-11 16:37:00) [11]Можно.
Если B в другом модуле и если он в юзес