Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с классами [D5, XP]


Yus ©   (2005-10-28 15:33:00) 

Подскажите в примере как передать событие из одного класса в процедуру другого используя Делегирование


Yus   (2005-10-28 19:28:00) [1]

Да, допустил пару ошибок. Виноват....
Джо СПАСИБО, твоя подсказка, то что нужно.


Джо   (2005-10-28 18:34:00) [2]


> [9] Джо ©   (28.10.05 18:17)

Тут

> procedure Button1Click(Sender: TObject);private

private случайно встрял, игнорировать.


Джо   (2005-10-28 18:17:00) [3]


> [7] Yus   (28.10.05 17:45)

То, что ты привел, вообще-то не скомпилируется, наверное в браузере писал, т.е, просьбу в [3] не выполнил. Ну, да ладно. Последний приступ телепатии. Вот это:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TCalculateEvent = procedure(I: Integer) of object;

 TSomeClass = class(TObject)
 private
   FOnCalculate: TCalculateEvent;
   procedure DoCalculate;
 public
   property OnCalculate: TCalculateEvent read FOnCalculate write FOnCalculate;
   procedure DoWork;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);private
 private
   procedure CalculateProc(I: Integer);
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TSomeClass }

procedure TForm1.CalculateProc(I: Integer);
begin
 ShowMessage (IntToStr(I));
end;

procedure TSomeClass.DoCalculate;
begin
 if Assigned(FOnCalculate) then FOnCalculate(7);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 SomeClass: TSomeClass;
begin
 SomeClass := TSomeClass.Create;
 try
   SomeClass.OnCalculate := CalculateProc;
   SomeClass.DoWork;
 finally
   SomeClass.Free;
 end;
end;

procedure TSomeClass.DoWork;
var
 I: Integer;
begin
 for I := 0 to 10 do
   DoCalculate
end;

end.


?


Leonid Troyanovsky   (2005-10-28 18:17:00) [4]


> Yus   (28.10.05 17:45) [7]

> Что должно быть написано в TForm, чтобы принять число 7,
>  я не знаю о чем вас и спрашиваю.


В TForm должен существать метод: TCalculateEvent.
Этот метод должен быть назначен свойству OnCalculate
созданного экземпляра TSomeClass. Это - во-первых (уже говорилось).

А, во-вторых, где-то (очевидно, в недрах TSomeClass) должно произойти
некое событие, в результате которого и будет вызван метод
диспетчеризации DoCalculate.
Для простоты, представим, что это - событие таймера (пришло сообщение
WM_TIMER, сработал обработчик OnTimer и т.д.).

Полная картина может быть представлена приблизительно так:

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/a97f4a5f1115c91d

Возможно, что стоит посмотреть все обсуждение.

--
Regards, LVT.


Zacho   (2005-10-28 17:58:00) [5]

Yus   (28.10.05 17:45) [7]
Что должно быть написано в TForm, чтобы принять число 7, я не знаю о чем вас и спрашиваю


А вот именно это никто понять и не может, ибо бред какой-то.
Попробуй ещё раз объяснить, что тебе нужно делать в (каком-то методе ?) TForm.

P.S. Не обижайся на "бред", но сколько можно просить, что бы ты в конце-концов нормально объяснил что тебе надо ? Кому это нужно-то ? Тебе или нам ?


Yus   (2005-10-28 17:45:00) [6]

отправляю полный код созданного класса.

type
TCalculateEvent = procedure(I: Integer) of object;

TSomeClass = SomeClass (TObject)
private
FOnCalculate: TCalculateEvent;
procedure DoCalculate;
public
property OnCalculate: TCalculateEvent read FOnCalculate write FOnCalculate;
end;

procedure SomeClass .DoCalculate;
begin
if Assigned(FOnCalculate) then FOnCalculate(7);
end;

Что должно быть написано в TForm, чтобы принять число 7, я не знаю о чем вас и спрашиваю.


Zacho   (2005-10-28 16:54:00) [7]

Yus   (28.10.05 16:36) [2]
Класс TForm должена быть процедура, которая и получит число 7. Все компилируется но обрацения к процедуре нет. Возможно я ее неправильно описал в TForm. Подскажите как ее описать, чтобы к ней было обращение.


Вот в этом я ничего не понял. Попробуй сформулировать другими словами, более подробно.
И более понятно :)

Попробую телепатировать :)

Либо в твоём наследнике от TForm должно быть поле, которому в обработчике CalculateEvent должно присваиваться 7, либо метод, который должен вызываться с параметром равным 7. В любом случае, тебе как-то надо получить указатель на этот экземпляр твоего наследника TForm. Например, его можно передавать в ещё одном параметре в обработчике события. А в TSomeClass сделать поле для хранения этого указателя.


Digitman   (2005-10-28 16:45:00) [8]


> Класс TForm должена быть процедура


галиматьища полная, посему нишута не понятно.

попытайся еще раз объяснить ...


Джо   (2005-10-28 16:43:00) [9]


> создания класса

создания экземпляра класса


Джо   (2005-10-28 16:42:00) [10]

А можно полный код описания класса, создания класса и вообще манипуляции с ним? А то ничего не понятно. :(


Yus   (2005-10-28 16:36:00) [11]

Мной создан класс myClass при выполнении одной из процедур класса вызываутся
if Assigned(FOnCalculate) then FOnCalculate(7);
описанный  
type
TCalculateEvent = procedure(I: Integer) of object;
TSomeClass = class(TObject)
private
FOnCalculate: TCalculateEvent;
public
property OnCalculate: TCalculateEvent read FOnCalculate write FOnCalculate;

Класс TForm должена быть процедура, которая и получит число 7. Все компилируется но обрацения к процедуре нет. Возможно я ее неправильно описал в TForm. Подскажите как ее описать, чтобы к ней было обращение.


Zacho   (2005-10-28 15:42:00) [12]

Объясни, что такое "передать событие в процедуру" и что такое "делегирование".


Наверх

Титульная страница Поиск, карта сайта Написать письмо