OSDN Git Service

8a1da49859a0148447b5ac834044d124756f52c1
[gikonavigoeson/gikonavi.git] / BrowserRecord.pas
1 unit BrowserRecord;
2
3 interface
4
5 uses
6         Windows, OleCtrls, ActiveX,
7 {$IF Defined(DELPRO) }
8         SHDocVw,
9         MSHTML,
10 {$ELSE}
11         SHDocVw_TLB,
12         MSHTML_TLB,
13 {$IFEND}
14         BoardGroup, HTMLDocumentEvent;
15
16 type
17         TBrowserRecord = class( TObject )
18         private
19                 FBrowser        : TWebBrowser;
20                 FEvent: THTMLDocumentEventSink; ///< \83u\83\89\83E\83U\83h\83L\83\85\83\81\83\93\83g\83C\83x\83\93\83g
21                 FThread         : TThreadItem;
22                 FLastSize       : Integer;
23                 FRepaint        : Boolean;
24                 //FMovement     : string;                                                       ///< \83X\83N\83\8d\81[\83\8b\90æ\83A\83\93\83J\81[
25         public
26                 destructor      Destroy; override;
27                 property        Event : THTMLDocumentEventSink read FEvent write FEvent;
28                 property        Browser : TWebBrowser   read FBrowser   write FBrowser;
29                 property        Thread  : TThreadItem   read FThread    write FThread;
30                 property        LastSize        : Integer               read FLastSize  write FLastSize;
31                 property        Repaint         : Boolean               read FRepaint   write FRepaint;
32                 //property      Movement        : string                read FMovement  write FMovement;
33                 procedure       Move(const AName: string); overload;
34         procedure       Move(scroll: Integer); overload;
35                 procedure       IDAnchorPopup(Abody :string);
36         procedure OpenFindDialog;
37         end;
38         // BrowserRecord\82É\82Â\82¢\82Ä\82¢\82éFBrowser\82ð\8aO\82·
39         procedure ReleaseBrowser( BRecord: TBrowserRecord);
40
41 implementation
42
43 uses
44         Forms, SysUtils;
45
46 // *************************************************************************
47 //! BrowserRecord\82É\82Â\82¢\82Ä\82¢\82éFBrowser\82ð\8aO\82·
48 // *************************************************************************
49 procedure ReleaseBrowser( BRecord: TBrowserRecord);
50 begin
51         if BRecord <> nil then begin
52                 BRecord.Browser := nil;
53                 if BRecord.Event <> nil then begin
54                         BRecord.Event.Free;
55                         BRecord.Event := nil;
56                 end;
57                 BRecord.Repaint := true;
58         end;
59 end;
60 // *************************************************************************
61 //! BrowserRecord\82Ì\83f\83X\83g\83\89\83N\83^
62 // *************************************************************************
63 destructor      TBrowserRecord.Destroy;
64 var
65         doc :OleVariant;
66 begin
67         if Self.FEvent <> nil then
68                 Self.FEvent.Free;
69         if Self.FBrowser <> nil then begin
70                 if Self.Thread <> nil then begin
71                         //\83^\83u\82Ì\95\9c\8c³\82Å\95\9c\8c³\82³\82ê\82½\83X\83\8c\82Í\81A\95`\89æ\82³\82ê\82Ä\82¢\82È\82¢\82Æ\82«\82ª\82 \82é\82Ì\82Å
72                         //\82»\82Ì\82Æ\82«\82Ì\83X\83N\83\8d\81[\83\8b\97Ê\82ð\95Û\91\82µ\82Ä\82µ\82Ü\82¤\82Æ\83g\83b\83v\82É\96ß\82Á\82Ä\82µ\82Ü\82¤\81B
73                         if Self.FBrowser.OleObject.Document.documentElement.innerText <> '' then begin
74                                 doc := Idispatch( olevariant(Self.FBrowser.ControlInterface).Document) as IHTMLDocument2;
75                                 Self.Thread.ScrollTop := doc.Body.ScrollTop;
76                         end;
77                 end;
78                 ShowWindow(Self.FBrowser.Handle, SW_HIDE);
79         end;
80
81 end;
82 // *************************************************************************
83 //! \83u\83\89\83E\83U\82ð\83X\83N\83\8d\81[\83\8b\82³\82¹\82é
84 // *************************************************************************
85 procedure TBrowserRecord.Move(const AName: string);
86 var
87         top: Integer;
88         item: OleVariant;
89 begin
90         //\83u\83\89\83E\83U\82ª\95t\82¢\82Ä\82é\82Æ\82«\82¾\82¯\8f\88\97\9d\82·\82é
91         if (Self.Browser <> nil) then begin
92                 //\83u\83\89\83E\83U\82ª\83f\81[\83^\82Ì\93Ç\82Ý\8d\9e\82Ý\92\86\82Ì\8e\9e\82Í\93Ç\82Ý\8d\9e\82Ý\82ð\91Ò\82Â
93                 while (Self.Browser.ReadyState <> READYSTATE_COMPLETE) and
94                                         (Self.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
95                         Sleep(1);
96                         Application.ProcessMessages;
97                 end;
98
99                 try
100                         top := 0;
101                         item := OleVariant( Self.Browser.Document as IHTMLDocument2)
102                                         .anchors.item(OleVariant(AName));
103                         item.focus();
104                         repeat
105                                 top := top + item.offsetTop;
106                                 item := item.offsetParent;
107                         until AnsiCompareText(item.tagName, 'body' ) = 0;
108                         OleVariant(Self.Browser.Document as IHTMLDocument2).body.scrollTop := top;
109                 except
110                 end;
111         end;
112 end;
113 // *************************************************************************
114 //! \83u\83\89\83E\83U\82ð\83X\83N\83\8d\81[\83\8b\82³\82¹\82é
115 // *************************************************************************
116 procedure TBrowserRecord.Move(scroll: Integer);
117 var
118         top: Integer;
119         item: OleVariant;
120 begin
121         //\83u\83\89\83E\83U\82ª\95t\82¢\82Ä\82é\82Æ\82«\82¾\82¯\8f\88\97\9d\82·\82é
122         if (Self.Browser <> nil) then begin
123                 //\83u\83\89\83E\83U\82ª\83f\81[\83^\82Ì\93Ç\82Ý\8d\9e\82Ý\92\86\82Ì\8e\9e\82Í\93Ç\82Ý\8d\9e\82Ý\82ð\91Ò\82Â
124                 while (Self.Browser.ReadyState <> READYSTATE_COMPLETE) and
125                                         (Self.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
126                         Sleep(1);
127                         Application.ProcessMessages;
128                 end;
129
130                 try
131                         OleVariant(Self.Browser.Document as IHTMLDocument2).body.scrollTop
132                 := OleVariant(Self.Browser.Document as IHTMLDocument2).body.scrollTop
133                     + scroll;
134                 except
135                 end;
136         end;
137 end;
138
139 //ID\83A\83\93\83J\81[\92Ç\89Á
140 procedure TBrowserRecord.IDAnchorPopup(Abody :string);
141 const
142         OUTER_HTML = '<p id="idSearch"></p>';
143         HIDDEN = 'hidden';
144 var
145         firstElement: IHTMLElement;
146         document: IHTMLDocument2;
147         docAll: IHTMLElementCollection;
148         doc : Variant;
149         nCSS : string;
150 begin
151         if Self.Browser <> nil then begin
152                 try
153                         document := Self.Browser.Document as IHTMLDocument2;
154
155                         if Assigned(document) then begin
156                                 docAll := document.all;
157                                 firstElement := docAll.item('idSearch', 0) as IHTMLElement;
158                                 if (Assigned(firstElement)) then begin
159                                         if Length(Abody) > 0 then begin
160                                                 doc := Idispatch( olevariant(Self.Browser.ControlInterface).Document) as IHTMLDocument2;
161                                                 nCSS := '<p id="idSearch" style="position:absolute;top:' + IntToStr(doc.Body.ScrollTop + 10) + 'px;right:5px;' //
162                                                         + 'background-color:window; border:outset 1px infobackground; z-index:10; overflow-y:auto; border-top:none">'
163                                                         + Abody + '</p>';
164                                                 firstElement.outerHTML := nCSS;
165                                                 firstElement.style.visibility := 'visible';
166                                         end else begin
167                                                 firstElement.outerHTML := OUTER_HTML;
168                                                 firstElement.style.visibility := HIDDEN;
169                                         end;
170                                 end else if (Assigned(firstElement)) then begin
171                                         firstElement.outerHTML := OUTER_HTML;
172                                         firstElement.style.visibility := HIDDEN;
173                                 end;
174                         end;
175                 except
176                 end;
177         end;
178 end;
179 {
180 \brief \8c\9f\8dõ\83_\83C\83A\83\8d\83O\8cÄ\82Ñ\8fo\82µ
181 }
182 procedure TBrowserRecord.OpenFindDialog();
183 const
184         CGID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
185         HTMLID_FIND = 1;
186 var
187         CmdTarget : IOleCommandTarget;
188         vaIn, vaOut: OleVariant;
189         PtrGUID: PGUID;
190 begin
191         if (Self.Browser <> nil) and (Self.Browser.Document <> nil) then begin
192                 //\83u\83\89\83E\83U\82ª\83f\81[\83^\82Ì\93Ç\82Ý\8d\9e\82Ý\92\86\82Ì\8e\9e\82Í\93Ç\82Ý\8d\9e\82Ý\82ð\91Ò\82Â
193                 while (Self.Browser.ReadyState <> READYSTATE_COMPLETE) and
194                                         (Self.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
195                         Sleep(1);
196                         Application.ProcessMessages;
197                 end;
198         vaIn  := 0;
199         vaOut := 0;
200                 New(PtrGUID);
201                 PtrGUID^ := CGID_WebBrowser;
202         try
203                 try
204                         if Self.Browser.Document
205                     .QueryInterface(IOleCommandTarget, CmdTarget)
206                     = S_OK then begin
207                             if CmdTarget <> nil then begin
208                                     try
209                                             CmdTarget.Exec(PtrGUID, HTMLID_FIND, 0, vaIn, vaOut);
210                                         finally
211                                                 CmdTarget._Release;
212                                         end;
213                                 end;
214                 end;
215                     except
216                     end;
217         finally
218                 Dispose(PtrGUID);
219         end;
220         end;
221 end;
222
223 end.