Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OnClick и другие события в WebBrowser'e, как их организовать с помощью MSHTML? 
:(
    Опции темы
7zip
Дата 13.5.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



Вопрос про компонент 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.


PM MAIL   Вверх
MetalFan
Дата 13.5.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 3
Всего: 128



посмотри это Обработать клик в выделенной области

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

Это сообщение отредактировал(а) Rrader - 13.5.2009, 13:13


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
7zip
Дата 14.5.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) 7zip - 14.5.2009, 14:27
PM MAIL   Вверх
MetalFan
Дата 14.5.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 3
Всего: 128



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

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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
7zip
Дата 14.5.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



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

Код

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.

PM MAIL   Вверх
MetalFan
Дата 14.5.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 3
Всего: 128



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

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



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
7zip
Дата 14.5.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



ещё вопросик...

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

Код

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



PM MAIL   Вверх
MetalFan
Дата 16.5.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 3
Всего: 128



WebBrowser чудит. сталкивался с таким... как победить - пока не знаю


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.