PDA

View Full Version : مشکل در جستجوی متن در WebBrowser به سمت بالا



saeidd
دوشنبه 13 دی 1395, 20:07 عصر
سلام.

من برای جستجوی متن در WebBrowser از تابع زیر استفاده میکنم:


function WBFindText (Browser: TWebBrowser; const Direction: Boolean; const FText: String;
const SearchScope, Flags: Integer) : Boolean;
var
Doc: IHTMLDocument2;
SelObj: IHTMLSelectionObject;
SelRange: IHtmlTxtRange;
begin
Doc := Browser.Document as IHTMLDocument2;
SelObj := Doc.Selection;
SelRange := SelObj.CreateRange as IHTMLTxtRange;
SelRange.Collapse(Direction);
if SelRange.FindText (FText, SearchScope, Flags) then
begin
SelRange.Select;
SelRange.ScrollIntoView (True);
Result := True;
end
else
Result := False;
end;


طبق چیزی که در راهنمای WebBrowser اومده، فراخوانی این تابع برای جستجو به سمت پایین و بالا باید به شکل زیر باشه:

جستجو به سمت پایین:

WBFindText(MyBrowser, False, TextSearch, 1, 0)

جستجو به سمت بالا:

WBFindText(MyBrowser, True, TextSearch, -1, 1)

که در هر دو TextSearch همون متنیه که میخوایم جستجوش کنیم.

حالا مساله اینه که جستجو به سمت پایین کاملا درست کار می کنه ولی جستجو به سمت بالا یا چیزی پیدا نمی کنه و یا اشتباهی پیدا و سلکت می کنه.

لطفا اساتید کمک کنن، هر چی می گردم دلیلش رو پیدا نمی کنم.

1072300
سه شنبه 14 دی 1395, 10:42 صبح
سلام دوست من،
برای جستجوی کلمه بعد از این کد :
WBFindText(WebBrowser1, False ,Edit1.Text,1,0 ) ;

و برای رفتن به کمله قبل از این کد:
WBFindText(WebBrowser1 , True , Edit1.Text , 3, 1) ;

استفاده کنید. موفق باشید.

saeidd
سه شنبه 14 دی 1395, 11:10 صبح
و برای رفتن به کمله قبل از این کد:
WBFindText(WebBrowser1 , True , Edit1.Text , 3, 1) ;

جواب نمیده، جستجوی کلمه قبل درست کار نمی کنه و اشتباهی سلکت می کنه

1072300
سه شنبه 14 دی 1395, 11:21 صبح
بنده همین حالا چک کردم درست کار می کنه مشکل از این کد نیست. پیشنهاد می کنم یک پروژه جدید درست کنید و کدی که فرستادم را چک کنید.
اگر نشد بفرمایید تا پروژه را براتون بفرستم.

saeidd
سه شنبه 14 دی 1395, 15:07 عصر
بنده همین حالا چک کردم درست کار می کنه مشکل از این کد نیست. پیشنهاد می کنم یک پروژه جدید درست کنید و کدی که فرستادم را چک کنید.
اگر نشد بفرمایید تا پروژه را براتون بفرستم.
علت رو پیدا کردم. در فایل html من که توسط WebBrowser باز میشه تگ meta رو اینجوری نوشتم:

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

مقدار X-UA-Compatible باعث میشه که جستجو برای کلمه قبل درست کار نکنه در حالی که برای کلمه بعد درست کار می کنه. و وقتی مقدارش رو به content-type عوضش می کنم درست میشه.

نمیشه یه کاری کرد که با وجود مقدار X-UA-Compatible در تگ meta، جستجو درست کار کنه؟ آخه توابعی دارم که باید در IE 8 جواب بده ، برا همین مقدار http-equiv رو X-UA-Compatible گذاشتم.

1072300
سه شنبه 14 دی 1395, 15:09 عصر
به نظر شما اگر بخواهیم در صفحه html همه کلماتی را که در تکست ادیت به مورد جستجو قرار گرفته را سلکت کند از چه کدی باید استفاده کنیم؟ (منظورم گزینه Highlight All مرورگر است مثلا موزیلا). سپاس

saeidd
سه شنبه 14 دی 1395, 15:14 عصر
به نظر شما اگر بخواهیم در صفحه html همه کلماتی را که در تکست ادیت به مورد جستجو قرار گرفته را سلکت کند از چه کدی باید استفاده کنیم؟ (منظورم گزینه Highlight All مرورگر است مثلا موزیلا). سپاس

