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

Вниз

Общие соображения о межкомпонентной привязке изменений свойств   Найти похожие ветки 

 
paul_shmakov ©   (2002-02-15 13:04) [8]

если я правильно понял вопрос, то решение аналогично совету Юрия Зотова.
скажем, есть два компонента: TMyComponent и TMyListener. у TMyComponent есть свойство MyProperty, за изменениями которого должен следить компонент TMyListener. тогда


unit Unit1;

interface

uses Classes, Controls;

type

IEventListener = interface
procedure ProcessEvent(Sender: TObject);
end;

TMyComponent = class(TGraphicControl)
private
FMyProperty: Integer;
FListeners: TList;

procedure SetMyProperty(const Value: Integer);

public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

procedure AddEventListener(Listerner: IEventListener);
procedure RemoveEventListener(Listerner: IEventListener);

published
property MyProperty: Integer read FMyProperty
write SetMyProperty;
end;

TMyListener = class(TGraphicControl, IEventListener)
private
FMyComponent: TMyComponent;
procedure SetMyComponent(const Value: TMyComponent);

protected
procedure ProcessEvent(Sender: TObject);

published
property MyComponent: TMyComponent read FMyComponent write SetMyComponent;
end;

implementation

uses Dialogs, SysUtils;

{ TMyComponent }

procedure TMyComponent.AddEventListener(Listerner: IEventListener);
begin
FListeners.Add(Pointer(Listerner));
end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FListeners := TList.Create;
end;

destructor TMyComponent.Destroy;
begin
FListeners.Free;
FListeners := nil;
inherited;
end;

procedure TMyComponent.RemoveEventListener(Listerner: IEventListener);
begin
FListeners.Remove(Pointer(Listerner));
end;

procedure TMyComponent.SetMyProperty(const Value: Integer);
var
I: Integer;
begin
FMyProperty := Value;

for I := 0 to FListeners.Count - 1 do
IEventListener(FListeners[I]).ProcessEvent(Self);
end;

{ TMyListener }

procedure TMyListener.ProcessEvent(Sender: TObject);
var
Comp: TMyComponent;
begin
Comp := TMyComponent(Sender);
ShowMessage(IntToStr(Comp.MyProperty));
end;

procedure TMyListener.SetMyComponent(const Value: TMyComponent);
begin
if Assigned(FMyComponent) then
FMyComponent.RemoveEventListener(Self);

FMyComponent := Value;

if Assigned(FMyComponent) then
FMyComponent.AddEventListener(Self);
end;

end.



т.е. описани интерфейс IEventListener, который должны реализовать все классы, которые заинтересованы в получении событий. далее эти классы вызывают метод AddEventListener у TMyComponent для добавления себя в список рассылки уведомлений.


> Эти связи (направления оповещения) должны редактироваться
> (переключиться с одного компонента на другой) в DesignTime.


ну а это получится автоматом - если установить вышеприведенный юнит, то в designtime при щелчке на свойство MyComponent компенента TMyListener появиться выпадающий список существующих компонентов TMyComponent.



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

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

Наверх




Память: 0.47 MB
Время: 0.011 c
14-9278
Сергей Чурсин
2001-08-07 19:14
2002.03.04
---|Ветка была без названия|---


1-9234
Beer
2002-02-15 10:50
2002.03.04
Получить название директории...


1-9178
IronHawk
2002-02-11 18:57
2002.03.04
Где в DBGrid поставить разделитель между столбцами !


1-9174
Demol
2002-02-13 17:29
2002.03.04
MicrosoftAgent


3-9070
amamed_3071
2002-01-21 11:41
2002.03.04
Save Report (Qreport)