Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > OnClick и другие события в WebBrowser'e


Автор: 7zip 13.5.2009, 12:47
Вопрос про компонент TWEbBrowser.. Значит есть на форме этот самый объект, в него подгружаются программно данные вида:

Key1: Value1
Key2: Value2
.....

нужно чтобы при наведении указателя мышки на каждое выражение Key сам указатель менял форму на ту же, на которую он меняется при наведении на ссылку. При клике по этому выражению Key необходимо чтобы это выражение без значения Value скопировалось в другой компонент на форме (например edit).. Как всю эту красоту можно сделать?.. даже подступиться не знаю как.. причём очень желательно чтобы в сам код не добавлялось ничего лишнего.. и ещё момент, все выражения key и value в коде выглядят вот так:

Код

<b><font CLASS=KEY color = #{разный}>Выражение Key</font>: </b>Выражение Value2




Может это как то поможет вылавливать их..

Насколько знаю всё это делается через MSHTML, при клике можно определить активный элемент, и дальше получать его свойства..

вот исходник в виде примера, как выглядят данные..

Код

unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, ActiveX, MSHTML;

type
  TForm6 = class(TForm)
    WebBrowser1: TWebBrowser;
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form6: TForm6;
  v: Variant;
  HTMLDocument: IHTMLDocument2;

implementation

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
begin
  if WebBrowser1.Document = nil then
  begin
    WebBrowser1.Navigate('about:blank');
    HTMLDocument:=WebBrowser1.Document as IHTMLDocument2;
    v:=VarArrayCreate([0, 0], varVariant);
    v[0]:='<STYLE> .KEY {font-size: 16px; font-family: "Courier"; font-weight: bold; background-color: #EEEEEE;}</STYLE>';
    HTMLDocument.Writeln(PSafeArray(TVarData(v).VArray));
  end;
  v[0]:='<b><font CLASS=KEY color = clRed>'+Edit1.Text+'</font>: </b>'+Edit2.Text+'<br>';
  HTMLDocument.Writeln(PSafeArray(TVarData(v).VArray));
end;

end.


Автор: MetalFan 13.5.2009, 12:50
посмотри это http://forum.vingrad.ru/forum/topic-247474.html

MetalFan, ссылка была на другую тему, поправил.

