Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.26;
Скачать: CL | DM;

Вниз

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

 
Lu Chan ©   (2003-06-10 15:21) [0]

Уважемые, кто чем может помогите будь ласка!
Создаю свой объект во время работы:
Cln := TSignalClientSocket.Create(True);
И присваиваю обработку события:
Cln.OnGotMessage := OnServerMessage;
При обработке OnServerMessage не вызывается обработка OnGotMessage для родительского класса, и inherited в не помогает.


 
Digitman ©   (2003-06-10 16:01) [1]


> При обработке OnServerMessage не вызывается обработка OnGotMessage
> для родительского класса, и inherited в не помогает.


ничего непонятно.

прокомментируй в коде.


 
Lu Chan ©   (2003-06-10 16:32) [2]

Сначала создаю объект:

procedure TfrmClient.btConnectClick(Sender: TObject);
begin
Cln := TSignalClientSocket.Create(True);

// Нельзя присваивать события так как не наследуются события класса!!!!
//Cln.FTPGetCompleted := GotFileFromFtp;
//Cln.OnDisconect := DisconnectServer;
//Cln.OnGotMessage := OnServerMessage;

Cln.Host := edHost.Text;
Cln.Port := StrToInt(edPort.Text);
Cln.User := edUserName.Text;

...

end;

procedure TfrmClient.OnServerMessage(Msg : string);
begin
inherited; // Хотел чтобы OnServerMessage учитывала код описанный в TSignalClientSocket.OnGotMessage, А она зараза учитывает только дальнейшие строки->
meServer.Lines.Add(DateTimeToStr(Now));
meServer.Lines.Add(Msg);
end;

А я хочу добится чтобы сначала вызывалось TSignalClientSocket.OnGotMessage а затем OnServerMessage. Может я как-то не правильно присваиваю события???


 
Digitman ©   (2003-06-10 17:07) [3]

а каким образом и в какой момент свойству-событию OnGotMessage() у тебя назначается обработчик OnServerMessage() ? У тебя же - run-time ?


 
Lu Chan ©   (2003-06-10 17:25) [4]

Это я для показательности здесь закоментировал, но дело в том что если убрать следующие коментарии ->
//Cln.OnGotMessage := OnServerMessage;

то в OnServerMessage выполняются все строки кроме inherited;. То есть TSignalClientSocket.OnGotMessage не выполняется. А если закоментировать то как сам понимаешь OnServerMessage не выполняется, зато выполняется TSignalClientSocket.OnGotMessage.

