Форум: "Основная";
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];
ВнизОбщие соображения о межкомпонентной привязке изменений свойств Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c