Главная страница
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.016 c
3-9051
vopros
2002-02-06 11:20
2002.03.04
А как в запросе ссуммирровать вычисляемые поля ?


1-9118
ATLANTIDO
2002-02-16 01:33
2002.03.04
KILL FORM


3-9056
Demon ltd
2002-02-06 14:21
2002.03.04
Показ данных из одной базы в другой


1-9139
kaif
2002-02-17 12:56
2002.03.04
Почему много ссылок на BPL?


3-9099
yaJohn
2002-02-05 19:03
2002.03.04
WinXP Home edition. Spasite!!!