Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.021 c
3-1180656933
Resident Evil
2007-06-01 04:15
2007.10.07
fibplus и employee


15-1189092894
Floppy
2007-09-06 19:34
2007.10.07
Создание ярлыка


15-1189059128
Ega23
2007-09-06 10:12
2007.10.07
умер Лучиано Паваротти


15-1189315977
Не пират
2007-09-09 09:32
2007.10.07
USB как работать с ними? Команды и т.д.


2-1189508158
Korneley
2007-09-11 14:55
2007.10.07
Неясности с отрисовкой SubItem у ListView