Delphi3 mulai memiliki komponen twebbrowser, tetapi muncul dalam bentuk kontrol ActiveX pada waktu itu dan perlu diperkenalkan dengan sendirinya. Panel komponen menyala. Saya sering mendengar orang -orang memarahi Delphi karena melakukan yang sangat buruk. akan lebih.
Berikut adalah beberapa pengalaman tentang penggunaan Twebbrowser untuk membuat program dan beberapa contoh dan informasi yang dikumpulkan dari internet.
1. Inisialisasi & Finalisasi
Ketika Anda menjalankan metode twebbrowser untuk melakukan operasi yang diinginkan, seperti execwb, dll., Anda mungkin mengalami kesalahan seperti "mencoba mengaktifkan target yang hilang yang tidak terdaftar" atau "OLE Obyek yang tidak terdaftar", atau tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan selain tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan selain tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan tetapi tidak ada kesalahan selain itu tidak dilakukan. Ketika saya menggunakannya untuk memprogram, saya menemukan bahwa EXECWB terkadang berfungsi tetapi kadang -kadang tidak berfungsi. Itu juga merupakan peluang yang tidak disengaja yang saya sadari bahwa objek OLE perlu diinisialisasi dan diakhiri (ada terlalu sedikit hal untuk dipahami).
Saya menggunakan metode yang disebutkan dalam artikel saya sebelumnya "Delphi Program Window Animation & Solutions untuk ubin pengaturan normal". Ketika saya menjalankan kesalahan yang disebutkan di atas, saya kira bahwa harus ada pernyataan seperti oleinitialize, jadi saya menemukan dan menambahkan kalimat berikut dan Akhirnya selesai! Alasannya, saya pikir itu mungkin karena Twebbrowser adalah objek OLE tertanam dan bukan VCL yang ditulis di Delphi.
Inisialisasi
Oleinitialize (nil);
Finalisasi
mencoba
Oleuninitialize;
kecuali
akhir;
Kalimat -kalimat ini ditempatkan setelah semua pernyataan di jendela utama, sebelum "Akhir."
-------------------------------------------------- ---------------------------------
2. Emptyparam
Di Delphi 5, metode navigasi twebbrowser kelebihan beban beberapa kali:
Prosedur Navigasi (Const URL: Widestring);
Prosedur menavigasi (const url: wideestring; bendera var:
Olevariant);
Prosedur menavigasi (const url: wideestring; bendera var:
Olevariant;
Prosedur menavigasi (const url: wideestring; bendera var:
Olevariant;
Olevariant);
Prosedur menavigasi (const url: wideestring; bendera var:
Olevariant;
Olevariant;
Dalam aplikasi yang sebenarnya, saat memanggil metode yang terakhir, karena kita jarang menggunakan parameter yang terakhir, tetapi deklarasi fungsi memerlukan parameter variabel, metode umum adalah sebagai berikut:
var
T: Olevariant;
Mulai
webbrowser1.navigate (edit1.text, t, t, t, t);
akhir;
Sangat merepotkan untuk mendefinisikan v variabel T (dan masih ada banyak tempat untuk menggunakannya). Faktanya, kita dapat menggunakan empa emptyparam sebagai gantinya (emptyparam adalah varian varian umum yang umum, tidak menetapkan nilai untuk itu), hanya satu kalimat:
webbrowser1.navigate (edit1.text, emptyparam, emptyparam, emptyparam, emptyparam);
Meskipun sedikit lebih lama, jauh lebih nyaman daripada mendefinisikan variabel setiap saat. Tentu saja, metode pertama juga dapat digunakan.
WebBrowser1.Navigate (Edit1.Text)
-------------------------------------------------- ---------------------------------
3. Operasi perintah umum dapat diselesaikan dengan menggunakan metode EXECWB.
Prosedur EXECWB (CMDID: OLECMDID; CMDEXECOPT:
OLECMDEXECOPT);
Prosedur EXECWB (CMDID: OLECMDID; CMDEXECOPT: OLECMDEXECOPT;
var pvain:
Olevariant);
Prosedur EXECWB (CMDID: ROLECMDID; CMDEXECOPT:
Olecmdexecopt;
Olevariant;
Buka: Kotak dialog "Open Internet Alamat" muncul, dan CommandID adalah OLECMDID_OPEN (jika versi browsernya adalah IE5.0,
Maka perintah ini tidak tersedia).
Simpan sebagai: Hubungi kotak dialog Simpan sebagai.
Execwb (olecmdid_saveas, olecmdexecopt_dodefault,
Emptyparam,
Emptyparam);
Cetak, Print Pratinjau dan Pengaturan Halaman: Hubungi kotak dialog "cetak", "print pratinjau" dan "pengaturan halaman" (IE5.5 dan di atasnya hanya mendukung versi "type"
pratinjau cetak, jadi implementasi harus memeriksa apakah perintah ini tersedia).
Execwb (olecmdid_print, olecmdexecopt_dodefault,
Emptyparam,
Emptyparam);
Jika querystatuswb (olecmdid_printpreview) = 3 maka
Execwb (olecmdid_printpreview, olecmdexecopt_dodefault,
Emptyparam, emptyparam);
Execwb (olecmdid_pagesetup, olecmdexecopt_dodefault,
Emptyparam,
Emptyparam);
Potong, salin, tempel, pilih semua: Tidak perlu mengatakan banyak tentang fungsi, penting untuk dicatat bahwa memotong dan menempel tidak hanya menyediakan teks untuk mengedit bingkai, tetapi juga tidak mengedit pada halaman web.
Teks dari kotak pengeditan juga efektif. Dapatkan status Aktifkan Perintahnya
Ada dua cara untuk menjalankan perintah (mengambil salinan sebagai contoh, memotong, menempel dan memilih semua akan menggantikan kata kunci masing -masing.
Ubah saja, yaitu potong, tempel dan selectall, masing -masing):
A. Gunakan metode querystatuswb dari twebbrowser.
if (querystatuswb (olecmdid_copy) = olecmdf_enabled) atau
Olecmdf_supported) Lalu
Execwb (olecmdid_copy, olecmdexecopt_dodefault,
Emptyparam,
Emptyparam);
B. Gunakan Metode QueryCommandenabled dari IHTMLDOCUMENT2.
var
DOC: ihtmldocument2;
Mulai
Doc: = webbrowser1.document sebagai ihtmldocument2;
Jika doc.queryCommandEnabled ('copy') lalu
Doc.execCommand ('copy', false, emptyparam);
akhir;
Pencarian: Lihat fungsi "Find" kesembilan.
-------------------------------------------------- ---------------------------------
4. Ukuran font
Mirip dengan lima item dari "maksimum" hingga "minimum" pada menu "font" (sesuai dengan bilangan bulat 0 ~ 4, terbesar, dll., Dengan asumsi bahwa nama lima item menu adalah sebagai berikut, tag
Properti diatur ke 0 ~ 4 masing -masing).
A. Baca ukuran font halaman saat ini.
var
T: Olevariant;
Mulai
WebBrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
Emptyparam, t);
kasus t dari
4: terbesar.
3: lebih besar.
2: Middle.Checked: = true;
1: Small.Checked: = true;
0: terkecil.
akhir;
akhir;
B. Atur ukuran font halaman.
Terbesar.
Lebih besar.
Middle.Checked: = false;
Small.Checked: = false;
Terkecil.
TMenuitem (pengirim) .Peram: = true;
t: = tMenuitem (pengirim) .tag;
WebBrowser1.execwb (olecmdid_zoom,
Olecmdexecopt_dontpromptuser,
t, t);
-------------------------------------------------- ---------------------------------
5. Tambahkan ke favorit dan atur favorit
const
Clsid_shelluihelper: tguid =
'{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}';
var
P: Prosedur (Pegangan: Thandle; Path: PCHAR);
Prosedur TFORM1.ORGANIZEFORITE (Pengirim: TOBJEKS);
var
H: hwnd;
Mulai
H: = loadLibrary (pchar ('shdocvw.dll'));
Jika h <> 0 lalu
Mulai
p: = getProcaddress (h, pchar ('doorganizefavdlg'));
Jika ditugaskan (p) maka p (application.handle,
Pchar (favfolder));
akhir;
Freelibrary (h);
akhir;
Prosedur tForm1.addfavorite (pengirim: TOBJEK);
var
Shelluihelper: Ishelluihelper;
URL, Judul: Olevariant;
Mulai
Judul: = WebBrowser1.LocationName;
Url: = webbrowser1.locationUrl;
Jika url <> '' lalu
Mulai
Shelluihelper: = createComObject (clsid_shelluihelper) as
Ishelluihelper;
Shelluihelper.addfavorite (url, judul);
akhir;
akhir;
Metode menggunakan metode di atas untuk membuka kotak dialog "Tambahkan ke Favorit" melalui antarmuka Ishelluihelper relatif sederhana, tetapi ada kelemahan, yaitu, jendela yang dibuka bukan jendela mode, tetapi tidak tergantung pada aplikasi. Dapat dibayangkan bahwa jika Anda menggunakan metode yang sama dengan prosedur organisasi organisasi untuk membuka dialog, Anda secara alami dapat mengimplementasikan jendela mode karena Anda dapat menentukan pegangan jendela induk (efeknya sama dengan membuka "Tambahkan ke Favorit" dialog di Explorer dan IE). Masalahnya jelas ini. Tidak masalah jika itu jendela pola?
Proses berikut akan memberi tahu Anda prototipe fungsi doaddtofavdlg. Perlu dicatat bahwa kotak dialog yang dibuka dengan cara ini tidak melakukan operasi "Tambahkan ke Favorit". ingin menempatkan jalan pintas internet.
Prosedur tform1.addfavorite (yaitu: Temeddedwb);
prosedur createUrl (aurlpath, aurl: pchar);
var
Urlfile: tinifile;
Mulai
Urlfile: = tinifile.create (string (aurlpath));
rlfile.writeString ('InternetShortcut', 'url',
String (aurl));
rlfile.free;
akhir;
var
AddFav: fungsi (pegangan: thandle;
Urlpath: pchar;
Judul: PCHAR;
Favidlist: pitemidlist): bool;
FDOC: ihtmldocument2;
Urlpath, url, judul: array [0..max_path] dari char;
H: hwnd;
PIDL: Pitemidlist;
Fretok: bool;
Mulai
Fdoc: = ihtmldocument2 (ie.document);
jika fdoc = nil maka keluar;
Strpcopy (judul, fdoc.get_title);
Strpcopy (url, fdoc.get_url);
Jika url <> '' lalu
Mulai
H: = loadLibrary (pchar ('shdocvw.dll'));
Jika h <> 0 lalu
Mulai
Shgetspecialfolderlocation (0, csidl_favorites, pidl);
AddFav: = getProcaddress (h, pchar ('doaddtofavdlg'));
jika ditetapkan (addFav) lalu
Fretok: = addFav (pegangan, urlpath, sizeof (urlpath),
Judul, sizeof (judul), PIDL)
akhir;
Freelibrary (h);
Jika fretok itu
CreateUrl (urlpath, url);
akhir
akhir;
-------------------------------------------------- ---------------------------------
6. Jadikan WebBrowser Focus
Twebbrowser sangat istimewa.
Explorer sendiri memiliki kunci pintasan, solusinya adalah sebagai berikut:
Prosedur TFORM1.SETFOCUSTODOC;
Mulai
Jika webbrowser1.document <> nil lalu
dengan WebBrowser1.Application seperti IOLEObject
Doverb (oleiverb_uiactivate, nil, webbrowser1, 0, handle,
GetClientRect);
akhir;
Selain itu, saya juga menemukan cara yang lebih mudah, yang tercantum di sini:
Jika webbrowser1.document <> nil lalu
IhtmlWindow2 (ihtmldocument2 (webbrowser1.document) .parentwindow) .focus
Baru saja menemukan cara yang lebih mudah, mungkin yang termudah:
Jika webbrowser1.document <> nil lalu
Ihtmlwindow4 (webbrowser1.document) .focus
Juga, Anda perlu menentukan apakah dokumen tersebut telah mendapatkan fokus:
jika ihtmlwindow4 (webbrowser1.document) .hasfocus maka
-------------------------------------------------- ---------------------------------
7. Klik tombol "Kirim"
Sama seperti ada tombol "default" pada setiap formulir dalam program, setiap formulir di halaman web juga memiliki tombol "default" - yaitu, tombol dengan atribut "kirim". setara dengan mengklik "Kirim" di mouse. Namun, Twebbrowser tampaknya tidak menanggapi tombol Enter, dan bahkan jika pandangan kunci dari formulir yang berisi twebbrowser diatur ke True, kunci yang dikirim oleh pengguna ke twebbrowser tidak dapat dicegat dalam acara Keypress dari formulir.
Solusi saya adalah menggunakan komponen ApplicatInevents atau menulis acara OnMessage dari objek tapplikasi sendiri, menilai jenis pesan dan menanggapi pesan keyboard. Sedangkan untuk mengklik tombol "Kirim", Anda dapat melakukannya dengan menganalisis kode sumber web, tetapi saya telah menemukan metode yang lebih sederhana dan lebih cepat. orang lain menulis.
A. Gunakan fungsi sendkeys untuk mengirim tombol masukkan ke webbrowser
Di Delphi
5 Ada file sndkey32.pas di direktori info/ekstra/sendkeys pada CD, yang berisi dua fungsi sendkeys dan appactivate. Ini sangat sederhana.
Sendkeys ('~', true); // tekan tombol return
Deskripsi parameter terperinci dari fungsi sendkeys, dll., Termasuk dalam file sndkey32.pas.
B. Lulus pesan keyboard yang diterima ke WebBrowser di acara OnMessage.
Prosedur TFORM1.ApplicationEventS1Message (var MSG: TMSG;
var ditangani: boolean);
{Memperbaiki kerusakan beberapa tombol dalam webbrowser
kontrol}
const
Stdkeys = [vk_tab, vk_return];
Extkeys = [vk_delete, vk_back, vk_left, vk_right];
kunci diperpanjang}
fextended = $ 01000000;
Mulai
Ditangani: = false;
dengan msg do
if ((pesan> = wm_keyfirst) dan (pesan <= wm_keylast))
Dan
((wparam di stdkeys) atau
{$ Ifdef ver120} (getKeyState (vk_control) <0) atau {$ endif}
(wparam di extkeys) dan
((lparam dan fextended) = fextended)) kemudian
mencoba
jika ischild (pegangan, hwnd) maka {menangani semua browser
Pesan terkait}
Mulai
dengan {$ ifdef
Ver120} aplikasi _ {$ else} aplikasi {$ endif} as
IoleinPlaceactiveObject melakukannya
Ditangani: = translateaccelerator (msg) = s_ok;
Jika tidak ditangani maka
Mulai
Ditangani: = true;
TranslateMessage (msg);
DispatchMessage (MSG);
akhir;
akhir;
kecuali
akhir;
berakhir; // MessageHandler
(Metode ini berasal dari embeddedwb.pas)
-------------------------------------------------- ---------------------------------
8. Dapatkan kode sumber halaman web dan html langsung dari twebbrowser
Pertama -tama mari kita perkenalkan metode yang sangat sederhana untuk mendapatkan kode sumber halaman web yang diakses Twebbrowser. Metode umum adalah menggunakan antarmuka ImpersistStreamInit yang disediakan oleh objek dokumen dalam kontrol twebbrowser untuk mengimplementasikannya. Ukuran kode sumber HTML, alokasikan blok memori heap global, buat aliran, dan kemudian tulis teks HTML ke dalam aliran. Meskipun program ini tidak rumit, ada metode yang lebih sederhana, sehingga kode implementasi tidak lagi diberikan. Faktanya, pada dasarnya semua fungsi IE twebbrowser harus memiliki cara yang relatif sederhana untuk mengimplementasikannya, dan hal yang sama berlaku untuk mendapatkan kode sumber halaman web. Kode berikut menampilkan kode sumber halaman web di Memo1.
Memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outerHtml);
Pada saat yang sama, sangat mudah untuk menyimpan file HTML sebagai file teks saat menjelajahi twebbrowser, dan tidak diperlukan alat penguraian sintaksis, karena twebbrowser juga selesai, sebagai berikut:
Memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outerText);
-------------------------------------------------- ---------------------------------
9. Fungsi "Temukan"
Kotak dialog pencarian dapat dipanggil dengan menekan Ctrl-F kunci ketika dokumen mendapatkan fokus. Program untuk membuatnya.
var
DOC: ihtmldocument2;
Txtrange: ihtmltxtrange;
Mulai
Doc: = webbrowser1.document sebagai ihtmldocument2;
Doc.Selectall; // Ini adalah singkatan.
// Kalimat ini sangat penting, karena premis bahwa metode objek ihtmltxtrange dapat dioperasikan
// Dokumen sudah memiliki area pemilihan teks. Karena pernyataan berikut dieksekusi, itu tidak akan
// Lihat proses memilih semua dokumen.
Txtrange: = doc.selection.createrange sebagai ihtmltxtrange;
TxTrange.findText ('Teks yang akan dicari', 0.0);
Txtrange.select;
akhir;
Juga, Anda bisa mendapatkan konten teks yang saat ini dipilih dari txt.get_text, yang berguna di beberapa titik.
-------------------------------------------------- ---------------------------------
10. Ekstrak semua tautan di halaman web
Metode ini berasal dari seorang teman dari forum Monopoli Forum Hopfield yang menjawab pertanyaan.
var
DOC: ihtmldocument2;
semua: ihtmlelementCollection;
Len, I: Integer;
Item: Olevariant;
Mulai
doc: = webbrowser1 .document sebagai ihtmldocument2;
All: = doc.get_links; //doc.links juga oke
len: = all.length;
untuk i: = 0 ke len-1 mulai
Item: = all.item (i, varempty); // Empryparam juga oke
memo1.lines.add (item.href);
akhir;
akhir;
-------------------------------------------------- ---------------------------------
11. Atur penyandian twebbrowser
Mengapa saya selalu kehilangan banyak peluang? Bahkan, saya seharusnya sudah memikirkannya untuk waktu yang lama, tetapi perbedaan dalam pemikiran akan menjadikannya dunia yang berbeda. Jika saya lebih memikirkannya dan mencobanya lebih banyak, itu tidak akan berada di peringkat ke -11. Berikut adalah fungsi, yang sangat sederhana untuk dipecahkan.
Prosedur SetCharset (AwebBrowser: Twebbrowser; Acharset:
Rangkaian);
var
RefreshLevel: Olevariant;
Mulai
Ihtmldocument2 (AwebBrowser.Document) .set_charset (Acharset);
RefreshLevel: = 7; // 7 ini harus datang dari registri untuk membantu dengan bug.
Awebbrowser.refresh2 (RefreshLevel);
Akhir;