Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2009.03.29;
Скачать: [xml.tar.bz2];

Вниз

Как получить данные из глобально обьявленного массива в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.079 c
2-1233776721
trsteep
2009-02-04 22:45
2009.03.29
XML vs TreeView


2-1233909755
kyn66
2009-02-06 11:42
2009.03.29
Не правильно работает MonthsBetween


15-1232800135
ketmar
2009-01-24 15:28
2009.03.29
подскажите аналог Valgrind под винду, бесплатный


9-1177600266
$00FF00
2007-04-26 19:11
2009.03.29
Проблемы с трением


15-1232350793
nnov
2009-01-19 10:39
2009.03.29
Железо - Видюха





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский