| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- unit DropSource3;
- // -----------------------------------------------------------------------------
- //
- // *** NOT FOR RELEASE ***
- //
- // -----------------------------------------------------------------------------
- // Project: Drag and Drop Component Suite
- // Module: DropSource3
- // Description: Deprecated TDropSource class.
- // Provided for compatibility with previous versions of the
- // Drag and Drop Component Suite.
- // Version: 4.0
- // Date: 25-JUN-2000
- // Target: Win32, Delphi 3-6 and C++ Builder 3-5
- // Authors: Angus Johnson, ajohnson@rpi.net.au
- // Anders Melander, anders@melander.dk, http://www.melander.dk
- // Copyright © 1997-2000 Angus Johnson & Anders Melander
- // -----------------------------------------------------------------------------
- interface
- uses
- DragDrop,
- DropSource,
- ActiveX,
- Classes;
- {$include DragDrop.inc}
- const
- MAXFORMATS = 20;
- type
- // TODO -oanme -cStopShip : Verify that TDropSource can be used for pre v4 components.
- TDropSource = class(TCustomDropSource)
- private
- FDataFormats: array[0..MAXFORMATS-1] of TFormatEtc;
- FDataFormatsCount: integer;
- protected
- // IDataObject implementation
- function QueryGetData(const FormatEtc: TFormatEtc): HRESULT; stdcall;
- // TCustomDropSource implementation
- function HasFormat(const FormatEtc: TFormatEtc): boolean; override;
- function GetEnumFormatEtc(dwDirection: LongInt): IEnumFormatEtc; override;
- // New functions...
- procedure AddFormatEtc(cfFmt: TClipFormat; pt: PDVTargetDevice;
- dwAsp, lInd, tym: longint); virtual;
- public
- constructor Create(AOwner: TComponent); override;
- end;
- implementation
- uses
- ShlObj,
- SysUtils,
- Windows;
- // -----------------------------------------------------------------------------
- // TEnumFormatEtc
- // -----------------------------------------------------------------------------
- type
- pFormatList = ^TFormatList;
- TFormatList = array[0..255] of TFormatEtc;
- TEnumFormatEtc = class(TInterfacedObject, IEnumFormatEtc)
- private
- FFormatList: pFormatList;
- FFormatCount: Integer;
- FIndex: Integer;
- public
- constructor Create(FormatList: pFormatList; FormatCount, Index: Integer);
- { IEnumFormatEtc }
- function Next(Celt: LongInt; out Elt; pCeltFetched: pLongInt): HRESULT; stdcall;
- function Skip(Celt: LongInt): HRESULT; stdcall;
- function Reset: HRESULT; stdcall;
- function Clone(out Enum: IEnumFormatEtc): HRESULT; stdcall;
- end;
- // -----------------------------------------------------------------------------
- constructor TEnumFormatEtc.Create(FormatList: pFormatList;
- FormatCount, Index: Integer);
- begin
- inherited Create;
- FFormatList := FormatList;
- FFormatCount := FormatCount;
- FIndex := Index;
- end;
- // -----------------------------------------------------------------------------
- function TEnumFormatEtc.Next(Celt: LongInt;
- out Elt; pCeltFetched: pLongInt): HRESULT;
- var
- i: Integer;
- begin
- i := 0;
- WHILE (i < Celt) and (FIndex < FFormatCount) do
- begin
- TFormatList(Elt)[i] := FFormatList[fIndex];
- Inc(FIndex);
- Inc(i);
- end;
- if pCeltFetched <> NIL then pCeltFetched^ := i;
- if i = Celt then result := S_OK else result := S_FALSE;
- end;
- // -----------------------------------------------------------------------------
- function TEnumFormatEtc.Skip(Celt: LongInt): HRESULT;
- begin
- if Celt <= FFormatCount - FIndex then
- begin
- FIndex := FIndex + Celt;
- result := S_OK;
- end else
- begin
- FIndex := FFormatCount;
- result := S_FALSE;
- end;
- end;
- // -----------------------------------------------------------------------------
- function TEnumFormatEtc.ReSet: HRESULT;
- begin
- fIndex := 0;
- result := S_OK;
- end;
- // -----------------------------------------------------------------------------
- function TEnumFormatEtc.Clone(out Enum: IEnumFormatEtc): HRESULT;
- begin
- enum := TEnumFormatEtc.Create(FFormatList, FFormatCount, FIndex);
- result := S_OK;
- end;
- // -----------------------------------------------------------------------------
- // TDropSource
- // -----------------------------------------------------------------------------
- constructor TDropSource.Create(AOwner: TComponent);
- begin
- inherited Create(aOwner);
- FDataFormatsCount := 0;
- end;
- // -----------------------------------------------------------------------------
- function TDropSource.QueryGetData(const FormatEtc: TFormatEtc): HRESULT; stdcall;
- var
- i: integer;
- begin
- result:= S_OK;
- for i := 0 to FDataFormatsCount-1 do
- with FDataFormats[i] do
- begin
- if (FormatEtc.cfFormat = cfFormat) and
- (FormatEtc.dwAspect = dwAspect) and
- (FormatEtc.tymed and tymed <> 0) then exit; //result:= S_OK;
- end;
- result:= E_FAIL;
- end;
- // -----------------------------------------------------------------------------
- function TDropSource.GetEnumFormatEtc(dwDirection: Integer): IEnumFormatEtc;
- begin
- if (dwDirection = DATADIR_GET) then
- Result := TEnumFormatEtc.Create(pFormatList(@FDataFormats), FDataFormatsCount, 0)
- else
- result := nil;
- end;
- // -----------------------------------------------------------------------------
- procedure TDropSource.AddFormatEtc(cfFmt: TClipFormat;
- pt: PDVTargetDevice; dwAsp, lInd, tym: longint);
- begin
- if fDataFormatsCount = MAXFORMATS then exit;
- FDataFormats[fDataFormatsCount].cfFormat := cfFmt;
- FDataFormats[fDataFormatsCount].ptd := pt;
- FDataFormats[fDataFormatsCount].dwAspect := dwAsp;
- FDataFormats[fDataFormatsCount].lIndex := lInd;
- FDataFormats[fDataFormatsCount].tymed := tym;
- inc(FDataFormatsCount);
- end;
- // -----------------------------------------------------------------------------
- // -----------------------------------------------------------------------------
- function TDropSource.HasFormat(const FormatEtc: TFormatEtc): boolean;
- begin
- Result := True;
- { TODO -oanme -cStopShip : TDropSource.HasFormat needs implementation }
- end;
- initialization
- OleInitialize(NIL);
- ShGetMalloc(ShellMalloc);
- finalization
- ShellMalloc := nil;
- OleUninitialize;
- end.
|