Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить данные из глобально обьявленного массива в jscript?? [D6, D7, WinXP]


VoV_I_K ©   (2008-01-20 14:43:00) 

вапрос! Как работать с глабально обьявленными массивами?!?!
на странице есть jscript фунция в которой обьявлен массив myarray при получении доступа к нему
MyArray:=(webbrowser1.Document as IHtmlDocument2).parentWindow.myarray;
функция VarType говорит что мы получили указатель на интерфейс IDispatch, а как действовать дальше?


DiamondShark   (2008-01-25 15:25:00) [1]


> А может можно какой нибудь примерчик???

А может можно почитать MSDN по ключевым словам IDispatch, Invoke, IEnumVariant и далее со всеми остановками по ссылкам "See Also"?

Дарю, ффтыкай:

unit jsobj;

interface

uses
 ActiveX;

type
 TJSArraySortFunc = function(elt1, elt2: OleVariant): Integer;
 TJSArraySortMethod = function(elt1, elt2: OleVariant): Integer of object;

 TJSArrayWrapper = class
 private
   FObject: OleVariant;
   FObjectInterface: IDispatch;
   function GetItem(Index: Integer): OleVariant;
   procedure SetItem(Index: Integer; const Value: OleVariant);
   function GetLength: Integer;
 public
   constructor Create(const AObject: OleVariant);

   property AsVariant: OleVariant read FObject;
   property AsInterface: IDispatch read FObjectInterface;
   property Item[Index: Integer]: OleVariant read GetItem write SetItem; default;
   function GetEnum: IEnumVARIANT;

   property Length: Integer read GetLength;
 end;

implementation

uses
 Windows,
 SysUtils,
 ComObj;

const
 NullGuid: TGuid = '{00000000-0000-0000-0000-000000000000}';
 NullParams: DISPPARAMS = (rgvarg: nil; rgdispidNamedArgs: nil; cArgs: 0; cNamedArgs: 0);

{ TJSArrayWrapper }

constructor TJSArrayWrapper.Create(const AObject: OleVariant);
begin
 FObject := AObject;
 FObjectInterface := IDispatch(FObject);
end;

function TJSArrayWrapper.GetEnum: IEnumVARIANT;
var
 Res: OleVariant;
begin
 OleCheck(
   FObjectInterface.Invoke(
     DISPID_NEWENUM,
     NullGuid,
     GetSystemDefaultLCID,
     DISPATCH_METHOD or DISPATCH_PROPERTYGET,
     NullParams,
     @Res,
     nil,
     nil
   )
 );
 Result := IUnknown(Res) as IEnumVARIANT;
end;

function TJSArrayWrapper.GetItem(Index: Integer): OleVariant;
var
 Member: WideString;
 DispId: DWORD;
begin
 Member := IntToStr(Index);
 OleCheck(
   FObjectInterface.GetIDsOfNames(
     NullGuid,
     @Member,
     1,
     GetSystemDefaultLCID,
     @DispId
   )
 );
 OleCheck(
   FObjectInterface.Invoke(
     DispId,
     NullGuid,
     GetSystemDefaultLCID,
     DISPATCH_PROPERTYGET,
     NullParams,
     @Result,
     nil,
     nil
   )
 );
end;

function TJSArrayWrapper.GetLength: Integer;
begin
 Result := FObject.length;
end;

procedure TJSArrayWrapper.SetItem(Index: Integer; const Value: OleVariant);
const
 ParamId: TDispId = DISPID_PROPERTYPUT;
var
 Member: WideString;
 DispId: TDispId;
 Params: DISPPARAMS;
begin
 Member := IntToStr(Index);
 OleCheck(
   FObjectInterface.GetIDsOfNames(
     NullGuid,
     @Member,
     1,
     GetSystemDefaultLCID,
     @DispId
   )
 );
 Params.rgvarg := @Value;
 Params.rgdispidNamedArgs := @ParamId;
 Params.cArgs := 1;
 Params.cNamedArgs := 1;
 OleCheck(
   FObjectInterface.Invoke(
     DispId,
     NullGuid,
     GetSystemDefaultLCID,
     DISPATCH_PROPERTYPUT or DISPATCH_PROPERTYPUTREF,
     Params,
     nil,
     nil,
     nil
   )
 );
end;

end.


использование:


uses
 ActiveX, ComObj, jsobj;

procedure TForm1.FormCreate(Sender: TObject);
begin
 WebBrowser1.Navigate('about:<HTML><HEAD><SCRIPT>var oArray = new Array(1,2,3,"Один","Два","Три");</SCRIPT></HEAD><BODY></BODY></HTML>');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 jsarray: TJSArrayWrapper;
 enm: IEnumVARIANT;
 v: OleVariant;
 Dummy: Cardinal;
begin
 jsarray := TJSArrayWrapper.Create(OleVariant(Webbrowser1.Document).parentWindow.oArray);
 try
   enm := jsarray.GetEnum();
   while enm.Next(1, v, Dummy) = S_OK do
     Memo1.Lines.Add(v);
   jsarray[0] := 'Hello, World!';
   enm.Reset;
   while enm.Next(1, v, Dummy) = S_OK do
     Memo1.Lines.Add(v);
   Memo1.Lines.Add(jsarray.AsVariant.join('_-_'));
 finally
   jsarray.Free;
 end;
end;


VoV_I_K   (2008-01-24 11:39:00) [2]


> Можно вызывать свойства и методы.Можно через вызов Invoke
> с DISPID_NEWENUM получить IEnumVariant для последовательного
> доступа к элементам.


А может можно какой нибудь примерчик???

> И при чём тут "Сети"?


ну извеняйте... мне показалось что эта ветка ближе всего по теме


DiamondShark   (2008-01-22 00:17:00) [3]


> функция VarType говорит что мы получили указатель на интерфейс
> IDispatch


Правильно говорит. Мы получили жскриптовый объект Array.


> а как действовать дальше?

Так же, как с любым другим диспатч-объектом.
Можно вызывать свойства и методы.
Можно через вызов Invoke с DISPID_NEWENUM получить IEnumVariant для последовательного доступа к элементам.
Можно даже получить произвольный доступ по индексам, правда, особоизвращённым способом. Индексы являются именамисвойств. Поэтому придётся использовать сочетание GetIDsOfNames и Invoke. В качастве имён свойств использовать '0', '1' и т.д.

ЗЫ
И при чём тут "Сети"?


Наверх

Титульная страница Поиск, карта сайта Написать письмо