Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
7-9304
amamed_3071
2001-11-22 08:49
2002.03.04
Програмно читать Barcod


3-9054
Стас
2002-02-06 07:32
2002.03.04
QuickReport.


1-9117
romulas
2002-02-13 14:33
2002.03.04
Help!!!


14-9272
Ghost!
2002-01-11 20:42
2002.03.04
Деление String по пробелу


1-9192
BVS
2002-02-13 17:52
2002.03.04
Перехват нажатия мышки.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский