Форум: "Основная";
Текущий архив: 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