Текущий архив: 2003.05.12;
Скачать: CL | DM;
Вниз
Как перехватить щелчок по гипертекстовой ссылке в WebBrowsere? Найти похожие ветки
← →
Winni (2003-03-07 07:37) [0]Делаю приложение на основе Делфи6-демо (папка Cool Stuf ). Но мне нужно, чтобы при щелчке по ссылке в окне WebBrowser1 читался файл на локальном диске, т е приложение делается для чтения связанных документов.
Если можно, подскажите, как заставить выполняться мой обработчик щелчка по гиперссылке ?
Спасибо.
← →
gek (2003-03-07 07:57) [1]Ну наверное и ссылку надо давать на файл лежащий на диске
<a href="C:\kuku.html">kuku</a>
Если я правильно понял
← →
Winni (2003-03-07 13:50) [2]Уважаемый gek !
Спасибо за оперативный совет.
Но я виноват, неточно описал задачу. Мне нужна всеже предварительная обработка прочтеного файла, так что я должен его прочесть явным образом и обработать, например, пристегнуть ему заголовок (который у всех файлов приложения один и тот же), а потом передать броузеру при помощи:
Document := WB.Document As IHTMLDocument2;
V :=VarArrayCreate([0,0],varVariant); V[0] := Text;
Document.Write(PSafeArray(TVarData(v).VArray));
Document.Close;
Эту идею я нашел на этом же сайте delphi.mastak.ru и она уже работает, осталось решить ту часть задачи, о которой я пишу.
Всего хорошего.
← →
Winni (2003-03-10 14:08) [3]Повторно надоедаю форуму своим вопросом, извините, пожалуйста. Дело в том, что не найду я никак в WebBrowsere ни свойства ни события, как-то связанного с этой гипертекстовой ссылкой. Возможно, она принадлежит каким-то другим объектам? Но я не знаю ее точного названия (подчеркнутая часть текста, по которой мы кликаем), думаю что Hypertext link ?
← →
nikkie (2003-03-11 02:36) [4]OnBeforeNavigate2
← →
Winni (2003-03-11 07:43) [5]Уважаемый Nikkie !
Желаю успеха в работе и счастья в личной жизни ! Спасибо за ответ. Однако, видимо, опять же я неточно ставлю вопрос.
Дело в том, что мне нужно в теле метода этого (OnBeforeNavigate2) прочесть адрес, связанный с гиперссылкой (например, http://www.delphi.mastak.ru). В моем случае это будет путь на диске, например: <A href="kuku43.htm">
← →
nikkie (2003-03-11 18:09) [6]Спасибо за пожелания.
Адрес передается в обработчик события как параметр URL. Вы можете проанализировать его, отменить навигацию (параметр Cancel) и вместо этого загрузить нужный Вам HTML.
Кстати, работать в стиле C++ через IHTMLDocument2 мне кажется муторно. Delphi поддерживает возможность сделать то же самое через IDispatch в стиле VB. Для этого надо преобразовать интерфейс в Variant. Есть правда минус - информация о методах не доступна в Delphi IDE и при использовании ошибочного синтаксиса ошибка будет возникать только в run-time, а не во время компиляции.
procedure WriteHTML(Doc: Variant; HTML: String);
begin
Doc.Write(HTML);
Doc.Close;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate("about:blank");
while WebBrowser1.Busy do Sleep(100);
WriteHTML(WebBrowser1.Document,
"<html><body><a href=" http://dephi.mastak.ru">ссылка</a></body></html>");
end;
procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
begin
if URL <> "about:blank" then begin
Cancel := True;
WriteHTML(WebBrowser1.Document,
"<html><body><a href=" http://dephi.mastak.ru">другая ссылка</a></body></html>");
end;
end;
← →
Winni (2003-03-11 18:26) [7]Спасибо за помощь, nikkie !
Теперь я могу впрягаться в работу с надеждой на успех.
← →
Winni (2003-03-15 18:54) [8]Ура, Ура ! Наконец получилось ! Спасибо всем !
На случай, если кому-то пригодится, вот текст модуля проекта ( все лишнее выброшено ):
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, ComCtrls, OleCtrls, Buttons, ToolWin, Isp3,
ActnList, ImgList, SHDocVw;
const
CM_HOMEPAGEREQUEST = WM_USER + $1000;
type
TMainForm = class(TForm)
StatusBar1: TStatusBar;
WebBrowser1: TWebBrowser;
OpenDialog1: TOpenDialog;
procedure Exit1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
private
HistoryList: TStringList;
Procedure TextToWebbrowser(Text:String; Var WB: TWebBrowser );
procedure HomePageRequest(var message: tmessage); message CM_HOMEPAGEREQUEST;
Procedure ReadFile(Var FName: String);
Procedure Convert(Var Stri: String; Dlina: Integer);
Procedure MemPokaz;
Procedure IzStroki(Const stro: String);
Procedure strijka(Const UU: String; Var Bufsi: String);
end;
var
MainForm: TMainForm;
implementation
uses activex,mshtml,variants;
{$R *.dfm}
var FNam : String; LStri,Dir1 : String;
Procedure TMainForm.IzStroki(Const stro: String);
var bufsi: String;
begin
Strijka(Stro,Bufsi);
If pos(":\",Bufsi) = 0 then Bufsi := Dir1+"\"+Bufsi;
FNam:= Trim(Bufsi); Statusbar1.Panels[1].Text := "Загружаю файл "+FNam;
If pos("rib",Fnam) < Length(FNam)-2 then
Begin Statusbar1.Panels[1].Text := "Не загружаю ничего !!!"; exit;
end;
ReadFile(FNam);
MemPokaz;
end;
Procedure TMainForm.Convert(Var Stri: String; Dlina: Integer);
Var ii: Integer;
Begin {Здесь преобразование строки, прочтенной из файла - в строку текста HTML}
end;
Procedure TMainForm.TextToWebbrowser(Text:String; Var WB: TWebBrowser );
Var Document: IHTMLDocument2;
V : OLEVariant;
Begin
If WB.Document = nil then WB.Navigate("about:blank");
While WB.Document = nil do Application.ProcessMessages;
Document := WB.Document As IHTMLDocument2;
V :=VarArrayCreate([0,0],varVariant); V[0] := Text;
Document.Write(PSafeArray(TVarData(v).VArray));
Document.Close;
End;
Procedure TMainForm.MemPokaz;
Begin
MainForm.TextToWebBrowser(LStri,MainForm.WebBrowser1);
End;
Procedure TMainForm.ReadFile(Var FName: String);
Var RStri,Dira: String; poza1:Word; fact: Cardinal;
fil: File; ch: Char;
begin Dira := Dir1+"\";
RStri := "";
If not FileExists(FName) then
begin
StatusBar1.Panels[1].Text:="нет такого файла: "+FName; exit;
end;
AssignFile(Fil,FName); Reset(Fil,1);
Fact := 1; While fact <> 0 do
begin BlockRead(Fil,Ch,1,fact); RStri := RStri + ch;
end; CloseFile(Fil);
Convert(RStri,Length(RStri));
LStri := "";
poza1:= 1; while poza1 <> 0 do
begin poza1 := pos("src="",RStri); LStri:= LStri + Copy(RStri,1,poza1+4);
Delete(RStri,1,poza1+4); LStri := LStri + Dira;
If poza1 <> 0 then
begin poza1:= pos("">",RStri);
LStri:= LStri + Copy(RStri,1,poza1+1); Delete(RStri,1,poza1+1);
end else LStri := LStri + RStri;
end;
If trim(LStri) = "" then
showmessage("пустой файл");
end;
procedure TMainForm.WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
var ss,ss1 : String;
begin
If URL <> "about:blank" then Cancel := True;
ss := string(URL) ; Strijka(ss,ss1); URL := ss1;
Statusbar1.Panels[0].Text := URL;
IzStroki(String(URL));
end;
procedure TMainForm.Exit1Click(Sender: TObject);
begin
Close;
end;
Procedure TMainForm.Strijka(Const UU: String; Var Bufsi: String);
var poza: Word;
Begin
Bufsi:= uu;
poza := pos("about:blank",Bufsi); If poza <>0 then
Delete(Bufsi,1,11);
poza := pos("about:blank",Bufsi); If poza <>0 then
Delete(Bufsi,poza-2,13);
poza:= pos("blank",Bufsi); If poza <> 0 then
Delete(Bufsi,poza,5);
End;
procedure TMainForm.HomePageRequest(var Message: TMessage);
begin
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
IF not OpenDialog1.Execute then Close;
Dir1 := ExtractFileDir(OpenDialog1.FileName);
WebBrowser1.Offline:= true;
PostMessage(Handle, CM_HOMEPAGEREQUEST, 0, 0);
FNam := Dir1+"\s11.rib";
IzStroki(FNam);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
HistoryList.Free;
end;
end.
Winni.
Страницы: 1 вся ветка
Текущий архив: 2003.05.12;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.005 c