Автор: 7zip 14.5.2009, 14:17
в общем посмотрел я это.. я с этим компонентом не работал ранее никогда, поэтому для меня тут много нового.. и честно говоря из того кода не совсем всё понятно.. присвоение события там идёт через нажатие кнопки.. а без лишних действий это же можно делать? как на моём примере сразу при добавлении новых данных? и вообще.. был бы благодарен если на самом этом примерчике моём показали бы работу какогонибудь одного события, например онклик, всё остальное сам сделаю.. в проекте осталось вот это единственное прикрутить, бьюсь уже уйму времени и не выходит.. :(

кстати.. есть варианты того как это сделать вот в этой статье, причём и выглядит это всё проще.. но другой язык.. : http://www.msvb.narod.ru/doc_webbrowser_p2.htm

Автор: MetalFan 14.5.2009, 15:26
Цитата(7zip @  14.5.2009,  14:17 Найти цитируемый пост)
а без лишних действий это же можно делать?

странная формулировка... как написать программу без лишних действий? что значит "лишнее действие"? 
может стоит взять метлу и в дворники?

что непонятного в том примере?
в твоем случае берешь Document.All  и всем IHTMLElement проставляешь OnClick

Автор: 7zip 14.5.2009, 20:32
я имел ввиду то, что коллекция будет обновляться тогда каждый раз, как только добавляются новые данные.. Может как-то по другому можно сделать?.. данных такого рода добавляется немало и не вручную - парсируются данные получаемые через клиентсокет..
пока сделал вот так: вроде бы работает.. но всё ли правильно?

Код

unit Unit6;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, ActiveX, MSHTML;

type

  IMyEventSink = interface(IDispatch)
    procedure SetSource(Value: OleVariant);
    property Source: OleVariant write SetSource;
  end;

  { onclick Handler }
  TEventSink = class(TInterfacedObject, IMyEventSink)
  private
    FSource: OleVariant;
    function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
    function GetTypeInfo(Index, LocaleID: Integer;
      out TypeInfo): HResult; stdcall;
    function GetIDsOfNames(const IID: TGUID; Names: Pointer;
      NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo,
      ArgErr: Pointer): HResult; stdcall;
    procedure SetSource(Value: OleVariant);
  end;

  TForm6 = class(TForm)
    WebBrowser1: TWebBrowser;
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FFontSink: IMyEventSink;
  end;

var
  Form6: TForm6;
  v: Variant;
  HTMLDocument: IHTMLDocument2;
  
implementation

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
var
  Fonts: IHTMLElementCollection;
  FontEl: IHTMLElement2;
  i: integer;
begin
  if WebBrowser1.Document = nil then
  begin
    WebBrowser1.Navigate('about:blank');
    HTMLDocument:=WebBrowser1.Document as IHTMLDocument2;
    v:=VarArrayCreate([0, 0], varVariant);
    v[0]:='<STYLE> .KEY {font-size: 16px; font-family: "Courier"; font-weight: bold; background-color: #EEEEEE;}</STYLE>';
    HTMLDocument.Writeln(PSafeArray(TVarData(v).VArray));
  end;
  v[0]:='<b ID=MyDiv><font CLASS=KEY color = Red>'+Edit1.Text+'</font>: </b>'+Edit2.Text+'<br>';
  HTMLDocument.Writeln(PSafeArray(TVarData(v).VArray));

  with WebBrowser1 do
  begin
    while ReadyState < READYSTATE_INTERACTIVE do
      Forms.Application.ProcessMessages;
    Fonts := ((Document as IHTMLDocument2).body as IHTMLElement2).getElementsByTagName('FONT');
    //ShowMessage(IntToStr(Fonts.length));
    if Assigned(Fonts) then
    try
      FontEl := Fonts.item(Unassigned, 0) as IHTMLElement2;
      if Assigned(FontEl) then
      try
          { Назначение onclick для <FONT> }
          for i:= 0 to Fonts.length-1 do
          begin
          FFontSink.Source := FontEl;
          (Fonts.item(i,varEmpty) as IHTMLElement).onclick := FFontSink;
          end;
      finally
        FontEl := nil;
      end;
    finally
      Fonts := nil;
    end;
  end;
end;

{ TEventSink }

function TEventSink.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount,
  LocaleID: Integer; DispIDs: Pointer): HResult;
begin
  Result := E_NOTIMPL;
end;

function TEventSink.GetTypeInfo(Index, LocaleID: Integer;
  out TypeInfo): HResult;
begin
  Result := E_NOTIMPL;
  Pointer(TypeInfo) := nil;
end;

function TEventSink.GetTypeInfoCount(out Count: Integer): HResult;
begin
  Result := E_NOTIMPL;
  Count := 0;
end;

function TEventSink.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;
var
  objElement: ihtmlELement;
begin
  Result := S_OK;
  objElement:=(Form6.WebBrowser1.Document as IHTMLDOcument2).parentWindow.event.srcElement;
  if objElement.className='KEY' then
  begin
    Form6.Edit3.Text:=OleVariant(Form6.WebBrowser1.Document).parentWindow.event.srcElement.InnerText;
  end;
end;

procedure TEventSink.SetSource(Value: OleVariant);
begin
  FSource := Value;
end;

procedure TForm6.FormCreate(Sender: TObject);
begin
  FFontSink := TEventSink.Create;
end;

end.

Автор: MetalFan 14.5.2009, 20:56
Цитата(7zip @  14.5.2009,  20:32 Найти цитируемый пост)
вроде бы работает.. но всё ли правильно?

работает? значит правильно) поздравляю!

Автор: 7zip 14.5.2009, 21:08
ещё вопросик...

не пойму почему если сделать вот так то не ставится фокус..(

Код

  if objElement.className='KEY' then
  begin
    Form6.Edit3.Text:=OleVariant(Form6.WebBrowser1.Document).parentWindow.event.srcElement.InnerText;
    Form6.Edit3.SetFocus;
  end;



Автор: MetalFan 16.5.2009, 10:32
WebBrowser чудит. сталкивался с таким... как победить - пока не знаю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)