OSDN Git Service

close #16234,#16235
[gikonavigoeson/gikonavi.git] / BrowserRecord.pas
index ab6ee16..683e0bd 100644 (file)
@@ -21,7 +21,7 @@ type
                FThread         : TThreadItem;
                FLastSize       : Integer;
                FRepaint        : Boolean;
-               FMovement       : string;                                                       ///< \83X\83N\83\8d\81[\83\8b\90æ\83A\83\93\83J\81[
+               //FMovement     : string;                                                       ///< \83X\83N\83\8d\81[\83\8b\90æ\83A\83\93\83J\81[
        public
                destructor      Destroy; override;
                property        Event : THTMLDocumentEventSink read FEvent write FEvent;
@@ -29,12 +29,20 @@ type
                property        Thread  : TThreadItem   read FThread    write FThread;
                property        LastSize        : Integer               read FLastSize  write FLastSize;
                property        Repaint         : Boolean               read FRepaint   write FRepaint;
-               property        Movement        : string                read FMovement  write FMovement;
+               //property      Movement        : string                read FMovement  write FMovement;
+               procedure       Move(const AName: string); overload;
+        procedure      Move(scroll: Integer); overload;
+               procedure       IDAnchorPopup(Abody :string);
+        procedure OpenFindDialog;
        end;
        // BrowserRecord\82É\82Â\82¢\82Ä\82¢\82éFBrowser\82ð\8aO\82·
        procedure ReleaseBrowser( BRecord: TBrowserRecord);
 
 implementation
+
+uses
+       Forms, SysUtils;
+
 // *************************************************************************
 //! BrowserRecord\82É\82Â\82¢\82Ä\82¢\82éFBrowser\82ð\8aO\82·
 // *************************************************************************
@@ -54,24 +62,149 @@ end;
 // *************************************************************************
 destructor     TBrowserRecord.Destroy;
 var
-       doc :OleVariant;
+       doc :IHTMLDocument2;
 begin
        if Self.FEvent <> nil then
                Self.FEvent.Free;
+
        if Self.FBrowser <> nil then begin
                if Self.Thread <> nil then begin
                        //\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Å
                        //\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
-                       if Self.FBrowser.OleObject.Document.documentElement.innerText <> '' then begin
-                               doc := Idispatch( olevariant(Self.FBrowser.ControlInterface).Document) as IHTMLDocument2;
-                               Self.Thread.ScrollTop := doc.Body.ScrollTop;
-                       end;
+
+            try
+                doc := Self.FBrowser.ControlInterface.Document as IHTMLDocument2;
+                if Assigned(doc) then begin
+                    if (doc as IHTMLDocument3).documentElement.innerText <> '' then begin
+                        Self.Thread.ScrollTop := (doc.body as IHTMLElement2).scrollTop;
+                           end;
+                end;
+            except
+            end;
                end;
-               //TOleControl(Self.FBrowser).Visible := false;
                ShowWindow(Self.FBrowser.Handle, SW_HIDE);
        end;
 
 end;
+// *************************************************************************
+//! \83u\83\89\83E\83U\82ð\83X\83N\83\8d\81[\83\8b\82³\82¹\82é
+// *************************************************************************
+procedure TBrowserRecord.Move(const AName: string);
+var
+       top: Integer;
+       item: OleVariant;
+    doc : OleVariant;
+begin
+       //\83u\83\89\83E\83U\82ª\95t\82¢\82Ä\82é\82Æ\82«\82¾\82¯\8f\88\97\9d\82·\82é
+    if not Assigned(Self.Browser) then
+        Exit;
+
+       //\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Â
+       while (Self.Browser.ReadyState <> READYSTATE_COMPLETE) and
+                       (Self.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
+               Sleep(1);
+               Application.ProcessMessages;
+       end;
+
+       try
+        doc := Self.Browser.OleObject.Document;
+               top := 0;
+               item := doc.anchors.item(OleVariant(AName));
+               item.focus();
+               repeat
+                       top := top + item.offsetTop;
+               item := item.offsetParent;
+               until AnsiCompareText(item.tagName, 'body' ) = 0;
+               doc.body.scrollTop := top;
+       except
+       end;
+end;
+// *************************************************************************
+//! \83u\83\89\83E\83U\82ð\83X\83N\83\8d\81[\83\8b\82³\82¹\82é
+// *************************************************************************
+procedure TBrowserRecord.Move(scroll: Integer);
+var
+    doc: IHTMLDocument2;
+begin
+       //\83u\83\89\83E\83U\82ª\95t\82¢\82Ä\82é\82Æ\82«\82¾\82¯\8f\88\97\9d\82·\82é
+    if not Assigned(Self.Browser) then
+        Exit;
+
+       //\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Â
+       while (Self.Browser.ReadyState <> READYSTATE_COMPLETE) and
+                               (Self.Browser.ReadyState <> READYSTATE_INTERACTIVE) do begin
+               Sleep(1);
+               Application.ProcessMessages;
+       end;
+
+       try
+        doc := Self.Browser.ControlInterface.Document as IHTMLDocument2;
+               (doc.body as IHTMLElement2).scrollTop := (doc.body as IHTMLElement2).scrollTop + scroll;
+       except
+       end;
+end;
+
+//ID\83A\83\93\83J\81[\92Ç\89Á
+procedure TBrowserRecord.IDAnchorPopup(Abody :string);
+const
+       OUTER_HTML = '<p id="idSearch"></p>';
+       HIDDEN = 'hidden';
+var
+       firstElement: IHTMLElement;
+       doc : IHTMLDocument2;
+       nCSS : string;
+begin
+    if not Assigned(Self.Browser) then
+        Exit;
+
+       try
+               doc := Self.Browser.ControlInterface.Document as IHTMLDocument2;
+               if not Assigned(doc) then
+            Exit;
+
+               firstElement := doc.all.item('idSearch', 0) as IHTMLElement;
+               if not Assigned(firstElement) then
+            Exit;
 
+        try
+               if Length(Abody) > 0 then begin
+                       nCSS := '<p id="idSearch" style="position:absolute;top:' + IntToStr((doc.body as IHTMLElement2).ScrollTop + 10) + 'px;right:5px;' //
+                               + 'background-color:window; border:outset 1px infobackground; z-index:10; overflow-y:auto; border-top:none">'
+                                   + Abody + '</p>';
+                       firstElement.outerHTML := nCSS;
+                       firstElement.style.visibility := 'visible';
+                   end else begin
+                           firstElement.outerHTML := OUTER_HTML;
+                       firstElement.style.visibility := HIDDEN;
+               end;
+           except
+                   firstElement.outerHTML := OUTER_HTML;
+                       firstElement.style.visibility := HIDDEN;
+       end;
+
+       except
+       end;
+end;
+{
+\brief \8c\9f\8dõ\83_\83C\83A\83\8d\83O\8cÄ\82Ñ\8fo\82µ
+}
+procedure TBrowserRecord.OpenFindDialog();
+const
+       CGID_WebBrowser: TGUID = '{ED016940-BD5B-11cf-BA4E-00C04FD70816}';
+       HTMLID_FIND = 1;
+var
+       CmdTarget : IOleCommandTarget;
+       vaIn, vaOut: OleVariant;
+begin
+       if Assigned(Self.Browser) then begin
+               try
+                       CmdTarget := Self.Browser.ControlInterface.Document as IOleCommandTarget;
+                       if Assigned(CmdTarget) then begin
+                               CmdTarget.Exec(@CGID_WebBrowser, HTMLID_FIND, 0, vaIn, vaOut);
+                       end;
+               except
+               end;
+       end;
+end;
 
 end.