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

Delphi控件源码

开发平台:

Delphi

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