Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

область видимости   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.484 c
15-1189250138
Denis_
2007-09-08 15:15
2007.10.07
ПДД


3-1180579906
@dim
2007-05-31 06:51
2007.10.07
Блокировки в MS SQL


3-1180274821
Nic
2007-05-27 18:07
2007.10.07
Импортировать базу даненых в SQL Server 2000


2-1189438763
Jimmy
2007-09-10 19:39
2007.10.07
Собственная иконка своего компонента


4-1175630984
LuceferAB
2007-04-04 00:09
2007.10.07
как показать форму не отбирая фокуса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский