Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | daniel-mar | 1 | unit DropURLTarget; |
2 | |||
3 | // ----------------------------------------------------------------------------- |
||
4 | // Project: Drag and Drop Component Suite |
||
5 | // Component Names: TDropURLTarget |
||
6 | // Module: DropURLTarget |
||
7 | // Description: Implements Dragging & Dropping of URLs |
||
8 | // TO your application from another. |
||
9 | // Version: 3.7 |
||
10 | // Date: 22-APR-1999 |
||
11 | // Target: Win32, Delphi 3 - Delphi 5, C++ Builder 3, C++ Builder 4 |
||
12 | // Authors: Angus Johnson, ajohnson@rpi.net.au |
||
13 | // Anders Melander, anders@melander.dk |
||
14 | // http://www.melander.dk |
||
15 | // Copyright © 1997-99 Angus Johnson & Anders Melander |
||
16 | // ----------------------------------------------------------------------------- |
||
17 | |||
18 | interface |
||
19 | |||
20 | uses |
||
21 | DropSource, DropTarget, |
||
22 | Classes, ActiveX; |
||
23 | |||
24 | {$include DragDrop.inc} |
||
25 | |||
26 | type |
||
27 | TDropURLTarget = class(TDropTarget) |
||
28 | private |
||
29 | URLFormatEtc, |
||
30 | FileContentsFormatEtc, |
||
31 | FGDFormatEtc: TFormatEtc; |
||
32 | fURL: String; |
||
33 | fTitle: String; |
||
34 | protected |
||
35 | procedure ClearData; override; |
||
36 | function DoGetData: boolean; override; |
||
37 | function HasValidFormats: boolean; override; |
||
38 | public |
||
39 | constructor Create(AOwner: TComponent); override; |
||
40 | property URL: String Read fURL Write fURL; |
||
41 | property Title: String Read fTitle Write fTitle; |
||
42 | end; |
||
43 | |||
44 | procedure Register; |
||
45 | |||
46 | implementation |
||
47 | |||
48 | uses |
||
49 | Windows, |
||
50 | SysUtils, |
||
51 | ShlObj; |
||
52 | |||
53 | procedure Register; |
||
54 | begin |
||
55 | RegisterComponents('DragDrop', [TDropURLTarget]); |
||
56 | end; |
||
57 | // ----------------------------------------------------------------------------- |
||
58 | |||
59 | function GetURLFromFile(const Filename: string; var URL: string): boolean; |
||
60 | var |
||
61 | URLfile : TStringList; |
||
62 | i : integer; |
||
63 | s : string; |
||
64 | p : PChar; |
||
65 | begin |
||
66 | Result := False; |
||
67 | URLfile := TStringList.Create; |
||
68 | try |
||
69 | URLFile.LoadFromFile(Filename); |
||
70 | i := 0; |
||
71 | while (i < URLFile.Count-1) do |
||
72 | begin |
||
73 | if (CompareText(URLFile[i], '[InternetShortcut]') = 0) then |
||
74 | begin |
||
75 | inc(i); |
||
76 | while (i < URLFile.Count) do |
||
77 | begin |
||
78 | s := URLFile[i]; |
||
79 | p := PChar(s); |
||
80 | if (StrLIComp(p, 'URL=', length('URL=')) = 0) then |
||
81 | begin |
||
82 | inc(p, length('URL=')); |
||
83 | URL := p; |
||
84 | Result := True; |
||
85 | exit; |
||
86 | end else |
||
87 | if (p^ = '[') then |
||
88 | exit; |
||
89 | inc(i); |
||
90 | end; |
||
91 | end; |
||
92 | inc(i); |
||
93 | end; |
||
94 | finally |
||
95 | URLFile.Free; |
||
96 | end; |
||
97 | end; |
||
98 | |||
99 | // ----------------------------------------------------------------------------- |
||
100 | // TDropURLTarget |
||
101 | // ----------------------------------------------------------------------------- |
||
102 | |||
103 | constructor TDropURLTarget.Create(AOwner: TComponent); |
||
104 | begin |
||
105 | inherited Create(AOwner); |
||
106 | DragTypes := [dtLink]; //Only allow links. |
||
107 | GetDataOnEnter := true; |
||
108 | with URLFormatEtc do |
||
109 | begin |
||
110 | cfFormat := CF_URL; |
||
111 | ptd := nil; |
||
112 | dwAspect := DVASPECT_CONTENT; |
||
113 | lindex := -1; |
||
114 | tymed := TYMED_HGLOBAL; |
||
115 | end; |
||
116 | with FileContentsFormatEtc do |
||
117 | begin |
||
118 | cfFormat := CF_FILECONTENTS; |
||
119 | ptd := nil; |
||
120 | dwAspect := DVASPECT_CONTENT; |
||
121 | lindex := 0; |
||
122 | tymed := TYMED_HGLOBAL; |
||
123 | end; |
||
124 | with FGDFormatEtc do |
||
125 | begin |
||
126 | cfFormat := CF_FILEGROUPDESCRIPTOR; |
||
127 | ptd := nil; |
||
128 | dwAspect := DVASPECT_CONTENT; |
||
129 | lindex := -1; |
||
130 | tymed := TYMED_HGLOBAL; |
||
131 | end; |
||
132 | end; |
||
133 | // ----------------------------------------------------------------------------- |
||
134 | |||
135 | //This demonstrates how to enumerate all DataObject formats. |
||
136 | function TDropURLTarget.HasValidFormats: boolean; |
||
137 | var |
||
138 | GetNum, GotNum: longint; |
||
139 | FormatEnumerator: IEnumFormatEtc; |
||
140 | tmpFormatEtc: TformatEtc; |
||
141 | begin |
||
142 | result := false; |
||
143 | //Enumerate available DataObject formats |
||
144 | //to see if any one of the wanted formats is available... |
||
145 | if (DataObject.EnumFormatEtc(DATADIR_GET,FormatEnumerator) <> S_OK) or |
||
146 | (FormatEnumerator.Reset <> S_OK) then |
||
147 | exit; |
||
148 | GetNum := 1; //get one at a time... |
||
149 | while (FormatEnumerator.Next(GetNum, tmpFormatEtc, @GotNum) = S_OK) and |
||
150 | (GetNum = GotNum) do |
||
151 | with tmpFormatEtc do |
||
152 | if (ptd = nil) and (dwAspect = DVASPECT_CONTENT) and |
||
153 | {(lindex <> -1) or} (tymed and TYMED_HGLOBAL <> 0) and |
||
154 | ((cfFormat = CF_URL) or (cfFormat = CF_FILECONTENTS) or |
||
155 | (cfFormat = CF_HDROP) or (cfFormat = CF_TEXT)) then |
||
156 | begin |
||
157 | result := true; |
||
158 | break; |
||
159 | end; |
||
160 | end; |
||
161 | // ----------------------------------------------------------------------------- |
||
162 | |||
163 | procedure TDropURLTarget.ClearData; |
||
164 | begin |
||
165 | fURL := ''; |
||
166 | end; |
||
167 | // ----------------------------------------------------------------------------- |
||
168 | |||
169 | function TDropURLTarget.DoGetData: boolean; |
||
170 | var |
||
171 | medium: TStgMedium; |
||
172 | cText: pchar; |
||
173 | tmpFiles: TStringList; |
||
174 | pFGD: PFileGroupDescriptor; |
||
175 | begin |
||
176 | fURL := ''; |
||
177 | fTitle := ''; |
||
178 | result := false; |
||
179 | //-------------------------------------------------------------------------- |
||
180 | if (DataObject.GetData(URLFormatEtc, medium) = S_OK) then |
||
181 | begin |
||
182 | try |
||
183 | if (medium.tymed <> TYMED_HGLOBAL) then |
||
184 | exit; |
||
185 | cText := PChar(GlobalLock(medium.HGlobal)); |
||
186 | fURL := cText; |
||
187 | GlobalUnlock(medium.HGlobal); |
||
188 | result := true; |
||
189 | finally |
||
190 | ReleaseStgMedium(medium); |
||
191 | end; |
||
192 | end |
||
193 | //-------------------------------------------------------------------------- |
||
194 | else if (DataObject.GetData(TextFormatEtc, medium) = S_OK) then |
||
195 | begin |
||
196 | try |
||
197 | if (medium.tymed <> TYMED_HGLOBAL) then |
||
198 | exit; |
||
199 | cText := PChar(GlobalLock(medium.HGlobal)); |
||
200 | fURL := cText; |
||
201 | GlobalUnlock(medium.HGlobal); |
||
202 | result := true; |
||
203 | finally |
||
204 | ReleaseStgMedium(medium); |
||
205 | end; |
||
206 | end |
||
207 | //-------------------------------------------------------------------------- |
||
208 | else if (DataObject.GetData(FileContentsFormatEtc, medium) = S_OK) then |
||
209 | begin |
||
210 | try |
||
211 | if (medium.tymed <> TYMED_HGLOBAL) then |
||
212 | exit; |
||
213 | cText := PChar(GlobalLock(medium.HGlobal)); |
||
214 | fURL := cText; |
||
215 | fURL := copy(fURL,24,250); |
||
216 | GlobalUnlock(medium.HGlobal); |
||
217 | result := true; |
||
218 | finally |
||
219 | ReleaseStgMedium(medium); |
||
220 | end; |
||
221 | end |
||
222 | //-------------------------------------------------------------------------- |
||
223 | else if (DataObject.GetData(HDropFormatEtc, medium) = S_OK) then |
||
224 | begin |
||
225 | try |
||
226 | if (medium.tymed <> TYMED_HGLOBAL) then exit; |
||
227 | tmpFiles := TStringList.create; |
||
228 | try |
||
229 | if GetFilesFromHGlobal(medium.HGlobal,TStrings(tmpFiles)) and |
||
230 | (lowercase(ExtractFileExt(tmpFiles[0])) = '.url') and |
||
231 | GetURLFromFile(tmpFiles[0], fURL) then |
||
232 | begin |
||
233 | fTitle := extractfilename(tmpFiles[0]); |
||
234 | delete(fTitle,length(fTitle)-3,4); //deletes '.url' extension |
||
235 | result := true; |
||
236 | end; |
||
237 | finally |
||
238 | tmpFiles.free; |
||
239 | end; |
||
240 | finally |
||
241 | ReleaseStgMedium(medium); |
||
242 | end; |
||
243 | end; |
||
244 | |||
245 | if (DataObject.GetData(FGDFormatEtc, medium) = S_OK) then |
||
246 | begin |
||
247 | try |
||
248 | if (medium.tymed <> TYMED_HGLOBAL) then exit; |
||
249 | pFGD := pointer(GlobalLock(medium.HGlobal)); |
||
250 | fTitle := pFGD^.fgd[0].cFileName; |
||
251 | GlobalUnlock(medium.HGlobal); |
||
252 | delete(fTitle,length(fTitle)-3,4); //deletes '.url' extension |
||
253 | finally |
||
254 | ReleaseStgMedium(medium); |
||
255 | end; |
||
256 | end |
||
257 | else if fTitle = '' then fTitle := fURL; |
||
258 | end; |
||
259 | // ----------------------------------------------------------------------------- |
||
260 | // ----------------------------------------------------------------------------- |
||
261 | |||
262 | end. |