Форум: "Сети";
Текущий архив: 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.064 c