![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
область видимости [D7, WinXP]
artem779 © (2007-09-12 11:04:00)скажем у меня в программе есть продцедра
loger(line:string)
Она не делает ничего особенного. Просто выводит line в новой строке memoLog:TMemo .
Как сделать так, чтобы не надо было этот самый memoLog передававть в процедуру в качестве параметра, а чтобы он сам находил этот самый memoLog ?
Kolan (2007-09-12 13:23:00) [1]
> с кучей недороаботок
И кроме того он даже работать не будет тк надо конструктор с деструктором добавить но это дом. задание.
Kolan (2007-09-12 13:22:00) [2]> по идее, логгер не должен знать ни про какие объекты
+1
Логгер надо сдеалть объектом. Хотябы таким:
TLogger = class
private
FLog: TStrings;
FChangeEvent: TNotifyEvent;
public
procedure Add(S: string);
property Log: TStrings read FLog;
property OnChange: TNotifyEvent read FChangeEvent write FChangeEvent;
end;
procedure TLogger.Add(S: string);
begin
FLog.Add(S);
if Assigned(FChangeEvent) then
FChangeEvent(Self);
end;
А в обработчике OnChange экземпляра TLogger:
begin
if Sender is TLogger then
begin
memoLog.Lines.Clear;
memoLog.Lines.AddStrings((Sender as TLogger).Log)
end;
end;
Это минимальный пример с кучей недороаботок, не оптимальный и кроме того лучьше пользовать не событие, а реализовать паттерн Observer.
clickmaker (2007-09-12 12:46:00) [3]
> [8] Anatoly Podgoretsky © (12.09.07 12:29)
ну я делал так
procedure LogAction(ActionType: TActionType; const Msg: string);
var
dwBytesWritten: Cardinal;
DateStr, MsgText: string;
begin
LogSection.Enter;
try
DateTimeToString(DateStr, 'dd.mm.yy hh:nn:ss.zzz', Now);
MsgText := Format('%s'#9'%d'#9'%s'#9'%s', [DateStr, GetCurrentThreadID, ActionTypes[ActionType], Msg]) + CRLF;
WriteFile(hLogFile, MsgText[1], Length(MsgText), dwBytesWritten, nil);
finally
LogSection.Leave;
end;
end;
procedure LogError(E: Exception);
begin
if LogErrors and Assigned(E) then
LogAction(atError, E.Message);
end;
procedure LogObjectAction(ActionType: TActionType; const Msg: string; Obj: TObject);
begin
if Assigned(Obj) then
LogAction(ActionType, Format('%s; Object: %s', [Msg, IntToHex(integer(Obj), 4)]))
else
LogAction(ActionType, Msg);
end;
Сергей М. (2007-09-12 12:33:00) [4]
> artem779 © (12.09.07 12:30) [9]
> это просто процедура, которая должна полиять на состояние
> ряда объектов в зависимости от line
Каких таких "объектов" ? Что ты нам мозги пудришь ?)
Цитирую тебя:
> не делает ничего особенного. Просто выводит line в новой
> строке memoLog:TMemo
Где тут объект Ы?
Я вижу только один)
artem779 (2007-09-12 12:32:00) [5]ок, спасибо!! ))
artem779 (2007-09-12 12:30:00) [6]loger(line:string) это то же что и логгер =)
это просто процедура, которая должна полиять на состояние ряда объектов в зависимости от line . И мне бы не хотелось перечислять эти объекты в параметрах процедуры. Возможно ли как то решить эту проблему ?
Anatoly Podgoretsky (2007-09-12 12:29:00) [7]
> Ему нужно передавать строку. Или объект типа Exception,
> к примеру
Только строку, поскольку могут регистрировать обычные текстовые сообщения, а не исключения.
Slym (2007-09-12 12:28:00) [8]
unit logerunit;
interface
uses StdCtrls;
procedure loger(const line:string);
procedure RegisterLoggetOutput(memo:TMemo);
implementation
var Output:TMemo=nil;
procedure loger(const line:string);
begin
if assigned(Output) then
Output.Lines.Add(line);
end;
procedure RegisterLoggetOutput(memo:TMemo);
begin
Output:=memo;
end;
end.
Плохиш (2007-09-12 12:25:00) [9]
> Посоветуйте что-нить, люди добрые
Наймите программиста.
Сергей М. (2007-09-12 12:22:00) [10]Я не понял, чем "логер" отличается от "процедура loger()"..
Приведи фрагмент кода ..
clickmaker (2007-09-12 12:17:00) [11]
> есть несколько объектов, с которыми должен работать логер
по идее, логгер не должен знать ни про какие объекты
Ему нужно передавать строку. Или объект типа Exception, к примеру
artem779 (2007-09-12 12:11:00) [12]есть несколько объектов, с которыми должен работать логер. в то же время, сама процедура loger() часто вызывается из других процедур или функций. передавать в них названия всех этих объектов, только чтобы отобразить их в параметрах от которых работает логер, по меньшей мере глупо.
Посоветуйте что-нить, люди добрые ))
Denis_ (2007-09-12 12:02:00) [13]А зачем собственно? :) memoLog.Lines.Add(line) не судьба сделать?
Сергей М. (2007-09-12 11:18:00) [14]
> Как сделать
А не надо так делать.
Завтра тебе взбредет в голову изменить имя Мемо-компонента на другое (или использовать другой Мемо-компонент для вывода лога) и тебе придется переделывать процедуру loger для отражения изменений.