home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 September
/
Chip_2002-09_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d56
/
XMLCOMP.ZIP
/
DnXmlListMapper.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2002-06-14
|
7KB
|
235 lines
unit DnXmlListMapper;
interface
uses
Classes, SysUtils, Dialogs;
type
TDnXmlListMapperClass = class of TDnXmlListMapper;
TDnXmlListMapper = class
private
FObject: TObject;
FOwnerObject: TObject;
protected
property TheObject: TObject read FObject;
property OwnerObject: TObject read FOwnerObject;
function GetCount: Integer; virtual; abstract;
function GetIsRef(aIndex: Integer): Boolean; virtual; abstract;
function GetStoresObjects: Boolean; virtual; abstract;
function GetObjectItem(aIndex: Integer): TObject; virtual; abstract;
procedure SetObjectItem(aIndex: Integer; Value: TObject); virtual; abstract;
function GetStringItem(aIndex: Integer): string; virtual; abstract;
public
{:Always use this constructor instead of the standard one! It takes the
object of which the list items are needed.}
constructor CreateWithObject(aObject: TObject; aOwner: TObject = nil); virtual;
procedure Clear; virtual; abstract;
procedure Add(aItem: TObject); overload; virtual; abstract;
procedure Add(aItem: string); overload; virtual; abstract;
property Count: Integer read GetCount;
property IsRef[aIndex: Integer]: Boolean read GetIsRef;
property StoresObjects: Boolean read GetStoresObjects;
property ObjectItem[aIndex: Integer]: TObject read GetObjectItem write SetObjectItem;
property StringItem[aIndex: Integer]: string read GetStringItem;
end;
TDnXmlTListMapper = class(TDnXmlListMapper)
private
FList: TList;
protected
function GetCount: Integer; override;
function GetIsRef(aIndex: Integer): Boolean; override;
function GetStoresObjects: Boolean; override;
function GetObjectItem(aIndex: Integer): TObject; override;
procedure SetObjectItem(aIndex: Integer; Value: TObject); override;
public
constructor CreateWithObject(aObject: TObject; aOwner: TObject = nil); override;
procedure Clear; override;
procedure Add(aItem: TObject); override;
procedure Add(aItem: string); override;
end;
{:Makes child objects persistent.}
TDnXmlTComponentMapper = class(TDnXmlListMapper)
protected
FComponent: TComponent;
function GetCount: Integer; override;
function GetIsRef(aIndex: Integer): Boolean; override;
function GetStoresObjects: Boolean; override;
function GetObjectItem(aIndex: Integer): TObject; override;
procedure SetObjectItem(aIndex: Integer; Value: TObject); override;
public
constructor CreateWithObject(aObject: TObject; aOwner: TObject = nil); override;
procedure Clear; override;
procedure Add(aItem: TObject); override;
procedure Add(aItem: string); override;
end;
function GetListMapper(aClass: TClass): TDnXmlListMapperClass;
procedure RegisterListMapper(aClass: TClass; aMapper: TDnXmlListMapperClass);
procedure UnregisterListMapper(aClass: TClass);
implementation
var
uClasses: TList; { of TClass }
uMappers: TList; { of TDnXmlListMappersClass }
function GetListMapper(aClass: TClass): TDnXmlListMapperClass;
var idx: Integer;
begin
result := nil;
for idx := 0 to uClasses.Count - 1 do
begin
if aClass.InheritsFrom(uClasses[idx]) then
begin
result := uMappers[idx];
Break;
end;
end;
end;
procedure RegisterListMapper(aClass: TClass; aMapper: TDnXmlListMapperClass);
var idx: Integer;
begin
idx := uClasses.IndexOf(aClass);
if idx <> -1 then
raise Exception.CreateFmt('There already is a list mapper %s associated with class %s',
[TClass(uMappers[idx]).ClassName, aClass.ClassName]);
uClasses.Add(aClass);
uMappers.Add(aMapper);
end;
procedure UnregisterListMapper(aClass: TClass);
begin
uClasses.Remove(aClass);
end;
{ TDnXmlListMapper }
constructor TDnXmlListMapper.CreateWithObject(aObject: TObject; aOwner: TObject = nil);
begin
inherited;
Assert(aObject <> nil);
FObject := aObject;
FOwnerObject := aOwner;
end;
{ TDnXmlTListMapper }
procedure TDnXmlTListMapper.Clear;
begin
FList.Clear;
end;
constructor TDnXmlTListMapper.CreateWithObject(aObject, aOwner: TObject);
begin
inherited;
FList := aObject as TList;
end;
function TDnXmlTListMapper.GetCount: Integer;
begin
result := (TheObject as TList).Count;
end;
function TDnXmlTListMapper.GetStoresObjects: Boolean;
begin
result := True;
end;
function TDnXmlTListMapper.GetIsRef(aIndex: Integer): Boolean;
var item: TObject;
begin
item := (TheObject as TList)[aIndex];
if item <> nil then
result := (item is TComponent) and (OwnerObject <> nil) and (TComponent(item).Owner <> OwnerObject)
else
result := False;
end;
function TDnXmlTListMapper.GetObjectItem(aIndex: Integer): TObject;
begin
result := (TheObject as TList)[aIndex];
end;
procedure TDnXmlTListMapper.Add(aItem: TObject);
begin
FList.Add(aItem);
end;
procedure TDnXmlTListMapper.Add(aItem: string);
begin
Assert(False, 'Use this list mapper for object lists only');
end;
procedure TDnXmlTListMapper.SetObjectItem(aIndex: Integer; Value: TObject);
begin
FList[aIndex] := Value;
end;
{ TDnXmlTComponentMapper }
procedure TDnXmlTComponentMapper.Add(aItem: string);
begin
Assert(False);
end;
procedure TDnXmlTComponentMapper.Add(aItem: TObject);
begin
Assert(aItem is TComponent);
(TheObject as TComponent).InsertComponent(TComponent(aItem));
end;
procedure TDnXmlTComponentMapper.Clear;
begin
while FComponent.ComponentCount > 0 do
FComponent.Components[0].Free;
end;
constructor TDnXmlTComponentMapper.CreateWithObject(aObject,
aOwner: TObject);
begin
inherited;
FComponent := aObject as TComponent;
end;
function TDnXmlTComponentMapper.GetCount: Integer;
begin
result := FComponent.ComponentCount;
end;
function TDnXmlTComponentMapper.GetIsRef(aIndex: Integer): Boolean;
begin
result := False;
end;
function TDnXmlTComponentMapper.GetObjectItem(aIndex: Integer): TObject;
begin
result := FComponent.Components[aIndex];
end;
function TDnXmlTComponentMapper.GetStoresObjects: Boolean;
begin
result := True;
end;
procedure TDnXmlTComponentMapper.SetObjectItem(aIndex: Integer;
Value: TObject);
begin
Assert(False, 'Child objects cannot be references at the same time');
end;
initialization
uClasses := TList.Create;
uMappers := TList.Create;
RegisterListMapper(TList, TDnXmlTListMapper);
finalization
uClasses.Free;
uMappers.Free;
end.