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

Вниз

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

Наверх




Память: 0.5 MB
Время: 0.026 c
1-84346
Merfi
2003-06-15 09:36
2003.06.26
Границы окна


1-84232
Кен
2003-06-10 03:48
2003.06.26
Focus . Как узнать где он в данный момент находится ?


1-84382
Dr. Andrew
2003-06-09 11:46
2003.06.26
Max масштабирование (увеличение) Bitmap формата 24-bit или 32-bit


14-84521
Marser
2003-06-05 22:59
2003.06.26
О природе русского мата


1-84184
Doc
2003-06-12 08:10
2003.06.26
Указатель String...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский