Subversion Repositories decoder

Rev

Blame | Last modification | View Log | RSS feed

  1. unit DropSource3;
  2.  
  3. // -----------------------------------------------------------------------------
  4. //
  5. //                      *** NOT FOR RELEASE ***
  6. //
  7. // -----------------------------------------------------------------------------
  8. // Project:         Drag and Drop Component Suite
  9. // Module:          DropSource3
  10. // Description:     Deprecated TDropSource class.
  11. //                  Provided for compatibility with previous versions of the
  12. //                  Drag and Drop Component Suite.
  13. // Version:         4.0
  14. // Date:            25-JUN-2000
  15. // Target:          Win32, Delphi 3-6 and C++ Builder 3-5
  16. // Authors:         Angus Johnson, ajohnson@rpi.net.au
  17. //                  Anders Melander, anders@melander.dk, http://www.melander.dk
  18. // Copyright        © 1997-2000 Angus Johnson & Anders Melander
  19. // -----------------------------------------------------------------------------
  20.  
  21.  
  22. interface
  23.  
  24. uses
  25.   DragDrop,
  26.   DropSource,
  27.   ActiveX,
  28.   Classes;
  29.  
  30. {$include DragDrop.inc}
  31.  
  32. const
  33.   MAXFORMATS = 20;
  34.  
  35. type
  36.   // TODO -oanme -cStopShip : Verify that TDropSource can be used for pre v4 components.
  37.   TDropSource = class(TCustomDropSource)
  38.   private
  39.     FDataFormats: array[0..MAXFORMATS-1] of TFormatEtc;
  40.     FDataFormatsCount: integer;
  41.  
  42.   protected
  43.     // IDataObject implementation
  44.     function QueryGetData(const FormatEtc: TFormatEtc): HRESULT; stdcall;
  45.  
  46.     // TCustomDropSource implementation
  47.     function HasFormat(const FormatEtc: TFormatEtc): boolean; override;
  48.     function GetEnumFormatEtc(dwDirection: LongInt): IEnumFormatEtc; override;
  49.  
  50.     // New functions...
  51.     procedure AddFormatEtc(cfFmt: TClipFormat; pt: PDVTargetDevice;
  52.       dwAsp, lInd, tym: longint); virtual;
  53.  
  54.   public
  55.     constructor Create(AOwner: TComponent); override;
  56.   end;
  57.  
  58. implementation
  59.  
  60. uses
  61.   ShlObj,
  62.   SysUtils,
  63.   Windows;
  64.  
  65. // -----------------------------------------------------------------------------
  66. //                      TEnumFormatEtc
  67. // -----------------------------------------------------------------------------
  68.  
  69. type
  70.  
  71.   pFormatList = ^TFormatList;
  72.   TFormatList = array[0..255] of TFormatEtc;
  73.  
  74.   TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc)
  75.   private
  76.     FFormatList: pFormatList;
  77.     FFormatCount: Integer;
  78.     FIndex: Integer;
  79.   public
  80.     constructor Create(FormatList: pFormatList; FormatCount, Index: Integer);
  81.     { IEnumFormatEtc }
  82.     function Next(Celt: LongInt; out Elt; pCeltFetched: pLongInt): HRESULT; stdcall;
  83.     function Skip(Celt: LongInt): HRESULT; stdcall;
  84.     function Reset: HRESULT; stdcall;
  85.     function Clone(out Enum: IEnumFormatEtc): HRESULT; stdcall;
  86.   end;
  87. // -----------------------------------------------------------------------------
  88.  
  89. constructor TEnumFormatEtc.Create(FormatList: pFormatList;
  90.             FormatCount, Index: Integer);
  91. begin
  92.   inherited Create;
  93.   FFormatList := FormatList;
  94.   FFormatCount := FormatCount;
  95.   FIndex := Index;
  96. end;
  97. // -----------------------------------------------------------------------------
  98.  
  99. function TEnumFormatEtc.Next(Celt: LongInt;
  100.   out Elt; pCeltFetched: pLongInt): HRESULT;
  101. var
  102.   i: Integer;
  103. begin
  104.   i := 0;
  105.   WHILE (i < Celt) and (FIndex < FFormatCount) do
  106.   begin
  107.     TFormatList(Elt)[i] := FFormatList[fIndex];
  108.     Inc(FIndex);
  109.     Inc(i);
  110.   end;
  111.   if pCeltFetched <> NIL then pCeltFetched^ := i;
  112.   if i = Celt then result := S_OK else result := S_FALSE;
  113. end;
  114. // -----------------------------------------------------------------------------
  115.  
  116. function TEnumFormatEtc.Skip(Celt: LongInt): HRESULT;
  117. begin
  118.   if Celt <= FFormatCount - FIndex then
  119.   begin
  120.     FIndex := FIndex + Celt;
  121.     result := S_OK;
  122.   end else
  123.   begin
  124.     FIndex := FFormatCount;
  125.     result := S_FALSE;
  126.   end;
  127. end;
  128. // -----------------------------------------------------------------------------
  129.  
  130. function TEnumFormatEtc.ReSet: HRESULT;
  131. begin
  132.   fIndex := 0;
  133.   result := S_OK;
  134. end;
  135. // -----------------------------------------------------------------------------
  136.  
  137. function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HRESULT;
  138. begin
  139.   enum := TEnumFormatEtc.Create(FFormatList, FFormatCount, FIndex);
  140.   result := S_OK;
  141. end;
  142.  
  143. // -----------------------------------------------------------------------------
  144. //                      TDropSource
  145. // -----------------------------------------------------------------------------
  146.  
  147. constructor TDropSource.Create(AOwner: TComponent);
  148. begin
  149.   inherited Create(aOwner);
  150.   FDataFormatsCount := 0;
  151. end;
  152. // -----------------------------------------------------------------------------
  153.  
  154. function TDropSource.QueryGetData(const FormatEtc: TFormatEtc): HRESULT; stdcall;
  155. var
  156.   i: integer;
  157. begin
  158.   result:= S_OK;
  159.   for i := 0 to FDataFormatsCount-1 do
  160.     with FDataFormats[i] do
  161.     begin
  162.       if (FormatEtc.cfFormat = cfFormat) and
  163.          (FormatEtc.dwAspect = dwAspect) and
  164.          (FormatEtc.tymed and tymed <> 0) then exit; //result:= S_OK;
  165.     end;
  166.   result:= E_FAIL;
  167. end;
  168. // -----------------------------------------------------------------------------
  169.  
  170. function TDropSource.GetEnumFormatEtc(dwDirection: Integer): IEnumFormatEtc;
  171. begin
  172.   if (dwDirection = DATADIR_GET) then
  173.     Result := TEnumFormatEtc.Create(pFormatList(@FDataFormats), FDataFormatsCount, 0)
  174.   else
  175.     result := nil;
  176. end;
  177. // -----------------------------------------------------------------------------
  178.  
  179. procedure TDropSource.AddFormatEtc(cfFmt: TClipFormat;
  180.   pt: PDVTargetDevice; dwAsp, lInd, tym: longint);
  181. begin
  182.   if fDataFormatsCount = MAXFORMATS then exit;
  183.  
  184.   FDataFormats[fDataFormatsCount].cfFormat := cfFmt;
  185.   FDataFormats[fDataFormatsCount].ptd := pt;
  186.   FDataFormats[fDataFormatsCount].dwAspect := dwAsp;
  187.   FDataFormats[fDataFormatsCount].lIndex := lInd;
  188.   FDataFormats[fDataFormatsCount].tymed := tym;
  189.   inc(FDataFormatsCount);
  190. end;
  191. // -----------------------------------------------------------------------------
  192. // -----------------------------------------------------------------------------
  193.  
  194. function TDropSource.HasFormat(const FormatEtc: TFormatEtc): boolean;
  195. begin
  196.   Result := True;
  197.  { TODO -oanme -cStopShip : TDropSource.HasFormat needs implementation }
  198. end;
  199.  
  200. initialization
  201.   OleInitialize(NIL);
  202.   ShGetMalloc(ShellMalloc);
  203.  
  204. finalization
  205.   ShellMalloc := nil;
  206.   OleUninitialize;
  207. end.
  208.