Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

EExternalException.. [XP]


Страницы:   1 2

pathfinder ©   (2007-11-09 11:10:00) 

Добрый день.
Есть форма на которой edit и label. При изменении значения в edit-e оно должно меняться и label-е. Попытался сделать это с помощью шаблона Наблюдатель. Взял его реализацию из BDS2006. В методе NotifyObservers возникает EEXternalException при попытке вызвать метод Update элемента списка. Подскажите пожалуйста, в чем моя ошибка?

Код самой программы:
var
 ProgParams: TProgParams;
 ProgView: TProgView;
begin
 ProgParams := TProgParams.Create;
 ProgView := TProgView.Create(ProgParams);
 ProgView.Show;
end.

Реализация классов:
type
 TSubject = class;

 IObserver = interface
   procedure Update(ASubject :TSubject);
 end;

 TSubject = class
 strict private var
   FObservers:TList;
 strict protected
   procedure NotifyObservers;
 public
   constructor Create;
   procedure Attach(AObserver :IObserver);
   procedure Detach(AObserver :IObserver);
 end;

 TProgParams = class(TSubject)
 strict private
   FTest: string;
 public
   function GetParam(const Name: string): string;
   procedure SetParam(const Name: string);
 end;

 TProgView = class(TInterfacedObject, IObserver)
 strict private
   FSubject: TProgParams;
   FViewForm: TViewForm;

   procedure Refresh;
   procedure OnSetParam(Sender: TObject);
 public
   constructor Create(ASubject: TProgParams);
   destructor Destroy;

   procedure Show;

   procedure Update(ASubject :TSubject);
 end;

implementation

constructor TSubject.Create;
begin
 inherited Create;
 FObservers := TList.Create;
end;

procedure TSubject.Attach(AObserver :IObserver);
begin
 FObservers.Add(@AObserver);
end;

procedure TSubject.Detach(AObserver :IObserver);
var
 idx :Integer;
begin
 idx := FObservers.IndexOf(@AObserver);
 If idx <> -1 Then
 begin
   FObservers.Delete(idx);
 end;
end;

procedure TSubject.NotifyObservers;
var
 Current :^IObserver;
begin
 for Current in FObservers do
   Current.Update(self);
end;

constructor TProgView.Create(ASubject: TProgParams);
begin
 FSubject := ASubject;
 FSubject.Attach(self);
 FViewForm := TViewForm.Create(nil);
 FViewForm.edtTest.OnChange := OnSetParam;
end;

destructor TProgView.Destroy;
begin
 FSubject.Detach(self);
 FViewForm.Free;
end;

procedure TProgView.OnSetParam(Sender: TObject);
begin
 FSubject.SetParam(FViewForm.edtTest.Text);
end;

procedure TProgView.Refresh;
var
 s: string;
begin
 s := FSubject.GetParam('');
 FViewForm.edtTest.Text := s;
 FViewForm.lblTest.Caption := s;
end;

procedure TProgView.Show;
begin
 FViewForm.ShowModal;
end;

procedure TProgView.Update(ASubject :TSubject);
begin
 Refresh;
end;

{ TProgParams }

function TProgParams.GetParam(const Name: string): string;
begin
 Result := FTest;
end;

procedure TProgParams.SetParam(const Name: string);
begin
 FTest := Name;
 NotifyObservers;
end;


pathfinder   (2007-11-09 11:22:00) [21]


> Ega23 ©   (09.11.07 11:19) [3]
>
>


На самом деле я хотел попробовать применить шаблон Наблюдатель на практике, а не просто выполнить эту операцию.


Ega23   (2007-11-09 11:19:00) [22]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Label1: TLabel;
   procedure Edit1Change(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
 Label1.Caption := Edit1.Text;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Edit1.Text := '';
end;

end.


Всё.


pathfinder   (2007-11-09 11:18:00) [23]


> И ради ЭТОГО нужен был весь тот код???


Скорей наоборот.


Dib@zol   (2007-11-09 11:15:00) [24]

> [0] pathfinder ©   (09.11.07 11:10)
> Добрый день.
> Есть форма на которой edit и label. При изменении значения в edit-e оно должно меняться и label-е .

И ради ЭТОГО нужен был весь тоткод???
/me Потерял сознание


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо