Главная страница
    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.045 c
2-1233934102
SashaNikulin
2009-02-06 18:28
2009.03.29
Помогите решить простую задачу! SOS!


2-1233959281
GrieVeR-13
2009-02-07 01:28
2009.03.29
Цвета элементов на форме


15-1232753631
trsteep
2009-01-24 02:33
2009.03.29
Модель базы данных.


2-1234191366
AlexDan
2009-02-09 17:56
2009.03.29
Изменить положение MessageDlg,


15-1232645348
Кое кто
2009-01-22 20:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский