WinSkinStore.pas
上传用户:xjwsee
上传日期:2008-08-02
资源大小:796k
文件大小:5k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit WinSkinStore;
  2. {$WARNINGS OFF}
  3. {$HINTS OFF}
  4. interface
  5. uses
  6.   SysUtils, Classes;
  7. type
  8.   TSkinCollectionItem = class(TCollectionItem)
  9.   private
  10.     FName: string;
  11.     procedure SetName(AName: string);
  12.     function GetDataSize: integer;
  13.     function GetData: string;
  14.     procedure SetData(const Value: string);
  15.     procedure ReadData(Stream : TStream);
  16.     procedure WriteData(Stream : TStream);
  17.   protected
  18.     function GetDisplayName: string; reintroduce; override;
  19.     procedure DefineProperties(Filer: TFiler); reintroduce; override;
  20.   public
  21.     FData: TMemoryStream;
  22.     constructor Create(ACollection: TCollection); override;
  23.     destructor Destroy; reintroduce; override;
  24.     procedure Assign(ASource: TPersistent); reintroduce; override;
  25.     procedure LoadFromFile(value:string);
  26.     procedure CopyData(AStream: TMemoryStream);
  27.   published
  28.     property Name: string read FName write SetName;
  29.     property SkinData: string read GetData write Setdata stored false;
  30.     property DataSize: integer read GetDataSize;
  31.   end;
  32.   TSkinCollection = class(TOwnedCollection)
  33.   private
  34.   public
  35.     constructor Create(AOwner: TPersistent);
  36.     function Add: TSkinCollectionItem; overload;
  37.     procedure Assign(ASource: TPersistent); reintroduce; override;
  38.   end;
  39.   TSkinStore = class(TComponent)
  40.   private
  41.     FStore: TSkinCollection;
  42.     procedure SetStore(AStore: TSkinCollection);
  43.   protected
  44.     { Protected declarations }
  45.   public
  46.     constructor Create(AOwner: TComponent); override;
  47.     destructor Destroy; reintroduce; override;
  48.   published
  49.     property Store: TSkinCollection read FStore write SetStore;
  50.   end;
  51. //procedure Register;
  52. implementation
  53. { TSkinStore }
  54. constructor TSkinStore.Create(AOwner: TComponent);
  55. begin
  56.   inherited;
  57.   FStore := TSkinCollection.Create(Self);
  58. end;
  59. destructor TSkinStore.Destroy;
  60. begin
  61.   FStore.Free;
  62.   inherited;
  63. end;
  64. procedure TSkinStore.SetStore(AStore: TSkinCollection);
  65. begin
  66.   if Assigned(AStore) then
  67.     FStore.Assign(AStore);
  68. end;
  69. { TSkinCollectionItem }
  70. procedure TSkinCollectionItem.Assign(ASource: TPersistent);
  71. var
  72.   AItem: TSkinCollectionItem;
  73. begin
  74.   AItem := ASource as TSkinCollectionItem;
  75.   if AItem <> nil then
  76.   begin
  77.     FName := AItem.Name;
  78.     FData.Clear;
  79.     AItem.CopyData(FData);
  80.   end
  81.   else
  82.     Inherited;
  83. end;
  84. procedure TSkinCollectionItem.CopyData(AStream: TMemoryStream);
  85. var
  86.   Pos: integer;
  87. begin
  88.   Pos := FData.Position;
  89.   try
  90.     FData.Position := 0;
  91.     AStream.CopyFrom(FData, FData.Size);
  92.   finally
  93.     FData.Position := Pos;
  94.   end;
  95. end;
  96. constructor TSkinCollectionItem.Create(ACollection: TCollection);
  97. begin
  98.   inherited;
  99.   FData := TMemoryStream.Create;
  100.   FName := 'SkinItem' + IntToStr(ID);
  101. end;
  102. procedure TSkinCollectionItem.DefineProperties(Filer: TFiler);
  103. begin
  104.   inherited;
  105.   Filer.DefineBinaryProperty('DataStream', ReadData, WriteData, True);
  106. end;
  107. procedure TSkinCollectionItem.ReadData(Stream : TStream);
  108. begin
  109.   FData.Clear;
  110.   FData.CopyFrom(Stream, Stream.Size);
  111. end;
  112. procedure TSkinCollectionItem.WriteData(Stream : TStream);
  113. begin
  114.   FData.Position := 0;
  115.   Stream.CopyFrom(FData, FData.Size);
  116. end;
  117. destructor TSkinCollectionItem.Destroy;
  118. begin
  119.   FData.Free;
  120.   inherited;
  121. end;
  122. function TSkinCollectionItem.GetData: string;
  123. begin
  124.   Result := 'Load Skin';
  125. end;
  126. function TSkinCollectionItem.GetDataSize: integer;
  127. begin
  128.   Result := FData.Size;
  129. end;
  130. function TSkinCollectionItem.GetDisplayName: string;
  131. begin
  132.   Result := FName;
  133. end;
  134. procedure TSkinCollectionItem.LoadFromFile(value: string);
  135. begin
  136.   FData.Clear;
  137.   FData.LoadFromFile(value);
  138. //  ShowMessage('File is ' + IntToStr(FData.Size) + ' bytes');
  139. end;
  140. procedure TSkinCollectionItem.SetData(const Value: string);
  141. begin
  142. end;
  143. procedure TSkinCollectionItem.SetName(AName: string);
  144. var
  145.   ACollection: TOwnedCollection;
  146.   i: integer;
  147. begin
  148.   // need to make sure the name does not
  149.   // already exist in the collection
  150.   if FName <> AName then
  151.   begin
  152.     ACollection := GetOwner as TOwnedCollection;
  153.     for i := 0 to ACollection.Count-1 do
  154.       if ACollection.Items[i] <> Self then
  155.         if (ACollection.Items[i] as TSkinCollectionItem).Name = AName then
  156.           raise Exception.Create('The name ' + AName + ' is already used.');
  157.     FName := AName;
  158.   end;
  159. end;
  160. { TSkinCollection }
  161. function TSkinCollection.Add: TSkinCollectionItem;
  162. begin
  163.   Result := Inherited Add as TSkinCollectionItem;
  164. end;
  165. procedure TSkinCollection.Assign(ASource: TPersistent);
  166. begin
  167.   Inherited;
  168. end;
  169. constructor TSkinCollection.Create(AOwner: TPersistent);
  170. begin
  171.   inherited Create(AOwner, TSkinCollectionItem);
  172. end;
  173. end.