OSDN Git Service

NGワード">>"で始まる文字列をコメントとする機能を追加
[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 begin
118         //\83u\83\89\83E\83U\82ª\95t\82¢\82Ä\82é\82Æ\82«\82¾\82¯\8f\88\97\9d\82·\82é
119         if (Self.Browser <> nil) then begin
120                 //\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Â
121                 while (Self.Browser.ReadyState <> READYSTATE_COMPLETE) and
122                                         (Self.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
123                         Sleep(1);
124                         Application.ProcessMessages;
125                 end;
126
127                 try
128                         OleVariant(Self.Browser.Document as IHTMLDocument2).body.scrollTop
129                 := OleVariant(Self.Browser.Document as IHTMLDocument2).body.scrollTop
130                     + scroll;
131                 except
132                 end;
133         end;
134 end;
135
136 //ID\83A\83\93\83J\81[\92Ç\89Á
137 procedure TBrowserRecord.IDAnchorPopup(Abody :string);
138 const
139         OUTER_HTML = '<p id="idSearch"></p>';
140         HIDDEN = 'hidden';
141 var
142         firstElement: IHTMLElement;
143         document: IHTMLDocument2;
144         docAll: IHTMLElementCollection;
145         doc : Variant;
146         nCSS : string;
147 begin
148         if Self.Browser <> nil then begin
149                 try
150                         document := Self.Browser.Document as IHTMLDocument2;
151
152                         if Assigned(document) then begin
153                                 docAll := document.all;
154                                 firstElement := docAll.item('idSearch', 0) as IHTMLElement;
155                                 if (Assigned(firstElement)) then begin
156                                         if Length(Abody) > 0 then begin
157                                                 doc := Idispatch( olevariant(Self.Browser.ControlInterface).Document) as IHTMLDocument2;
158                                                 nCSS := '<p id="idSearch" style="position:absolute;top:' + IntToStr(doc.Body.ScrollTop + 10) + 'px;right:5px;' //
159                                                         + 'background-color:window; border:outset 1px infobackground; z-index:10; overflow-y:auto; border-top:none">'
160                                                         + Abody + '</p>';
161                                                 firstElement.outerHTML := nCSS;
162                                                 firstElement.style.visibility := 'visible';
163                                         end else begin
164                                                 firstElement.outerHTML := OUTER_HTML;
165                                                 firstElement.style.visibility := HIDDEN;
166                                         end;
167                                 end else if (Assigned(firstElement)) then begin
168                                         firstElement.outerHTML := OUTER_HTML;
169                                         firstElement.style.visibility := HIDDEN;
170                                 end;
171                         end;
172                 except
173                 end;
174         end;
175 end;
176 {
177 \brief \8c\9f\8dõ\83_\83C\83A\83\8d\83O\8cÄ\82Ñ\8fo\82µ
178 }
179 procedure TBrowserRecord.OpenFindDialog();
180 const
181         CGID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
182         HTMLID_FIND = 1;
183 var
184         CmdTarget : IOleCommandTarget;
185         vaIn, vaOut: OleVariant;
186         PtrGUID: PGUID;
187 begin
188         if (Self.Browser <> nil) and (Self.Browser.Document <> nil) then begin
189                 //\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Â
190                 while (Self.Browser.ReadyState <> READYSTATE_COMPLETE) and
191                                         (Self.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
192                         Sleep(1);
193                         Application.ProcessMessages;
194                 end;
195         vaIn  := 0;
196         vaOut := 0;
197                 New(PtrGUID);
198                 PtrGUID^ := CGID_WebBrowser;
199         try
200                 try
201                         if Self.Browser.Document
202                     .QueryInterface(IOleCommandTarget, CmdTarget)
203                     = S_OK then begin
204                             if CmdTarget <> nil then begin
205                                     try
206                                             CmdTarget.Exec(PtrGUID, HTMLID_FIND, 0, vaIn, vaOut);
207                                         finally
208                                                 CmdTarget._Release;
209                                         end;
210                                 end;
211                 end;
212                     except
213                     end;
214         finally
215                 Dispose(PtrGUID);
216         end;
217         end;
218 end;
219
220 end.