Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова события в Delphi, Как создавать свои события в объектах 
:(
    Опции темы
croakernet
Дата 8.10.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.6.2008

Репутация: нет
Всего: нет



Уважаемые форумчане! Ткните носом, или подскажите, как:
Создаю приложение, в приложении существуют три объекта. Один из них, в результате вызова некой процедуры, выполняет некое действие. В результате этой процедуры он создает нечто (событие). Два других должны отреагировать на эти события. Как реализовать такую конструкцию?
Поясню на примере: Один объект - форма, второй объект просто некий программный модуль (назовем его MainOBJ). После некоторых действий пользователя на форме происходит событие, на которое MainOBJ должен отреагировать. При этом модуль Формы включен в описание в MainOBJ, но ведь форма ничего не знает о процедурах MainOBJ. Как из нее вызвать обработчик этого события, код которого, находится в MainOBJ?

Знаю как подобное провернуть на VB:
{
Class 1
Public event testEvent(a as long)
}
procedure test
RaiseEvent testEvent(a)
end
{
Class 2 
public class1Obj withevents as class 1
sub class1Obj_testEvent(a as long)
{код обработки}
end
}
возможно ли что то подобное??? 
 smile  smile smile 

PM MAIL   Вверх
zolumn
Дата 8.10.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 19.2.2008
Где: Volgograd

Репутация: нет
Всего: нет



тут не особо понятна формулировка вопроса, вроде как много написано, но замудрено...

Цитата(croakernet @  8.10.2008,  15:26 Найти цитируемый пост)
Один из них, в результате вызова некой процедуры, выполняет некое действие. В результате этой процедуры он создает нечто (событие).


так вот это нечто(событие), в него можно вставить вызов процедур классов, которыми оно обрабатывается. 
И  как понять событие? это изменение переменной класса? изменение свойства класса? изменение свойства формы? что эт?

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

Это сообщение отредактировал(а) zolumn - 8.10.2008, 17:38
PM ICQ   Вверх
croakernet
Дата 9.10.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 10.6.2008

Репутация: нет
Всего: нет



Нет Это не изменение свойства формы! Это просто три неких класса. 
Во время выполнения процедуры класса происходит "событие" (т.е. выполнение процедуры доходит до определенной точки, и вызывается процедура события) и все остальные классы реагируют на это событие. 
Я понимаю, что можно поочереди вызвать кучу процедур из других классов, и в них по очереди передать все значения, и они поочереди выполняться. Но что делать если таких классов 10 (или 100). 
Я все это к чему: на VB можно реализовать это таким образом, что при вызове ОДНОЙ процедуры внутри одного класса, происходит обращение к различным реализациям это процедуры внутри других классов, в которых первый класс описан как объект с событиями.

PM MAIL   Вверх
Bose
Дата 9.10.2008, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



Как-то так:
В Делфи событие, - это процедурный тип. Т.е. чтобы обработать сотыбие, нужно присвоить объекту процедуру-обработчик. А объект будет вызывать эту процедура всякий раз, когда должно сработать событие. 
Чтобы добавить событие к своему классу, надо:
1) Определить тип данных обработчика события, или воспользоваться стандартным(предпочтительнее). 
свой:
Код

type 
  TMyEvent = procedure (aParam1,aParam2:TObject) of object; 

Это означает что обработчиком события у нас будет процедура какого-либо объекта с двумя параметрами aParam1,aParam2:TObject
Но для начала лучше использовать стандартный тип события, например:
Код

  TNotifyEvent = procedure(Sender: TObject) of object;

  
Тип TNotifyEvent объявлен в модуле classes. 

2) В класс, который должен вызывать событие добавляем proprty к которой будем присваивать:
Код

type
  TMyClass = class
  private
     FMyEvent: TNotifyEvent;
  public
      procedure TestEvent;
  published
     property OnMyEvent: TNotifyEvent read FOnMyEvent write FOnMyEvent;
  end;

3) Теперь, надо сделать так чтобы, это событие заработало. Для этого в нужном тебе месте добавить вызов события как процедуры. 
Код

procedure TMyClass.TestEvent;
begin
  if assigned(FMyEvent) then  // сначала проверим что FMyEvent <> nil
    FMyEvent (self); 
  //RaiseEvent testEvent(a)
end;

4) Теперь в нужном месте необходимо присвоить обработчик события. Например, у нас есть форма:
Код

type 
  TForm1 = class(TForm)
  ....
  private
     procedure MyEventHandler(Sender:TObject); // пусть эта процедура у нас будет обработчиком события в объекте класса TMyClass
     
     procedure CreateObjectAndTestEvent;
  end;

   procedure TMyClass.CreateObjectAndTestEvent;
   var
     tmpMyClass:TMyClass;
   begin
      tmpMyClass:=TMyClass.Create; // создаём объект класса TMyClass
      try
     
        tmpMyClass.OnMyEvent := MyEventHandler; // присваеваем объекту обработчик

        tmpMyClass.TestEvent; // запускаем процедуру вызывающую событие
 
      finally
        tmpMyClass.Free;
      end;

   end;

    procedure TMyClass.MyEventHandler(Sender:TObject);
    begin
       ShowMessage('Йа обработчик события, ура!')
    end;


PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.