Текущий архив: 2007.10.07;
Скачать: CL | DM;
Вниз
область видимости Найти похожие ветки
← →
artem779 © (2007-09-12 11:04) [0]скажем у меня в программе есть продцедра
loger(line:string)
Она не делает ничего особенного. Просто выводит line в новой строке memoLog:TMemo .
Как сделать так, чтобы не надо было этот самый memoLog передававть в процедуру в качестве параметра, а чтобы он сам находил этот самый memoLog ?
← →
Сергей М. © (2007-09-12 11:18) [1]
> Как сделать
А не надо так делать.
Завтра тебе взбредет в голову изменить имя Мемо-компонента на другое (или использовать другой Мемо-компонент для вывода лога) и тебе придется переделывать процедуру loger для отражения изменений.
← →
Denis_ © (2007-09-12 12:02) [2]А зачем собственно? :) memoLog.Lines.Add(line) не судьба сделать?
← →
artem779 © (2007-09-12 12:11) [3]есть несколько объектов, с которыми должен работать логер. в то же время, сама процедура loger() часто вызывается из других процедур или функций. передавать в них названия всех этих объектов, только чтобы отобразить их в параметрах от которых работает логер, по меньшей мере глупо.
Посоветуйте что-нить, люди добрые ))
← →
clickmaker © (2007-09-12 12:17) [4]
> есть несколько объектов, с которыми должен работать логер
по идее, логгер не должен знать ни про какие объекты
Ему нужно передавать строку. Или объект типа Exception, к примеру
← →
Сергей М. © (2007-09-12 12:22) [5]Я не понял, чем "логер" отличается от "процедура loger()"..
Приведи фрагмент кода ..
← →
Плохиш © (2007-09-12 12:25) [6]
> Посоветуйте что-нить, люди добрые
Наймите программиста.
← →
Slym © (2007-09-12 12:28) [7]
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.
← →
Anatoly Podgoretsky © (2007-09-12 12:29) [8]
> Ему нужно передавать строку. Или объект типа Exception,
> к примеру
Только строку, поскольку могут регистрировать обычные текстовые сообщения, а не исключения.
← →
artem779 © (2007-09-12 12:30) [9]loger(line:string) это то же что и логгер =)
это просто процедура, которая должна полиять на состояние ряда объектов в зависимости от line . И мне бы не хотелось перечислять эти объекты в параметрах процедуры. Возможно ли как то решить эту проблему ?
← →
artem779 © (2007-09-12 12:32) [10]ок, спасибо!! ))
← →
Сергей М. © (2007-09-12 12:33) [11]
> artem779 © (12.09.07 12:30) [9]
> это просто процедура, которая должна полиять на состояние
> ряда объектов в зависимости от line
Каких таких "объектов" ? Что ты нам мозги пудришь ?)
Цитирую тебя:
> не делает ничего особенного. Просто выводит line в новой
> строке memoLog:TMemo
Где тут объектЫ ?
Я вижу только один)
← →
clickmaker © (2007-09-12 12:46) [12]
> [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;
← →
Kolan © (2007-09-12 13:22) [13]> по идее, логгер не должен знать ни про какие объекты
+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.
← →
Kolan © (2007-09-12 13:23) [14]
> с кучей недороаботок
И кроме того он даже работать не будет тк надо конструктор с деструктором добавить — но это дом. задание.
Страницы: 1 вся ветка
Текущий архив: 2007.10.07;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.032 c