![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EExternalException.. [XP]
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 Потерял сознание