А мне к сожалению нужно и то и другое, помоги. А то у меня просто ступор какой то :-(((.


 
Lu Chan ©   (2003-06-10 17:27) [5]

Може я просто тупплю, А?


 
Sandman25 ©   (2003-06-10 17:35) [6]

А почему нельзя в OnGetMessage вызвать OnServerMessage напрямую? Особенно если заранее известно, какой метод присваивается второму обработчику...


 
Lu Chan ©   (2003-06-10 17:56) [7]

Дело в том, что OnGetMessage - обработка события класса "стороннего разработчика", и в данный момент не хотелось бы там ковырятся. А OnServerMessage - функция которая должна обработать это сообщение в основной программе.


 
Sandman25 ©   (2003-06-10 18:06) [8]

Может быть, так попробовать?

OldOnGetMessage := OnGetMessage;
OnGetMessage := OnServerMessage;
...

procedure tttt.OnServerMessage(...);
begin
if Assigned(OldOnGetMessage) then OldOnGetMessage(...);
...
end;


 
Serginio   (2003-06-10 18:11) [9]

procedure TfrmClient.OnServerMessage(Msg : string);
begin
inherited; // Хотел чтобы OnServerMessage учитывала код
inherited Класса TfrmClient ????
И еще какие какое наследование может быть у событий если это только ссылки на объектные процедуры ????


 
Lu Chan ©   (2003-06-10 18:21) [10]

>>procedure TfrmClient.OnServerMessage(Msg : string);
>>begin
>>inherited; // Хотел чтобы OnServerMessage учитывала код
>>inherited Класса TfrmClient ????
>>И еще какие какое наследование может быть у событий если это >>только ссылки на объектные процедуры ????

Serginio - Сам понимаю что чушь но как реализовать вызов TSignalClientSocket.OnGotMessage и TfrmClient.OnServerMessage(Msg : string) по событию OnGotMessage




 
Serginio   (2003-06-10 18:31) [11]

Cln.OnGotMessage := OnServerMessage;
>>А я хочу добится чтобы сначала вызывалось >>TSignalClientSocket.OnGotMessage а затем OnServerMessage. >>Может я как-то не правильно присваиваю события???

OnGotMessage это ССЫЛКА на процедуру TfrmClient.OnServerMessage.
Вызывая OnGotMessage (If Assigned(FOnGotMessage)) ты на самом деле вызываешь OnServerMessage.



 
MalkoLinge ©   (2003-06-10 18:33) [12]

Крой диспечер события


 
Lu Chan ©   (2003-06-10 18:37) [13]

MalkoLinge - уточни ПЛИЗЗ!!!!


 
Lu Chan ©   (2003-06-10 18:41) [14]

Serginio - спасибо, но к сожалению мне надо вызвать и метод родительского класса (OnGotMessage) и продцедуру (OnServerMessage) к нему динамически присобаченую. А я не мастак - это уж точно.


 
Serginio   (2003-06-10 18:52) [15]

Что бы тебе ЕЩЕ было понятно нет никакого метода родительского класса есть только ссылка
TOnGetMessage= Procedure(Msg : string) of Object;
в классе
FOnGetMessage:TOnGetMessage;
..................
Property OnGetMessage:TOnGetMessage; read FOnGetMessage write FOnGetMessage;

Соответственно ты можешь вызвать только метод присвоенный FOnGetMessage.
Надеюсь понятно. Вызвать родительский метод ты можешь только перекрыв виртуальный (или динамический Message) метод предка. А где здесь ты видишь Override.



 
Lu Chan ©   (2003-06-10 19:12) [16]

Serginio - спасибо, объяснил. Я серьезно спасибо. Но что мне делать?
Получается что динамически создав объект класса, и имея обработку события для класса. Я не смогу вызвать и обработку события для родительского класса, и функцию которую я хочу присоеденить к событию данного объекта класса?


 
Lu Chan ©   (2003-06-10 19:16) [17]

Я просто никогда не имел дела с динамическим Message


 
Serginio   (2003-06-10 19:25) [18]

FOnGetMessage:TOnGetMessage; это обыкновенная переменная типа TMethod и она может принимать только одно значение. Все ранее присвоенные ссылки соответственно не действительны.

Property OnGetMessage:TOnGetMessage; read FOnGetMessage write FOnGetMessage;
Обычно события и объявляются в публишед так как они изначально nil. А если в предке присваивают значения то переводят в привате.

В Net делегаты могут иметь несколько ссылок, но это совсем другая организация событий.




 
reonid ©   (2003-06-10 19:50) [19]

2Lu Chan

Ты столкнулся с неграмотно написанным компонентом.
Компонентописатели не должны сами назначать обработчики
событий, это привелегия пользователей.
Во избежание как раз таких проблем, которые ты имеешь.

Можно, конечно, запомнить старый обработчик, как предлагал
Sandman25 © (10.06.03 18:06), и вызвать его из нового.

Можно, как предложил MalkoLinge © (10.06.03 18:33),
создать наследник TSignalClientSocket и
перекрыть в нём диспетчер события, если он есть
(метод, который должен называться DoGetMessage и из которого
должен вызываться FOnGetMessage).

Но я, чесно говоря, не уверен, что вообще стоит
пользоваться таким компонентом.


 
Serginio   (2003-06-10 19:55) [20]

Если у тебя уже есть обработчик по умолчанию (Что маловероятно). Создай наследника TSignalClientSocket и в конструкторе используй то, что тебе предложил Sandman25 © (10.06.03 18:06)


 
Serginio   (2003-06-10 20:04) [21]

Кстати в наследнике можешь определить свой метод
T2LuChanSignalClientSocket =Class(TSignalClientSocket)
OldOnGetMessage :TOnGetMessage;
Proceedure NewOnGetMessage(Msg : string);


Constructor Create(t:Booleaan); override;
end;

T2LuChanSignalClientSocket.Constructor Create(t:Booleaan);
begin
inherited Create(t);
OldOnGetMessage = OnGetMessage;
OnGetMessage := NewOnGetMessage;
end;

T2LuChanSignalClientSocket.NewOnGetMessage(Msg : string);
Begin
if Assigned(OldOnGetMessage) then OldOnGetMessage(msg);

meServer.Lines.Add(DateTimeToStr(Now));
meServer.Lines.Add(Msg);


end;







 
reonid ©   (2003-06-10 20:08) [22]

С другой стороны, может и не быть обработчика по умолчанию,
а что-нибудь в таком роде:

procedure DoGetMessage;
begin
if Assigned(FOnGetMessage) then
FOnGetMessage(...)
else
...;
end;

Тогда подразумевается, что ты должен
все действия произвести сам.
(Вдруг тебе не понравится обработка по умолчанию)


 
Lu Chan ©   (2003-06-11 11:30) [23]

Мужики ОГРОМНОЕ СПАСИБО!!!!!!!!!!!!!!!



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.04 c
14-84572
NeWuS
2003-06-08 11:10
2003.06.26
поле в таблице


14-84608
Карелин Артем
2003-06-09 10:25
2003.06.26
Подскажите компонеты для создания своего FTP-сервера.


1-84237
Shirson
2003-06-11 14:38
2003.06.26
Запуск другой программы и ожидаение её завершения.


1-84306
Yuraz
2003-06-13 21:33
2003.06.26
Функция проверки наличия в строке посторонних символов,промогите!


11-84051
Dmitriy Polskoy
2002-10-09 12:24
2003.06.26
Помогите разобраться