当Object改变时通知TObjectList

scr*_*ibe 2 delphi

(TObjectList)的对象可以知道(TMyObject)的某些值何时被更改?

一些例子:

TMyObject = class
  oName: string;
end;

TMyObjectList = class(TObjectList<TMyObject>)
end;

procedure Form1.Button1.Click(Sender: TObject);
var
  Obj: TMyObject;
  List: TMyObjectList;
Begin
 List:= TMyObjectList.Create;
 Obj:= TMyObject.Create;
 List.Add(Obj);
 List[0].oName:= 'Test'; // here a want to know from var (List) when this object (Obj or List[0]) changed his value..
end;
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Ste*_*nke 7

我刚刚将TObservableList<T>类型添加到Spring4D(feature/observablelist branch).它主要以.NET为模型,并使用INotifyPropertyChanged接口将其事件处理程序附加到支持它的任何对象.这个类已经成为DSharp的一部分很长一段时间了,并且在生产中使用.它可能会在未来发生一些变化,并成为图书馆的一部分.

这是一个如何使用它的小例子,所以你得到一个想法:

program Project60;

{$APPTYPE CONSOLE}

uses
  Spring,
  Spring.Collections,
  SysUtils;

type
  TNotifyPropertyChangedBase = class(TInterfaceBase, INotifyPropertyChanged)
  private
    fOnPropertyChanged: Event<TPropertyChangedEvent>;
    function GetOnPropertyChanged: IPropertyChangedEvent;
  protected
    procedure PropertyChanged(const propertyName: string);
  end;

  TMyObject = class(TNotifyPropertyChangedBase)
  private
    fName: string;
    procedure SetName(const Value: string);
  public
    property Name: string read fName write SetName;
  end;

  TMain = class
    procedure ListChanged(Sender: TObject; const item: TMyObject;
      action: TCollectionChangedAction);
  end;

{ TNotifyPropertyChangedBase }

function TNotifyPropertyChangedBase.GetOnPropertyChanged: IPropertyChangedEvent;
begin
  Result := fOnPropertyChanged;
end;

procedure TNotifyPropertyChangedBase.PropertyChanged(
  const propertyName: string);
begin
  fOnPropertyChanged.Invoke(Self,
    TPropertyChangedEventArgs.Create(propertyName) as IPropertyChangedEventArgs);
end;

{ TMyObject }

procedure TMyObject.SetName(const Value: string);
begin
  fName := Value;
  PropertyChanged('Name');
end;

{ TMain }

procedure TMain.ListChanged(Sender: TObject; const item: TMyObject;
  action: TCollectionChangedAction);
begin
  case action of
    caAdded: Writeln('item added ', item.Name);
    caRemoved, caExtracted: Writeln('item removed ', item.Name);
    caChanged: Writeln('item changed ', item.Name);
  end;
end;

var
  main: TMain;
  list: IList<TMyObject>;
  o: TMyObject;
begin
  list := TCollections.CreateObservableList<TMyObject>;
  list.OnChanged.Add(main.ListChanged);
  o := TMyObject.Create;
  o.Name := 'o1';
  list.Add(o);
  o := TMyObject.Create;
  o.Name := 'o2';
  list.Add(o);
  list[1].Name := 'o3';
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)