باید این کد رو بزاری تو یه حلقه While؛ یه چیزی مثل این:

procedure TForm1.SearchAndHighlightText(aText: string);
var
tr: IHTMLTxtRange; //TextRange Object
begin
if not WebBrowser1.Busy then
begin
tr := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;
//Get a body with IHTMLDocument2 Interface and then a TextRang obj. with IHTMLBodyElement Intf.

while tr.findText(aText, 1, 0) do //while we have result
begin
tr.pasteHTML('<span style="background-color: Lime; font-weight: bolder;">' +
tr.htmlText + '</span>');
//Set the highlight, now background color will be Lime
tr.scrollIntoView(True);
//When IE find a match, we ask to scroll the window... you dont need this...
end;
end;
end;

1072300
سه شنبه 14 دی 1395, 15:20 عصر
نمیشه یه کاری کرد که با وجود مقدار X-UA-Compatible در تگ meta، جستجو درست کار کنه؟ آخه توابعی دارم که باید در IE 8 جواب بده ، برا همین مقدار http-equiv رو X-UA-Compatible گذاشتم.


صفحه را به چه صورت لود می کنید؟

saeidd
سه شنبه 14 دی 1395, 15:23 عصر
صفحه را به چه صورت لود می کنید؟
منظورتون دستور لوده؟ با دستور WebBrowser.Navigate

1072300
سه شنبه 14 دی 1395, 15:27 عصر
باید این کد رو بزاری تو یه حلقه While؛ یه چیزی مثل این:

procedure TForm1.SearchAndHighlightText(aText: string);
var
tr: IHTMLTxtRange; //TextRange Object
begin
if not WebBrowser1.Busy then
begin
tr := ((WebBrowser1.Document as IHTMLDocument2).body as IHTMLBodyElement).createTextRange;
//Get a body with IHTMLDocument2 Interface and then a TextRang obj. with IHTMLBodyElement Intf.

while tr.findText(aText, 1, 0) do //while we have result
begin
tr.pasteHTML('<span style="background-color: Lime; font-weight: bolder;">' +
tr.htmlText + '</span>');
//Set the highlight, now background color will be Lime
tr.scrollIntoView(True);
//When IE find a match, we ask to scroll the window... you dont need this...
end;
end;
end;



منظورم با استفاده از تابع اول بود نه تابع دیگری

1072300
سه شنبه 14 دی 1395, 15:30 عصر
منظورتون دستور لوده؟ با دستور WebBrowser.Navigate

صفحه از روی هارد لود می شود یا از هاست؟

saeidd
سه شنبه 14 دی 1395, 15:38 عصر
منظورم با استفاده از تابع اول بود نه تابع دیگری
اینم همون تابع اوله دیگه، فقط چون قراره همه ی نتایج جستجو رو هایلایت کنه، به جای دستور select از دستور pastehtml استفاده شده.


صفحه از روی هارد لود می شود یا از هاست؟
از روی هارد. برنامه ام یه نرم افزار دسکتاپه

1072300
سه شنبه 14 دی 1395, 15:47 عصر
چون از نحوه کار و ماهیت برنامه شما اطلاع ندارم تنها راهی که فعلا به نظرم می رسد این است که باید در زمان جستجو خط مورد نظر را حذف کرد و در پایان جستجو دوباره خط را به صفحه اضافه کرد. اما اگر این امر امکان ندارد در مورد کار برنامه توضیح بدهید تا شاید راه حل دیگری برای مشکل پیدا کنیم.

saeidd
سه شنبه 14 دی 1395, 15:58 عصر
چون از نحوه کار و ماهیت برنامه شما اطلاع ندارم تنها راهی که فعلا به نظرم می رسد این است که باید در زمان جستجو خط مورد نظر را حذف کرد و در پایان جستجو دوباره خط را به صفحه اضافه کرد. اما اگر این امر امکان ندارد در مورد کار برنامه توضیح بدهید تا شاید راه حل دیگری برای مشکل پیدا کنیم.
وقتی حذفش می کنم خیل از کلاسها و توابع به هم میریزن. پس این گزینه منتفیه.

برنامه ام یه برنامه ویندوزیه که یه سری متون رو از دیتابیس بوسیله توابع جاوا اسکریپت لود می کنه توی WebBrowser.
ظاهرا تابع IHTMLTxtRange::findText با X-UA-Compatibleسازگاری نداره و باید خودم یه تابع برای اینکار بنویسم. وقت زیادی هم می بره. اگه بشه اینو درست کرد خیلی خوب میشه.