Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];

Вниз

Как перехватить щелчок по гипертекстовой ссылке в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.006 c
14-34545
Separator
2003-04-23 11:32
2003.05.12
Как работать с утилитой TDump


14-34605
Viktor Kushnir
2003-04-24 11:31
2003.05.12
Чем склеить ДСП?


1-34392
vladislav80
2003-04-28 22:25
2003.05.12
Несколько пакетов в одной группе...


3-34354
Askik
2003-04-18 15:44
2003.05.12
Как заставить ADOQuery не скачивать все записи набора данных?


1-34408
zloy_dima
2003-04-30 11:53
2003.05.12
Динамический массив





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский