유돌이

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Notice

2011. 9. 22. 16:08 델파이

델파이 기초 - WebBrowser 기능 정리

 

WebBrowser에 글추가

 

procedure WebString(Web: TWebBrowser; msg : string);
var tmp : string;
begin
  tmp := Web.OleObject.Document.Body.innerHTML;
  tmp := tmp + msg;
  Web.OleObject.Document.Body.innerHTML := tmp;
  Web.OleObject.Document.Body.Doscroll('PageDown');
end;

웹브라우져 컨트롤을 이용할때, enter key와 ctrl+c/x 동작 하도록 하기

 

작성자   : 임기택 [xor74] 

IOleInPlaceActiveObject로 검색을 해보니 비슷한 문서들이 많이 있긴 하던데,
대부분 enter key에 대한 언급 뿐이더군요.
그래서 ctrl+c/ctrl+x에 대해서도 처리하도록 조금 수정 해 봤습니다.
참고하세요..

-------------------------------------------------------------------------------------
uses
 ActiveX, ClipBrd;

var
 Form1: TForm1;
 FOleInPlaceActiveObject: IOleInPlaceActiveObject;
 SaveMessageHandler: TMessageEvent;

procedure TForm1.FormActivate(Sender: TObject);
begin
 SaveMessageHandler := Application.OnMessage;
 Application.OnMessage := MyMessageHandler;
end;

procedure TForm1.FormDeactivate(Sender: TObject);
begin
 Application.OnMessage := SaveMessageHandler;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Application.OnMessage := SaveMessageHandler;
 FOleInPlaceActiveObject := nil;
end;

procedure TForm1.MyMessageHandler(var Msg: TMsg; var Handled: Boolean);
const
 DialogKeys: set of Byte = [VK_LEFT, VK_RIGHT, VK_BACK, VK_UP, VK_DOWN,
   $30..$39, $41..$42, $44..$55, $57, $59..$5A];
