喫茶XRAYトップページ

[スレッド全体
]

[6271] IAccessible返信 削除
2012/8/13 (月) 11:13:04 Taki
Mr.XRAYさん、みなさん
ご無沙汰しています。Takiです。

IAccessibleの仕組みについて教えてください。

基本的な「アクセシブル オブジェクト」と「単純要素」の関係です。

例えばのイメージですが、
Form1にPanel1を配置します。
Panel1にButton1とPanel2を配置します。
さらにPanel2にButton2を配置します。
※Panelはコンテナという意味で使っています。
「アクセシブル オブジェクト」はFormとPanel1、Panel2であり、
「単純要素」はButton1、Button2と考えて良いのでしょうか。

Form1
  Panel1 - ID1

Panel1
  Button1 - ID1
  Panel2  - ID2

Panel2
  Button2 - ID1

また、IDの割り当てもこれで良いでしょうか。
例えば、Panel2のサイズを得たいときはPanel1オブジェクトのID2で
アクセスすると考えて良いでしょうか。

よろしくお願いします。

[6272] Re:IAccessible返信 削除
2012/8/14 (火) 19:48:16 Taki
再び、Takiです。

やりたいことはButton2の座標位置からPanel2→Panel1→Form1の
情報を得たいのです。

SDKに付いてくるInspedt.exeのAncestorsのような情報が欲しいのです。

AccessibleObjectFromPointとAcc.get_accParentを組み合わせれば
できそうなので、マスターのサンプルプログラムのEnumAccTreeItemsを
参考にして親の情報を得るプログラムを書いてみました。

QueryInterfaceとかのコードの意味は全く理解できていません。
見よう見まねで書いたコードです。

手続きtestをTimerで3秒おきに呼び出して、その都度一覧を得ています。


function getOya(ko:IAccessible;oyalist:TMemo):IAccessible;
var
  varChild : OleVariant;
  AccDisp : IDispatch;
  rAcc :IAccessible;
  s : wideString;
begin
  result := nil;
  if (ko = nil) then exit;

  if ko.Get_accParent(AccDisp) = S_OK then  // koの親をAccDispで受け取る
  begin

    if Assigned(AccDisp) then       // AccDispが有効なら
    begin
      AccDisp.QueryInterface(IID_IAccessible,rAcc);   // rAccへ

    // 親のNameプロパティ 確認用
      TVariantArg(varChild).vt := VT_I4;
      TVariantArg(varChild).lVal := CHILDID_SELF;  // これでいいのか?
      if rAcc.Get_accName(varChild,s) = S_OK then
      begin
        oyalist.Lines.Append(s);
        result := rAcc;
      end;
    end else begin
      oyalist.Lines.Append('AccDisp 無効');
    end;
  end else begin
    oyalist.Lines.Append('Get_acc 失敗');
  end;
end;

procedure test;   // これをTimerで呼び出す
var
  pAcc : IAccessible;
  varChild : OleVariant;
  AccNext : IAccessible;   // 親のオブジェクト
  s : wideString;
  i : integer;
  mPos : TPoint;

begin
  GetCursorPos(mPos);
  if AccessibleObjectFromPoint(mPos,pAcc,varChild) = S_OK then
  begin
    FormMain.Memo1.Clear;
    // マウスの位置のNameプロパティ
    if pAcc.Get_accName(varChild,s) = S_OK then
    begin
      FormMain.Memo1.Lines.Append(s);
    end;

    // マウス位置のAccオブジェクトのNameプロパティ
    TVariantArg(varChild).vt := VT_I4;          // OleVariant型にセット
    TVariantArg(varChild).lVal := CHILDID_SELF;
    if pAcc.Get_accName(varChild,s) = S_OK then
    begin
      FormMain.Memo1.Lines.Append(s);
    end;

    accNext := pAcc;

    for i := 0 to 10 do   // 無限ループを回避するため
    begin
      accNext := getOya(accNext,FormMain.Memo1);
      if (accNext = nil) then break;
    end;

  end;
end;

ワードとかはリボンまでしかさかのぼれません。
Get_accParentを使う方法では限界があるのでしょうか。

忘れていました。私の環境です。
Windows7Pro(32Bit)+DelphiXE(Starter)
uses plEnumAccInfos.pas

[6278] Re2:IAccessible返信 削除
2012/8/16 (木) 10:21:10 Mr.XRAY
>QueryInterfaceとかのコードの意味は全く理解できていません。

これですが,後で何かの記事の追加のような形で説明を
書いてみたいと思います.
QueryInterfaceとか,nilとか,IDispatchとかAssignとかですね.
Successもかな?

[6280] Re3:IAccessible返信 削除
2012/8/16 (木) 13:22:38 Taki
▼ Mr.XRAYさん
> >QueryInterfaceとかのコードの意味は全く理解できていません。
>
> これですが,後で何かの記事の追加のような形で説明を
> 書いてみたいと思います.
> QueryInterfaceとか,nilとか,IDispatchとかAssignとかですね.
> Successもかな?


マスター期待しています。

私はCOMの事がまったく理解できていません。
今、なんとなく分かっていることはVariant型で情報をやりとりする事。
Variant型はデータの種類を示す.vtとデータの入れ物の.lvalでできている事。
整数値が返されるときは.vtにはVT_I4が入り、AccessibleObjectが返される時は
.vtにはVT_DISPATCHが入っている事ぐらいです。

よろしくお願いします。

[6281] Re4:IAccessible返信 削除
2012/8/16 (木) 14:03:26 Mr.XRAY
▼ Takiさん

> 私はCOMの事がまったく理解できていません。

あたしもたいしたことは知りません(汗)
利用する立場での知識が,ほんの少しあるぐらいです.ハイ.
だいいち,ややこしいことは嫌いですから !?

> 今、なんとなく分かっていることはVariant型で情報をやりとりする事。
> Variant型はデータの種類を示す.vtとデータの入れ物の.lvalでできている事。
> 整数値が返されるときは.vtにはVT_I4が入り、AccessibleObjectが返される時は
> .vtにはVT_DISPATCHが入っている事ぐらいです。


十分なのではないでしょうか.
って,私がこんなこと言える立場にないですが (^^;
それにしても,Takiさん,よくも「難解な記事」を読んでくださるもんですね.
ちょっぴり嬉しいです.

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82