![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Надо программно навести курсор на ссылку в WebBrowser-е. [D7, WinXP]
Alpine © (2005-09-12 23:37:00)Доброго времени суток .. Вобщем у меня возникла такая проблемма ... Использую компонент WebBrowser .. Открываю в нём URL. Загрузилась страничка .. В страничке много ссылок .. Мне надо навести на ссылку название которой я знаю. Подскажите как мне это сделать .. Или хотя бы идеи дайте плиззз ...
Заранее благодарен всем откликнувшимся !!
Nick Denry (2005-09-14 17:17:00) [1]easy © (14.09.05 11:58) [5]
спасибо.
Кусочки deplhiMaster Chat? ;)
easy (2005-09-14 11:58:00) [2]frmMainU.pas
unit frmMainU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, ExtCtrls, StdCtrls, ComCtrls;
type
TfrmMain = class(TForm)
SB: TStatusBar;
LB: TListBox;
SPL: TSplitter;
WB: TWebBrowser;
procedure FormCreate(Sender: TObject);
procedure WBDocumentComplete(Sender: TObject; const pDisp: IDispatch;
var URL: OleVariant);
procedure LBClick(Sender: TObject);
procedure WBBeforeNavigate2(Sender: TObject; const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData, Headers: OleVariant;
var Cancel: WordBool);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.FormCreate(Sender: TObject);
begin
WB.Navigate(' http://www.delphimaster.ru/cgi-bin/forum.pl?id=1126553860&n=5');
end;
function ElementTop(elem: OleVariant): integer;
var
top, height: integer;
begin
top := 0;
height := elem.offsetHeight;
repeat
top := top + elem.offsetTop;
elem := elem.offsetParent;
until elem.tagName = 'BODY';
result := top + height div 2;
end;
function ElementLeft(elem: OleVariant): integer;
var
left, width: integer;
begin
left := 0;
width := elem.offsetWidth;
repeat
left := left + elem.offsetLeft;
elem := elem.offsetParent;
until elem.tagName = 'BODY';
result := left + width div 2;
end;
procedure TfrmMain.WBDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i: integer;
allA: OleVariant;
p: TPoint;
begin
allA := WB.OleObject.document.all.tags('A');
for i := 0 to allA.length - 1 do begin
p := point(ElementLeft(allA.item(i)), ElementTop(allA.item(i)));
LB.Items.Add(inttostr(p.X) + ' : ' + inttostr(p.Y) + ' -> ' + allA.item(i).innerText);
end;
end;
procedure TfrmMain.LBClick(Sender: TObject);
var
p: TPoint;
bodyTop, bodyLeft: integer;
allA: OleVariant;
begin
allA := WB.OleObject.document.all.tags('A');
with LB do
p := point(ElementLeft(allA.item(ItemIndex)), ElementTop(allA.item(ItemIndex)));
WB.OleObject.document.parentWindow.scrollTo(p.X - WB.Width div 2, p.Y - wb.Height div 2);
p := WB.ClientToScreen(p);
bodyTop := WB.OleObject.document.body.scrollTop;
bodyLeft := WB.OleObject.document.body.scrollLeft;
setcursorpos(p.X - bodyLeft, p.Y - bodyTop);
end;
procedure TfrmMain.WBBeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
begin
LB.Clear;
end;
end.
frmMainU.dfm
object frmMain: TfrmMain
Left = 192
Top = 138
Width = 870
Height = 640
Caption = 'frmMain'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object SPL: TSplitter
Left = 221
Top = 0
Width = 4
Height = 594
Cursor = crHSplit
end
object SB: TStatusBar
Left = 0
Top = 594
Width = 862
Height = 19
Panels =
SimplePanel = False
end
object LB: TListBox
Left = 0
Top = 0
Width = 221
Height = 594
Align = alLeft
ItemHeight = 13
TabOrder = 1
OnClick = LBClick
end
object WB: TWebBrowser
Left = 225
Top = 0
Width = 637
Height = 594
Align = alClient
TabOrder = 2
OnBeforeNavigate2 = WBBeforeNavigate2
OnDocumentComplete = WBDocumentComplete
ControlData = {
4C000000D6410000643D00000000000000000000000000000000000000000000
000000004C000000000000000000000001000000E0D057007335CF11AE690800
2B2E126208000000000000004C0000000114020000000000C000000000000046
8000000000000000000000000000000000000000000000000000000000000000
00000000000000000100000000000000000000000000000000000000}
end
end
setcursorWB.dpr
program setcursorWB;
uses
Forms,
frmMainU in 'frmMainU.pas' {frmMain};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
Alpine (2005-09-13 22:20:00) [3]Уважаемый Ihor Osov'yak не могли бы вы скинуть мне на alpine@hotmail.ru инфу по IHtmlElement, или если у вас есть пример по этой теме, то вообще было бы супер !
Заранее благодарен !
Nick Denry (2005-09-13 13:15:00) [4]Ihor Osov'yak © (13.09.05 00:31) [2]
А OnMouseClick создать (или прехватить) для элемента с конкретным ID разве нельзя?
Ihor Osov'yak (2005-09-13 00:31:00) [5]> Или хотя бы идеи дайте плиззз ...
Среди методов IHtmlElement (или IHtmlElement2 :-) есть методы, возращаеющее смещение соотв. тега в пикселах относительно родительского тега. Пройдясь по списке родителей, можно вычислить координаты элемента относительно "начала" броузера. Попотно нужно учитывать значение скролинга (тоже есть соотв. методы в вышеупомянутых интерфейсах). Не забывать за возможность существования фреймов. Далее учитываем координаты самого броузера уже в контексте виндозных окон - и как следсвие имеем координаты тега в пространстве экрана. Далее двигаем соотв. апишными мишиный курсор..
делал когда-то похожую вещь, в десяток-другой строк кода, имхо, можно вложится.. Сейчас в архиве старых проектов влом искать..
Nick Denry (2005-09-12 23:48:00) [6]Ктсати, тоже вопрос интересует, а так же получение управления стандартным объектом Document и обработки событий элементов.
И книжку по COM(ActiveX) порекомендуйте плиз.