begin
 { exit if we don't get back a webbrowser object }
 if WebBrowser1 = nil then
 begin
   Handled := False;
   Exit;
 end;

 if (Msg.hwnd = WebBrowser1.Handle) or (IsChild(WebBrowser1.Handle, Msg.hwnd)) then
 begin
   if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and (GetKeyState(VK_CONTROL) < 0) then
   begin
     Handled := (WebBrowser1.Application as IOleInPlaceActiveObject).TranslateAccelerator(Msg)=S_OK;
     if (Msg.wParam = 67) then
     Clipboard.AsText := WebBrowser1.OleObject.Document.selection.createRange().text;
     if (Msg.wParam = 88) then
       WebBrowser1.OleObject.Document.selection.createRange().text := ';
     WebBrowser1.OleObject.Document.selection.createRange().select();
   end
   else
   begin
     Handled := not word(Msg.wParam) in [byte('A')..byte('Z'),VK_RETURN];
     if Handled or (Msg.wParam = VK_RETURN) then
       Handled := (WebBrowser1.Application as IOleInPlaceActiveObject).TranslateAccelerator(Msg)=S_OK;
   end
 end;

end;

 

WebBrowser에 메인과 프레임 읽기 완료 알기

 

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
 CurWebrowser: IWebBrowser;
 TopWebBrowser: IWebBrowser;
 Document: OleVariant;
 WindowName: string;
begin
 CurWebrowser := pDisp as IWebBrowser;
 TopWebBrowser := (Sender as TWebBrowser).DefaultInterface;
 if CurWebrowser = TopWebBrowser then
   Memo1.Lines.Add('Complete document was loaded')
 else;
 begin
   Document := CurWebrowser.Document;
   WindowName := Document.ParentWindow.Name;
   Memo1.Lines.Add(Format('Frame "%s" was loaded', [WindowName]));
 end;
end;

 

TWebBrowser에서 특정문자를 부각시키고 위치하기

 

TWebBrowser에 불려진 윕분서에서 특정 문자열을 찾아서 부각시키고
찾은 문자열에 화면을 스크롤하여 보여줍니다.

아래의 코드는 찾은 문자열의 배경을 빨간색으로 바꾸어 줍니다.
prefix 를 바꾸어주면 다르게도 가능하겠죠. ^^

TEmbeddedWB에서도 WBLocateHighlight(WB: TWebBrowser; Text: string)을
WBLocateHighlight(WB: TEmbeddedWB; Text: string)으로 바꾸어주면 사용 할 수 있습니다.


uses mshtml;

procedure WBLocateHighlight(WB: TWebBrowser; Text: string) ;
const
  prefix = '<span style="color:white; background-color: red;">';
  suffix = '</span>';
var
  tr: IHTMLTxtRange;
begin
  if Assigned(WB.Document) then
  begin
    tr := ((wb.Document AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange;
    while tr.findText(Text, 1, 0) do
    begin
      tr.pasteHTML(prefix + tr.htmlText + suffix) ;
      tr.scrollIntoView(True) ;
    end;
  end;
end;

사용 방법은 
WBLocateHighlight(WebBrowser1,'musk95') ;
입니다.

 

WebBrowser를 이용하여 폼 필드에 값 할당과 submit

 

i) 직접 접근 방법

 WebBrowser1.OleObject.Document.frmMain.userID.value := 'k133';
                             // 폼 이름과 폼 필드 이름을 직접 코딩
 WebBrowser1.OleObject.Document.frmMain.submit;
 => "구성원이 없습니다." 라는 에러 발생합니다.


ii) 이름으로 접근 방법

 WebBrowser1.OleObject.Document.all.item('userID').value := 'k133';

 WebBrowser1.OleObject.Document.all.item('submit').Click;

 

빈화면을 만들기


procedure NewDocument;
var
 C: array[0..MAX_PATH-1] of Char;
 FileName: String;
begin
 GetTempPath( MAX_PATH, C );
 FileName := C;
 if FileName[ Length( FileName ) ] <> '\' then FileName := FileName + '\';
 FileName := FileName + 'test.htm';
 with TFileStream.Create( FileName, fmCreate ) do Free;
 WebBrowser.Navigate( FileName );
end;

소스보기

 

procedure 프로시져명;
var MyDocument: OleVariant;
begin
  MyDocument := WebBrowser1.Document;
  Memo1.Lines.Clear;
  // HTML 소스 보기
  Memo1.Lines.Add(MyDocument.DocumentElement.InnerHTML);
  // 일반 내용 보기
  Memo1.Lines.Add(WebBrowser1.OleObject.Document.DocumentElement.InnerText);
  Memo1.Visible:= True;
  Memo1.Align:= alClient;
  if Memo1.CanFocus then
  Memo1.SetFocus;
end;

 

싸이트이동

WebBrowser1.Navigate('싸이트명');

WebBrowser1.Navigate('About:Blank'); //웹브라우져초기화

 

현재오픈된 URL가지고 오기

procedureOKGetURL(AStrings:TStrings); 

functionWebBrowserCheck(constWebb:IWebBrowser2):Boolean; 
var WebV:Variant; 
    Buf:string; 
begin
  WebV:=Webb; 
  Result:=False; 
  if Assigned(Webb)then 
  try 
    Buf:=WebV.Document.URL; 
    Result:=True; 
  except; 
  end; 
end; 

var 
  Count,i:integer; 
  mShellWindow:IShellWindows; 
  Webb:IWebBrowser2; 
  WebV:Variant; 
begin 
  mShellWindow:=CreateComObject(CLASS_ShellWindows) as IShellWindows; 
  Count:=mShellWindow.Count; 
  fori:=0 to Count-1 do
  begin 
    ifWebBrowserCheck(mShellWindow.Item(i)asIWebBrowser2) then
    begin 
      try
        Webb:=IWebBrowser2(mShellWindow.Item(i));
        WebV:=Webb; 
        AStrings.Add(WebV.Document.URL);
      except; 
      end;     
    end;
  end;
end;

 

WebBrowser에서 이미지 찾아서 클릭하기

 

uses
  
MSHTML;

var
  
iDoc: IHtmlDocument2;
  i: integer;
  ov: OleVariant;
  iDisp: IDispatch;
  iColl: IHTMLElementCollection;
  InputImage: HTMLInputImage;
begin
  
WebBrowser1.ControlInterface.Document.QueryInterface(IHtmlDocument2, iDoc);
  if not Assigned(iDoc) 
then
  begin
    
Exit;
  end;
  ov := 'INPUT';
  iDisp := iDoc.all.tags(ov);
  if Assigned(IDisp) 
then
  begin
    
IDisp.QueryInterface(IHTMLElementCollection, iColl);
    if Assigned(iColl) 
then
    begin
      for 
i := 1 to iColl.Get_length 
do
      begin
        
iDisp := iColl.item(pred(i), 0);
        iDisp.QueryInterface(HTMLInputImage, InputImage);
        if Assigned(InputImage) 
then
        begin
          if 
InputImage.Name = 'submit' 
then
          
// if the name is submit / falls der name submit lautet
          
begin
            
InputImage.Click;  
// click it / klick es
          
end;
        end;
      end;
    end;
  end;
end;

// 2.

procedure TForm1.Button1Click(Sender: TObject);
var
  
i: Word;
  Document: IHtmlDocument2;
  str: string;
begin
  
// Schleife über alle Bilder im Webbrowser
  
for i := 0 to WebBrowser1.OleObject.Document.Images.Length - 1 
do
  begin
    
Document := WebBrowser1.Document as IHtmlDocument2;
    
// URL auslesen
    
Str := (Document.Images.Item(i, 0) as IHTMLImgElement).Href;
    
// Dateiname des Bildes überprüfen
    
if Pos('submit_icon.gif', str) <> 0 
then
    begin
      
((Document.Images.Item(i, 0) as IHTMLImgElement) as IHTMLElement).Click;
    end;
  end;
end;


'델파이' 카테고리의 다른 글

Virtual Key Codes  (0) 2019.09.23
화면 캡쳐하기  (0) 2019.09.23
TWebBrowser에 직접 HTML 소스코드 넣기  (0) 2011.07.05
Creating and Using DLLs from Delphi  (0) 2011.07.05
유니코드로 인코딩 된 텍스트 파일 읽기  (0) 2011.07.05
posted by 유돌이