Delphi3는 Twebbrowser 구성 요소를 갖기 시작했지만 그 당시 ActiveX 컨트롤 형태로 나타 났으며 다음 4.0 및 5.0에서 소개해야했습니다. 구성 요소 패널이 켜져 있습니다. 이번에는 사람들이 매우 열악한 일을하는 것을 듣습니다 더 많을 것입니다. 검색 할 때 사람들에게주는 느낌은 매우 복잡하고 매우 복잡합니다.
다음은 Twebbrowser를 사용하여 프로그램을 만들고 인터넷에서 수집 한 몇 가지 예제와 정보를 정리했습니다.
1. 초기화 및 마무리
execwb 등과 같은 원하는 작업을 수행하기 위해 twebbrowser의 메소드를 실행할 때 "등록되지 않은 누락 된 대상을 활성화하려고 시도하는 것"또는 "등록되지 않은 OLE 객체"와 같은 오류가 발생했을 수 있습니다. 선택한 웹 페이지 컨텐츠를 클립 보드 등에 복사 할 수없는 등 원하는 결과에 이르지 않습니다. 프로그램에 사용했을 때 ExecwB가 작동하지만 때로는 Delphi가 생성 한 기본 프로젝트 기본 창에 TwebBrowser를 추가하면 "OLE 객체가 등록되지 않은"오류가 발생하지 않는다는 것을 알았습니다. 또한 OLE 객체를 초기화하고 종료해야한다는 것을 깨달은 우연한 기회였습니다 (이해할 것이 너무 적습니다).
이전 기사 "정상적인 배열 타일을위한 Delphi 프로그램 창 애니메이션 및 솔루션"에서 언급 된 방법을 사용했습니다. 마침내 끝났습니다! 그 이유는 아마도 Twebbrowser가 내장 된 Ole 객체이며 Delphi에서 작성된 VCL이 아니기 때문일 것입니다.
초기화
Oleinitialize (nil);
마무리
노력하다
올레 우니 니탈 화;
제외하고
끝;
이 문장은 "끝"전에 메인 창의 모든 진술 후에 배치됩니다.
--------------------------------------------------------- --------------------------------------------
2. emptyparam
Delphi 5에서는 Twebbrowser의 탐색 방법이 여러 번 과부하됩니다.
절차 탐색 (const url : widestring);
절차 탐색 (const URL : widestring; var 플래그 :
Olevariant);
절차 탐색 (const URL : widestring; var 플래그 :
Olevariant; var targetframename : Olevariant;
절차 탐색 (const URL : widestring; var 플래그 :
Olevariant; var targetframename : var var data;
Olevariant);
절차 탐색 (const URL : widestring; var 플래그 :
Olevariant; var targetframename : var var data;
Olevariant; var 헤더 : Olevariant;
실제 응용 분야에서 후자의 방법을 호출 할 때 후자의 매개 변수를 거의 사용하지 않지만 함수 선언에는 변수 매개 변수가 필요하므로 일반 방법은 다음과 같습니다.
var
T : 올리전자;
시작하다
webbrowser1.navigate (edit1.text, t, t, t, t);
끝;
변수 t를 정의하는 것은 매우 번거 롭습니다 (여전히 사용할 장소는 여전히 많습니다). 실제로, 우리는 대신 emptyparam을 사용할 수 있습니다 (emptyparam은 일반적인 변형 빈 변수이며 값을 할당하지 마십시오), 단 하나의 문장입니다.
webbrowser1.navigate (edit1.text, emptyparam, emptyparam, emptyparam, emptyparam);
조금 길지만 매번 변수를 정의하는 것보다 훨씬 편리합니다. 물론 첫 번째 방법도 사용할 수 있습니다.
webbrowser1.navigate (edit1.text)
--------------------------------------------------------- --------------------------------------------
3. EXECWB 메소드를 사용하여 공통 명령 작업을 완료 할 수 있습니다.
프로 시저 execwb (cmdid : elecmdid; cmdexecopt :
OlecMdexeCopt);
프로 시저 execwb (cmdid : elecmdid; cmdexecopt : elecmdexecopt;
var pvain :
Olevariant);
프로 시저 execwb (cmdid : rolecmdid; cmdexecopt :
OlecMdexeCopt;
Olevariant; var pvaout : Olevariant;
OPEN : "인터넷 오픈 주소"대화 상자가 나타나고 CommandId는 OlecMDID_OPEN입니다 (브라우저 버전이 IE5.0 인 경우.
이 명령을 사용할 수 없습니다).
저장 : 저장을 대화 상자로 호출하십시오.
execwb (elecmdid_saveas, elecmdexecopt_dodefault,
emptyparam,
emptyparam);
인쇄, 인쇄 미리보기 및 페이지 설정 : "인쇄", "인쇄 미리보기"및 "페이지 설정"대화 상자를 호출하십시오 (IE5.5 이상은 "유형"버전 만 지원합니다.
인쇄 미리보기이므로 구현은이 명령을 사용할 수 있는지 확인해야합니다).
execwb (elecmdid_print, elecmdexecopt_dodefault,
emptyparam,
emptyparam);
querystatuswb (elecmdid_printpreview) = 3 인 경우
execwb (elecmdid_printpreview, elecmdexecopt_dodefault,
emptyparam, emptyparam);
execwb (elecmdid_pagesetup, elecmdexecopt_dodefault,
emptyparam,
emptyparam);
잘라 내기, 복사, 붙여 넣기, 모든 선택 : 기능에 대해 많이 말할 필요가 없으며, 절단 및 붙여 넣기는 프레임 편집을위한 텍스트뿐만 아니라 웹 페이지에서 비 편집도 제공한다는 점에 유의해야합니다.
편집 상자의 텍스트도 효과적입니다. 명령 활성화 상태를 얻습니다
명령을 실행하는 두 가지 방법이 있습니다 (예제로 사본을 가져 오기, 절단, 붙여 넣기 및 선택하면 각 키워드가 대체됩니다.
변경, 즉 잘라 내기, 붙여 넣기 및 selectall을 변경하십시오.
A. twebbrowser의 QueryStatusWB 메소드를 사용하십시오.
if (QueryStatusWB (elecmdid_copy) = elecmdf_enabled) 또는
elecmdf_supported)
execwb (elecmdid_copy, elecmdexecopt_dodefault,
emptyparam,
emptyparam);
B. ihtmldocument2의 querycommandenabled 메소드를 사용하십시오.
var
DOC : ihtmldocument2;
시작하다
doc : = webbrowser1.document as ihtmldocument2;
Doc.QueryCommandenabled ( 'Copy') 인 경우
doc.execcommand ( 'copy', false, emptyparam);
끝;
검색 : 아홉 번째 "찾기"기능을 참조하십시오.
--------------------------------------------------------- --------------------------------------------
4. 글꼴 크기
"font"메뉴에서 "최대"에서 "최소"까지의 5 가지 항목과 유사합니다 (5 개의 메뉴 항목의 이름이 다음과 같습니다.
속성은 각각 0 ~ 4로 설정됩니다).
A. 현재 페이지의 글꼴 크기를 읽으십시오.
var
T : 올리전자;
시작하다
webbrowser1.execwb (elecmdid_zoom,
elecmdexecopt_dontpromptuser,
emptyparam, t);
사례 T
4 : 가장 큰. 점검 : = 참;
3 : 더 큰. 점검 : = 참;
2 : 미들. 체크 : = 참;
1 : small.Checked : = 참;
0 : 가장 작은 점검 : = 참;
끝;
끝;
B. 페이지 글꼴 크기를 설정합니다.
가장 큰. 점검 : = 거짓;
크게 확인 : = 거짓;
중간. 점검 : = 거짓;
small.Checked : = false;
가장 작은 것 : = 거짓;
tmenuitem (sender) .Checked : = true;
t : = tmenuitem (sender) .tag;
webbrowser1.execwb (elecmdid_zoom,
elecmdexecopt_dontpromptuser,
t, t);
--------------------------------------------------------- --------------------------------------------
5. 즐겨 찾기에 추가하고 즐겨 찾기를 구성하십시오
Const
clsid_shelluihelper : tguid =
'{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
var
P : 절차 (핸들 : Thandle; PATH : PCHAR);
절차 tform1. OrganizeFavorite (Sender : Tobject);
var
H : HWND;
시작하다
h : = loadLibrary (pchar ( 'shdocvw.dll'));
h <> 0이면
시작하다
p : = getProcAddress (H, PCHA ( 'DoorganizeFavdlg'));
할당 된 경우 (P) P (Application.Handle,
PCHA (Favfolder));
끝;
프리 브리 브리 (Freelibrary) (H);
끝;
절차 tform1.addfavorite (sender : tobject);
var
Shelluihelper : Ishelluihelper;
URL, 제목 : Olevariant;
시작하다
제목 : = WebBrowser1.locationName;
URL : = WebBrowser1.locationUrl;
url <> ''라면
시작하다
shelluihelper : = createcomobject (clsid_shelluihelper) as
Ishelluihelper;
shelluihelper.addfavorite (url, title);
끝;
끝;
위의 메소드를 사용하여 Ishelluihelper 인터페이스를 통해 "즐겨 찾기 추가"대화 상자를 여는 방법은 비교적 간단하지만 단점이 있습니다. 즉, 열린 창은 모드 창이 아니지만 응용 프로그램과 무관합니다. 대화 상자를 열기 위해 OrganizeFavorite 절차와 동일한 방법을 사용하는 경우 부모 창의 핸들을 지정할 수 있으므로 모드 창을 자연스럽게 구현할 수 있습니다 (효과는 "좋아하는 것"을 여는 것과 동일합니다. 탐색기와 IE의 대화 상자). 문제는 분명히 위의 두 프로세스의 저자는 Shdocvw.dll에서 도어 가니즈 파드 그의 프로토 타입 만 알았지 만 Doaddtofavdlg의 프로토 타입은 알았으므로 Ishelluihelper 인터페이스를 사용하여 구현해야했습니다 (아마도 충분히 엄격하고 생각하지 않았습니다. 패턴 창이든 상관 없습니다.
다음 프로세스는 Doaddtofavdlg의 기능 프로토 타입을 알려줍니다. 이러한 방식으로 열린 대화 상자는 "즐겨 찾기에 추가"작업을 수행하지 않습니다. 인터넷 바로 가기를 배치하려고합니다.
절차 tform1.addfavorite (예 : tembeddedwb);
절차 createurl (aurlpath, aurl : pchar);
var
Urlfile : Tinifile;
시작하다
urlfile : = tinifile.create (String (aurlpath));
rlfile.writestring ( 'InternetshortCut', 'url',
문자열 (aurl));
rlfile.free;
끝;
var
AddFav : 함수 (핸들 : thandle;
urlpath : pchar; urlpathsize : 추기경;
제목 : pchar; 제목 : 추기경;
favidlist : pitemidlist) : bool;
FDOC : ihtmlDocument2;
urlpath, url, 제목 : array [0..max_path] char;
H : HWND;
PIDL : PITEMIDLIST;
Fretok : bool;
시작하다
fdoc : = ihtmldocument2 (예 : 문서);
fdoc = nil이면 종료;
strpcopy (title, fdoc.get_title);
strpcopy (url, fdoc.get_url);
url <> ''라면
시작하다
h : = loadLibrary (pchar ( 'shdocvw.dll'));
h <> 0이면
시작하다
ShgetSpecialfolderLocation (0, csidl_favorites, pidl);
addfav : = getProcadDress (H, PCHA ( 'doaddtofavdlg'));
할당 된 경우 (addfav)
fretok : = addfav (핸들, urlpath, sizeof (urlpath),
제목, sizeof (제목), pidl)
끝;
프리 브리 브리 (Freelibrary) (H);
그렇다면 Fretok
createUrl (urlpath, url);
끝
끝;
--------------------------------------------------------- --------------------------------------------
6. 웹 브라우저에 초점을 맞 춥니 다
Twebbrowser는 매우 특별합니다. TwinControl에서 상속 된 SetFocus 메소드는 포함 된 문서가 초점을 맞출 수 없으므로 즉시 인터넷을 사용할 수 없습니다.
Explorer 자체는 바로 가기 키가 있으며 솔루션은 다음과 같습니다.
절차 tform1.setfocustodoc;
시작하다
WebBrowser1.document <> nil이면
ioleObject와 같이 WebBrowser1.application을 사용합니다
Doverb (Oleiverb_uiactivate, nil, webbrowser1, 0, 핸들,
getClientRect);
끝;
그 외에도 여기에 나열된 더 쉬운 방법을 찾았습니다.
WebBrowser1.document <> nil이면
ihtmlwindow2 (ihtmldocument2 (webbrowser1.document) .parentwindow) .focus
더 쉬운 방법을 찾았을 것입니다. 아마도 가장 쉬운 것 :
WebBrowser1.document <> nil이면
ihtmlwindow4 (webbrowser1.document) .focus
또한 문서가 초점을 맞췄는지 여부를 결정해야합니다.
ihtmlwindow4 (webbrowser1.document). hasfocus입니다
--------------------------------------------------------- --------------------------------------------
7. "제출"버튼을 클릭하십시오
프로그램의 각 양식에 "기본"버튼이있는 것처럼 웹 페이지의 각 양식에는 "기본값"버튼, 즉 "제출"속성이있는 버튼도 있습니다 마우스에서 "제출"을 클릭하는 것과 같습니다. 그러나 Twebbrowser는 Enter 키에 응답하지 않는 것으로 보이며, Twebbrowser가 포함 된 양식의 키프 리뷰가 True로 설정 되더라도 사용자가 Twebbrowser로 보낸 키는 양식의 키 프레스 이벤트에서 가로 채지 못합니다.
내 해결책은 ApplicatineVents 구성 요소를 사용하거나 Tapplication Object의 OnMessage 이벤트를 직접 작성하고 메시지 유형을 판단하고 키보드 메시지에 응답하는 것입니다. "제출"버튼을 클릭하면 웹 소스 코드를 분석하여 수행 할 수 있지만 첫 번째 유형은 나 자신에 대한 두 가지 유형이 있습니다. 다른 사람이 썼습니다.
A. SendKeys 함수를 사용하여 Enter 키를 WebBrowser로 보냅니다.
델파이에서
5 CD의 Info/Extras/SendKeys 디렉토리에 SNDKE32.PAS 파일이 있습니다. 여기에는 SendKeys 기능을 사용하여 Enter 키를 웹 브라우저로 보낼 수 있습니다. 매우 간단합니다. Webbrowser가 집중할 때 (웹 브라우저에 포함 된 문서가 초점을 맞추기 위해 필요하지 않음) 하나의 문을 사용하십시오.
sendkeys ( '~', true); // return 키를 누릅니다
SendKeys 함수 등에 대한 자세한 매개 변수 설명은 SNDKE32.PAS 파일에 포함됩니다.
B. 수신 된 키보드 메시지를 OnMessage 이벤트에서 WebBrowser로 전달하십시오.
절차 tform1.applicationEvents1message (var msg : tmsg;
var 처리 : 부울);
{WebBrowser 내의 일부 키의 오작동을 수정합니다
제어}
Const
stdkeys = [vk_tab, vk_return] {표준 키}
ExtKeys = [vk_delete, vk_back, vk_left, vk_right];
확장 키}
fextended = $ 01000000; {확장 키 플래그}
시작하다
처리 : = 거짓;
MSG와 함께
if ((메시지> = wm_keyfirst) 및 (메시지 <= wm_keylast))
그리고
((wparam in stdkeys) 또는
{$ ifdef ver120} (getkeystate (vk_control) <0) 또는 {$ endif}
(extkeys의 wparam) 및
((lparam and fextended) = fextended))
노력하다
Ischild (hands, hwnd) 인 경우 {모든 브라우저를 처리합니다
관련 메시지}
시작하다
{$ ifdef
Ver120} 응용 프로그램 _ {$ else} 응용 프로그램 {$ endif} as
ioleinplaceacivitivebject
처리 : = TranslateAccelerator (MSG) = S_OK;
처리하지 않으면
시작하다
처리 : = 참;
TransleMessage (MSG);
DispatchMessage (MSG);
끝;
끝;
제외하고
끝;
끝; // 메시지 핸들러
(이 방법은 embeddedwb.pas에서 제공됩니다)
--------------------------------------------------------- --------------------------------------------
8. TwebBrowser에서 웹 페이지 소스 코드 및 HTML을 직접 가져옵니다.
먼저 Twebbrowser가 액세스하는 웹 페이지의 소스 코드를 얻는 매우 간단한 방법을 소개하겠습니다. 일반적인 방법은 Twebbrowser 컨트롤의 문서 개체가 제공하는 imperstreaminit 인터페이스를 사용하여 webbrowser.document 객체가 유효한지 확인한 다음 IpersistsTreamInit 인터페이스를 얻는 것입니다 HTML 소스 코드 크기, 글로벌 힙 메모리 블록을 할당하고 스트림을 생성 한 다음 HTML 텍스트를 스트림에 씁니다. 프로그램은 복잡하지는 않지만 더 간단한 방법이 있으므로 구현 코드는 더 이상 제공되지 않습니다. 실제로 기본적으로 모든 IE 함수 TwebBrowser는이를 구현하는 비교적 간단한 방법을 가져야하며 웹 페이지 소스 코드를 얻는 것도 마찬가지입니다. 다음 코드는 Memo1에 웹 페이지 소스 코드를 표시합니다.
memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outerhtml);
동시에 TwebBrowser를 탐색 할 때 HTML 파일을 텍스트 파일로 저장하는 것은 매우 간단하며 TwebBrowser도 완료되므로 구문 구문 분석 도구가 필요하지 않습니다.
memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outertext);
--------------------------------------------------------- --------------------------------------------
9. "찾기"기능
검색 대화 상자는 문서가 프로그램에서 초점을 맞추면 ilecmandtarget 객체의 멤버 기능이 호출되면 다음과 같습니다. 그것을 만들기위한 프로그램, 텍스트 선택, 즉 검색 대화 상자를 직접 설계 할 수 있습니다.
var
DOC : ihtmldocument2;
txtrange : ihtmltxtrange;
시작하다
doc : = webbrowser1.document as ihtmldocument2;
Doc.Selectall; // 이것은 모든 문서를 선택하려면 약자입니다.
//이 문장은 ihtmltxtrange 객체의 방법이 작동 할 수 있다는 전제가 있기 때문에 특히 중요합니다.
// 문서에는 이미 텍스트 선택 영역이 있습니다. 다음 진술이 실행되므로 그렇지 않습니다
// 모든 문서를 선택하는 프로세스를 참조하십시오.
txtrange : = doc.Selection.CreateRange as IHTMltXtrange;
txtrange.findText ( '검색 할 텍스트', 0.0);
txtrange.select;
끝;
또한 txt.get_text에서 현재 선택된 텍스트 콘텐츠를 얻을 수 있습니다.
--------------------------------------------------------- --------------------------------------------
10. 웹 페이지에서 모든 링크를 추출하십시오
이 방법은 독점 포럼 Hopfield Forum의 친구에게서 나옵니다.
var
DOC : ihtmldocument2;
모두 : ihtmlelementCollection;
Len, I : 정수;
항목 : Olevariant;
시작하다
doc : = webbrowser1. document as ihtmldocument2;
모두 : = doc.get_links; //doc.links도 괜찮습니다
렌 : = 모든 길이;
i : = 0에서 LEN-1이 시작됩니다
항목 : = all.item (i, varempty);
memo1.lines.add (item.href);
끝;
끝;
--------------------------------------------------------- --------------------------------------------
11. Twebbrowser의 인코딩을 설정하십시오
왜 항상 많은 기회를 놓치나요? 사실, 나는 그것을 오랫동안 생각해야했지만 생각의 차이는 그것을 차이의 세계로 만들 것입니다. 내가 그것에 대해 더 많이 생각하고 더 시도했다면, 그것은 11 위를 차지하지 않았을 것입니다. 다음은 상상할 수 없을 정도로 해결하기 쉬운 기능입니다.
절차 setcharset (awebbrowser : twebbrowser; acharset :
끈);
var
RefreshLevel : Olevariant;
시작하다
ihtmldocument2 (awebbrowser.document) .set_charset (acharset);
RefreshLevel : = 7;이 7은 버그를 돕기 위해 레지스트리에서 나와야합니다.
awebbrowser.Refresh2 (Compertlevel);
끝;