Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.29;
Скачать: CL | DM;

Вниз

Как получить данные из глобально обьявленного массива в jscript??   Найти похожие ветки 

 
VoV_I_K ©   (2008-01-20 14:43) [0]

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


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


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


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


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

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

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


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


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


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

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


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


 
DiamondShark ©   (2008-01-25 15:25) [3]


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

А может можно почитать 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;



Страницы: 1 вся ветка

Текущий архив: 2009.03.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
2-1233838460
Allizar
2009-02-05 15:54
2009.03.29
1C и Delphi 7


15-1233095106
паровоз
2009-01-28 01:25
2009.03.29
Применим ли инструмент View CPU для отладки сторонних ехе-шников


2-1233495081
AlexP
2009-02-01 16:31
2009.03.29
Переключение между приложениями


3-1217079807
Руслан
2008-07-26 17:43
2009.03.29
Вопрос новичка


6-1200509623
Gbp
2008-01-16 21:53
2009.03.29
Как реализовать поддержку SSL в прокси-сервере?