بدأ Delphi3 في الحصول على مكون Twebbrowser ، ولكن ظهر في شكل عناصر تحكم ActiveX في ذلك الوقت ويجب تقديمه في حد ذاته في 4.0 و 5.0 اللاحقة ، ظهرت كأحد مجموعات مكونات الإنترنت بعد تبديل shdocvw.dll. لوحة المكون قيد التشغيل. غالبًا ما أسمع الناس لقيامهم بضعف للغاية. سيكون أكثر من ذلك.
فيما يلي بعض التجارب حول استخدام Twebbrowser لصنع البرامج وبعض الأمثلة والمعلومات التي تم جمعها من الإنترنت.
1. التهيئة والانتهاء
عندما تقوم بتنفيذ طريقة لـ Twebbrowser لأداء العملية المطلوبة ، مثل Execwb ، وما إلى ذلك ، فقد تكون قد واجهت أخطاء مثل "محاولة تنشيط الهدف المفقود غير المسجل" أو "Ole Object غير مسجل" ، أو لا يوجد خطأ سوى لم يتم ذلك. عندما استخدمته للبرنامج ، وجدت أن execwb يعمل في بعض الأحيان ولكن في بعض الأحيان لا يعمل. لقد كانت أيضًا فرصة عرضية أدركت أن الأشياء OLE تحتاج إلى تهيئة وإنهاء (هناك أشياء قليلة جدًا يجب فهمها).
لقد استخدمت الطريقة المذكورة في مقالتي السابقة "Delphi Window Window Animation & Solutions for Normal Translement Tile". أخيرا انجزتها! والسبب ، أعتقد أنه ربما يرجع ذلك إلى أن Twebbrowser هو كائن OLE مضمن وليس VCL مكتوبًا في Delphi.
التهيئة
Oleinitialize (NIL) ؛
الانتهاء
يحاول
Oleuninitialize ؛
يستثني
نهاية؛
يتم وضع هذه الجمل بعد جميع العبارات في النافذة الرئيسية ، قبل "النهاية".
------------------------------------------------- -----------------------------
2. فارغة
في Delphi 5 ، يتم زيادة تحميل طريقة التنقل في Twebbrowser عدة مرات:
الإجراء التنقل (url const: widestring) ؛
الإجراء التنقل (CONST url: widestring ؛ var flags:
Olevariant) ؛
الإجراء التنقل (CONST url: widestring ؛ var flags:
Olevariant ؛
الإجراء التنقل (CONST url: widestring ؛ var flags:
Olevariant ؛
Olevariant) ؛
الإجراء التنقل (CONST url: widestring ؛ var flags:
Olevariant ؛
Olevariant ؛
في التطبيقات الفعلية ، عند استدعاء الطريقة الأخيرة ، نظرًا لأننا نادراً ما نستخدم المعلمات الأخيرة ، لكن إعلان الوظيفة يتطلب معلمات متغيرة ، فإن الطريقة العامة هي كما يلي:
var
T: Olevariant ؛
يبدأ
webbrowser1.navity (edit1.text ، t ، t ، t ، t) ؛
نهاية؛
من المزعج للغاية تحديد المتغير T (ولا يزال هناك العديد من الأماكن لاستخدامه). في الواقع ، يمكننا استخدام فارغارام بدلاً من ذلك (فارغارام هو متغير فارغ شائع ، لا تخصص قيمة له) ، جملة واحدة فقط:
webbrowser1.navity (edit1.text ، فارغة ، فارغة ، فارغة ، فارغة paryparam) ؛
على الرغم من أنها أطول قليلاً ، إلا أنها أكثر ملاءمة من تحديد المتغيرات في كل مرة. بالطبع ، يمكن أيضًا استخدام الطريقة الأولى.
webbrowser1.navity (edit1.text)
------------------------------------------------- -----------------------------
3. يمكن إكمال عمليات الأوامر المشتركة باستخدام طريقة execwb.
الإجراء execwb (cmdid: olecmdid ؛ cmdexecopt:
OLECMDEXECOPT) ؛
الإجراء execwb (cmdid: olecmdid ؛ cmdexecopt: olecmdexecopt ؛
var pvain:
Olevariant) ؛
الإجراء execwb (cmdid: rolecmdid ؛ cmdexecopt:
OLECMDEXECOPT ؛
Olevariant ؛
فتح: يبرز مربع الحوار "Open Internet Address" ، و CommandID هو OLECMDID_OPEN (إذا كان إصدار المتصفح هو IE5.0 ،
ثم هذا الأمر غير متوفر).
احفظ AS: اتصل بـ Save As Dialog.
execwb (OLECMDID_SAVEAS ، OLECMDEXECOPT_DODEFAULT ،
فارغة ،
فارغة ParkParam) ؛
طباعة ، معاينة الطباعة وإعدادات الصفحة: اتصل بـ "طباعة" و "معاينة الطباعة" و "إعدادات الصفحة"
معاينة الطباعة ، لذلك يجب على التنفيذ التحقق مما إذا كان هذا الأمر متاحًا).
execwb (OLECMDID_PRINT ، OLECMDEXECOPT_DODEFAULT ،
فارغة ،
فارغة ParkParam) ؛
إذا كان QueryStatusWB (OLECMDID_PRINTPREVIEW) = 3 ثم
execwb (OLECMDID_PRINTPREVIEW ، OLECMDEXECOPT_DODEFAULT ،
فارغة ، فارغة parkparam) ؛
execwb (OLECMDID_PAGESETUP ، OLECMDEXECOPT_DODEFAULT ،
فارغة ،
فارغة ParkParam) ؛
قطع ، نسخ ، لصق ، حدد الكل: ليست هناك حاجة إلى القول الكثير عن الوظيفة ، من المهم أن نلاحظ أن القطع واللصق لا يوفران نصًا لتحرير إطارات التحرير فحسب ، بل أيضًا عدم تحرير على صفحات الويب.
نص مربع التحرير فعال أيضًا. الحصول على حالة تمكين الأمر
هناك طريقتان لتنفيذ الأوامر (أخذ النسخ كمثال ، سيحل القطع واللصق واختيار كل الكلمات الرئيسية المعنية.
فقط قم بتغييره ، وهي قطع ولصق و Selectall ، على التوالي):
A. استخدم طريقة QueryStatusWB من Twebbrowser.
if (QueryStatusWB (OLECMDID_COPY) = OLECMDF_ENABLED) أو
OLECMDF_SUPORTED) ثم
execwb (OLECMDID_COPY ، OLECMDEXECOPT_DODEFAULT ،
فارغة ،
فارغة ParkParam) ؛
B. استخدم طريقة QueryCommandEnabled لـ IHTMLDOCUMINE2.
var
DOC: ihtmldocument2 ؛
يبدأ
doc: = webbrowser1.document as ihtmldocument2 ؛
إذا كان doc.queryCommandEnabled ('نسخ') ثم
Doc.ExecCommand ('Copy' ، false ، reganparam) ؛
نهاية؛
البحث: ارجع إلى وظيفة "البحث" التاسعة.
------------------------------------------------- -----------------------------
4. حجم الخط
على غرار العناصر الخمسة من "الحد الأقصى" إلى "الحد الأدنى" في القائمة "الخط" (المقابلة للمناسبات الباسخة 0 ~ 4 ، الأكبر ، وما إلى ذلك ، على افتراض أن أسماء عناصر القائمة الخمسة هي كما يلي ، العلامة
يتم تعيين الخصائص على 0 ~ 4 على التوالي).
أ. اقرأ حجم الخط للصفحة الحالية.
var
T: Olevariant ؛
يبدأ
webbrowser1.execwb (olecmdid_zoom ،
OLECMDEXECOPT_DONTPROMPTUSER ،
فارغة ، ر) ؛
حالة ر
4: الأكبر. التحقق: = صحيح ؛
3: أكبر. التحقق: = صحيح ؛
2: middle.cked: = true ؛
1: small.cked: = true ؛
0: أصغر. التحقق: = صحيح ؛
نهاية؛
نهاية؛
اضبط حجم خط الصفحة.
الأكبر. التحقق: = خطأ ؛
أكبر.
middle.cked: = false ؛
صغير. التحقق: = خطأ ؛
أصغر. التحقق: = خطأ ؛
tmenuitem (المرسل). فحص: = صحيح ؛
t: = tmenuitem (المرسل) .tag ؛
webbrowser1.execwb (olecmdid_zoom ،
OLECMDEXECOPT_DONTPROMPTUSER ،
ر ، ر) ؛
------------------------------------------------- -----------------------------
5. أضف إلى المفضلات وتنظيم المفضلات
كونست
CLSID_SHELLUIHELPER: tguid =
'{64ab4bb7-111e-11d1-8f79-00c04fc2fbe1}' ؛
var
P: الإجراء (المقبض: Thandle ؛ Path: Pchar) ؛
الإجراء tform1.organizeFavorite (المرسل: tobject) ؛
var
H: hwnd ؛
يبدأ
H: = loadlibrary (pchar ('shdocvw.dll')) ؛
إذا كان h <> 0 ثم
يبدأ
P: = getProcaddress (H ، PCHAR ('DoorganizeFavdlg')) ؛
إذا تم تعيينه (P) ثم P (Application.handle ،
PCHAR (favfolder)) ؛
نهاية؛
Freelibrary (H) ؛
نهاية؛
الإجراء tform1.addfavorite (المرسل: tobject) ؛
var
Shelluihelper: Ishelluihelper ؛
عنوان URL ، العنوان: Olevariant ؛
يبدأ
العنوان: = webbrowser1.locationName ؛
url: = webbrowser1.locationurl ؛
إذا url <> '' ثم
يبدأ
Shelluihelper: = CreateComObject (CLSID_SHELLUIHELPER) AS
Ishelluihelper.
Shelluihelper.addfavorite (url ، title) ؛
نهاية؛
نهاية؛
إن طريقة استخدام الطريقة أعلاه لفتح مربع الحوار "إضافة إلى المفضلات" من خلال واجهة Ishelluihelper بسيطة نسبيًا ، ولكن هناك عيب ، أي أن النافذة المفتوحة ليست نافذة وضع ، ولكنها مستقلة عن التطبيق. من المعقول أنه إذا كنت تستخدم نفس طريقة إجراء OrganizeFaorite لفتح مربع الحوار ، فيمكنك تنفيذ نافذة الوضع بشكل طبيعي لأنه يمكنك تحديد مقبض النافذة الأصل (التأثير هو نفس فتح "إضافة إلى المفضل" مربع الحوار في المستكشف و IE). من الواضح أن المشكلة هي أن مؤلف العمليتين أعلاه يعرفان فقط النموذج الأولي لـ DoorganizeFavDLG لا يهم إذا كانت نافذة نمط؟
ستخبرك العملية التالية عن النموذج الأولي للوظيفة لـ doaddtofavdlg. تجدر الإشارة إلى أن مربع الحوار الذي تم فتحه بهذه الطريقة لا يقوم بعملية "إضافة إلى". يريد وضع اختصار الإنترنت.
الإجراء tform1.addfavorite (أي: tembeddedwb) ؛
الإجراء createUrl (aurlpath ، aurl: pchar) ؛
var
urlfile: tinifile ؛
يبدأ
urlfile: = tinifile.create (سلسلة (aurlpath)) ؛
rlfile.writeString ('InternetShortcut' ، 'url' ،
سلسلة (Aurl)) ؛
rlfile.free ؛
نهاية؛
var
addfav: وظيفة (مقبض: thandle ؛
URLPATH: PCHAR ؛
العنوان: PCHAR ؛
FavidList: PiteMidlist): Bool ؛
FDOC: ihtmldocument2 ؛
urlpath ، url ، العنوان: صفيف [0..max_path] من char ؛
H: hwnd ؛
PIDL: PiteMidList ؛
فريتوك: بول ؛
يبدأ
FDOC: = ihtmldocument2 (ie.document) ؛
إذا fdoc = لا شيء ثم الخروج ؛
strpcopy (العنوان ، fdoc.get_title) ؛
strpcopy (url ، fdoc.get_url) ؛
إذا url <> '' ثم
يبدأ
H: = loadlibrary (pchar ('shdocvw.dll')) ؛
إذا كان h <> 0 ثم
يبدأ
shgetspecialderlocation (0 ، csidl_favorites ، pidl) ؛
addfav: = getProcaddress (H ، pchar ('doaddtofavdlg')) ؛
إذا تم تعيينه (addfav) ثم
Fretok: = Addfav (مقبض ، urlpath ، sizeof (urlpath) ،
العنوان ، حجم (العنوان) ، PIDL)
نهاية؛
Freelibrary (H) ؛
إذا فريتوك ثم
CreateUrl (urlpath ، url) ؛
نهاية
نهاية؛
------------------------------------------------- -----------------------------
6. اجعل WebBrowser Focus
Twebbrowser مميز للغاية.
المستكشف نفسه لديه مفاتيح اختصار ، والحل هو كما يلي:
الإجراء tform1.setfocustodoc ؛
يبدأ
إذا كان webbrowser1.document <> nil ثم
مع WebBrowser1.Application كما تفعل IoleObject
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 ، وحتى إذا تم تعيين Keypreview للنموذج الذي يحتوي على Twebbrowser على صحيح ، فإن المفاتيح التي أرسلها المستخدم إلى Twebbrowser لا يمكن اعتراضها في حدث Keypress للنموذج.
الحل الخاص بي هو استخدام مكون ApplicatineVents أو كتابة حدث onMessage لكائن TappLication بنفسك ، والحكم على نوع الرسالة والرد على رسالة لوحة المفاتيح. بالنسبة للنقر على زر "إرسال" ، يمكنك القيام بذلك عن طريق تحليل رمز مصدر الويب ، لكنني وجدت طريقة أبسط وأسرع. كتب شخص آخر.
أ. استخدم وظيفة SendKeys لإرسال مفتاح Enter إلى WebBrowser
في دلفي
5 يوجد ملف SNDKEY32. في دليل المعلومات/الإضافات على القرص المضغوط ، والذي يحتوي على وظيفتين sendkeys و appactivate. الأمر بسيط للغاية.
SendKeys ('~' ، صحيح) ؛ // اضغط على مفتاح العودة
يتم تضمين وصف المعلمة التفصيلية لوظيفة SendKeys ، وما إلى ذلك ، في ملف SNDKEY32.PAS.
ب. تمرير رسالة لوحة المفاتيح المستلمة إلى WebBrowser في حدث OnMessage.
الإجراء tform1.ApplicationEvents1Message (var msg: tmsg ؛
var معالجة: منطقية) ؛
{إصلاح خلل بعض المفاتيح داخل WebBrowser
يتحكم}
كونست
stdkeys = [VK_TAB ، VK_RETURN] ؛
extkeys = [vk_delete ، vk_back ، vk_left ، vk_right] ؛
مفاتيح ممتدة}
fextended = $ 01000000 ؛
يبدأ
معالجة: = خطأ ؛
مع MSG تفعل
if ((message> = wm_keyfirst) و (message <= wm_keylast)))
و
((wparam في stdkeys) أو
{$ ifdef ver120} (getKeyState (vk_control) <0) أو {$ endif}
(Wparam in Extkeys) و
((lparam و fextended) = fextended) ثم
يحاول
إذا كان ISCHILD (مقبض ، HWND) ثم {يتولى جميع المتصفح
الرسائل ذات الصلة}
يبدأ
مع {$ IFDEF
Application ver120} Application _ {$ else} {$ endif} as
ioleinplaceactiveoBject تفعل
معالجة: = translateaccelerator (msg) = s_ok ؛
إذا لم يتم التعامل معها بعد ذلك
يبدأ
معالجة: = صحيح ؛
TranslateMessage (MSG) ؛
DispatchMessage (MSG) ؛
نهاية؛
نهاية؛
يستثني
نهاية؛
نهاية
(هذه الطريقة تأتي من inmbeddedwb.pas)
------------------------------------------------- -----------------------------
8. احصل على رمز مصدر صفحة الويب و HTML مباشرة من Twebbrowser
دعنا نقدم أولاً طريقة بسيطة للغاية للحصول على الكود المصدري لصفحة الويب التي يصل إليها Twebbrowser. تتمثل الطريقة العامة في استخدام واجهة epersistreaminit التي يوفرها كائن المستند في عنصر التحكم في Twebbrowser لتنفيذها على وجه التحديد. HTML size size code ، قم بتخصيص كتلة ذاكرة الكومة العالمية ، وإنشاء دفق ، ثم اكتب نص HTML في الدفق. على الرغم من أن البرنامج غير معقد ، إلا أن هناك طرقًا أبسط ، وبالتالي لم يعد رمز التنفيذ مُعطى. في الواقع ، يجب أن يكون لدى جميع وظائف IE في الأساس طريقة بسيطة نسبيًا لتنفيذها ، وينطبق الشيء نفسه على الحصول على رمز مصدر صفحة الويب. يعرض الرمز التالي رمز مصدر صفحة الويب في MEMO1.
memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outerhtml) ؛
في الوقت نفسه ، من السهل جدًا حفظ ملفات HTML كملفات نصية عند تصفح Twebbrowser ، ولا توجد حاجة إلى أدوات تحليل بناء الجملة ، لأن Twebbrowser قد اكتمل أيضًا ، على النحو التالي:
memo1.lines.add (ihtmldocument2 (webbrowser1.document) .body.outertext) ؛
------------------------------------------------- -----------------------------
9. "البحث" وظيفة
يمكن استدعاء مربع حوار البحث عن طريق الضغط على مفتاح CTRL-F عندما يتم تركيز المستند في البرنامج. البرنامج لجعله.
var
DOC: ihtmldocument2 ؛
txtrange: ihtmltxtrange ؛
يبدأ
doc: = webbrowser1.document as ihtmldocument2 ؛
DOC.SELECTALL ؛
// هذه الجملة مهمة بشكل خاص ، لأن الفرضية القائلة بأن طريقة كائن IHTMLTXTRANGE
// الوثيقة لديها بالفعل منطقة اختيار النص. منذ تنفيذ البيان التالي ، لن يفعل ذلك
// راجع عملية اختيار جميع المستندات.
txtrange: = doc.selection.createGange كما ihtmltxtrange ؛
txtrange.findtext ('text to to be to to to the be to the be to exhense' ، 0.0) ؛
txtrange.select ؛
نهاية؛
أيضًا ، يمكنك الحصول على المحتوى النص المحدد حاليًا من Txt.get_text ، وهو مفيد في مرحلة ما.
------------------------------------------------- -----------------------------
10. استخراج جميع الروابط في صفحة الويب
تأتي هذه الطريقة من صديق لمنتدى Hopfield الذي يجيب على سؤال.
var
DOC: ihtmldocument2 ؛
الكل: ihtmlelementCollection ؛
لين ، أنا: عدد صحيح ؛
البند: Olevariant ؛
يبدأ
doc: = webbrowser1 .document as ihtmldocument2 ؛
الكل: = doc.get_links ؛
لين: = all.length ؛
لأني: = 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 ؛
Awebbrowser.refresh2 (RefreshLevel) ؛
نهاية؛