Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение массива объектов, OleVariant, Массив объектов OleVariant, TWebBrowser 
V
    Опции темы
pupkindeniska
Дата 21.11.2011, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Добрый день. Помогите разобратся.
На html страничке есть массив "elementsArray" как его выдрать понял, но как обработать не могу понять.
Вот код делфи:

Код

procedure TForm1.Button5Click(Sender: TObject);
var
 V:OleVariant;
 VElement:OleVariant;
 elArray:OleVariant;
 i,iCount:integer;
begin
 V:=WebBrowser.Document;
 VElement:=V.parentWindow;
 elArray:=VElement.elementsArray;
 iCount:=elArray.length;

 Memo1.Lines.Add('Длинна массива='+IntToStr(iCount));

 for i:=0 to iCount-1 do
 Begin
 //Что должно быть тут? 
 end; 

 showmessage(elArray); //Тут я вижу что массив состоит из объектов типа [object Object, object Object]

end;

PM MAIL   Вверх
pupkindeniska
Дата 21.11.2011, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Вот скрипт в самой странице HTML

Код

<script type="text/javascript">
    //
        var elementsArray = new Array();
        
        function compareProducts(product1, product2){
            return product1.id-product2.id;
        }

    
        function arrayContains(array, value, compare) {
            for (var i = 0; i < array.length; i++) {
                if (compare(array[i], value)==0) {
                    return true;
                }
            }
            return false;
        }

        function addIfNew(array, value, compare) {
            if (array != null) {
                if (!arrayContains(array, value, compare)) {
                    array[array.length] = value;
                }
            }
        }
        
        function removeElemenFromArray(array, value, compare){
            if (array != null) {
                var index = -1;
                for (var i = 0; i < array.length; i++) {
                    if (compare(array[i], value)==0) {
                        index = i;
                        break;
                    }        
                }
                if(index>-1){
                    array.splice (index,1);
                }
            }    
        }
    
        function selectCkeckbox(item, product) { 
            if(item.checked){
                addIfNew(elementsArray, product, compareProducts);
            }else{
                removeElemenFromArray(elementsArray, product, compareProducts)
            }
        }

        function clearSearch() {
            jQuery.noConflict()(
                function($) {
                $('#action').val('Reset');
                $('#productSearchForm').submit();
                }
            )
        } 
        
        function doClose() {
            jQuery.noConflict()(
                function($) {
                window.opener.focus();
                self.close();
                }
            )
        }

        function doSelect() {
            jQuery.noConflict()(
                function($) {
                    if (window.opener.selectProductCallback) {
                        window.opener.selectProductCallback(elementsArray);
                    }
                    //
                    doClose();
                }
            )
        }
    //</script>

PM MAIL   Вверх
pupkindeniska
Дата 22.11.2011, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Может всё же кто поможет?
PM MAIL   Вверх
volvo877
Дата 23.11.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 5
Всего: 116



pupkindeniska, здесь был?
PM MAIL   Вверх
pupkindeniska
Дата 24.11.2011, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



volvo877 СПАСИБО!!!!!

С задачей разобрался ... очень помогло.......
Скопировано от туда по ссылке сюда.......

Код

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;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.