1

クラス TElTreeView のサードパーティ Delphi ツリーを含むスクリプトを改善しようとしています。ElTree1 オブジェクトでクリックして展開したい特定の項目を見つけることができますが、TC スクリプトを介してそのインデックス値でアクセスできないようです。アイテムをチェックして展開し、それに応じてその下にあるいくつかの子アイテムを設定する必要があります。

私が次のことをするだけなら...

w := p.frmOpts;
tvw := w.VCLObject('ElTree1');
tvw.Selected.Checked := true;

... 次に、ウィンドウを開いたときにデフォルトで強調表示されている項目がチェックされます。私は他の多くのことを試しましたが、今のところ運がありません。Sys.Keys の使用を避けようとしています。

何か案は?

ありがとう!

4

1 に答える 1

2

TestCompleteデバッグ情報エージェントがコントロールのすべてのネイティブ メソッドとプロパティへのアクセスをツールに提供できるように、デバッグ情報を使用してアプリケーションをコンパイルする必要があります。TestComplete がデバッグ情報を見つけたら、次の方法でツリー項目にアクセスできます。

procedure Test;
  ...
  w := p.frmOpts;
  tvw := w.VCLObject('ElTree1');
  tvw.Items.Item(1).Checked := true;
end;

デバッグ情報エージェントのヘルプ トピックで、TestComplete のデバッグ情報を使用して Delphi アプリケーションを正しくコンパイルする方法の詳細を確認してください。ご使用の Delphi のバージョンに対応するリンクをクリックして、手順を取得します。

また、このアンケートで、TestComplete の将来のバージョンでのコントロールの高度なサポートに投票できます。

アップデート:

TestComplete は、他の広範なツリー ビュー コントロールのようなTElTreeViewコントロールの拡張サポートを持っていませんが、高レベルでコントロールを操作するためのスクリプト ルーチンを作成することは可能です。これらのルーチンは、TestComplete の Open Application 機能を使用して、ネイティブ メソッドとプロパティを介してツリー コントロールを操作します。以下のサンプル スクリプトは、これを行う方法を示しています。

function getTreeNode(tree, nodeName); forward;
function clickTreeNode(tree, node); forward;

procedure test;
var
  tree;
  nodeName;
  node;
begin
  tree := Sys.Process('ElTreeTest').VCLObject('Form1').VCLObject('ElPanel1').VCLObject('ElTree1');
  nodeName := 'Item B|Item BB|Item BBA';
  node := getTreeNode(tree, nodeName);
  if node <> nil then
    Log.Message(node.Caption)
  else
  begin
    Log.Error('Node "' + nodeName + '" not found');
    Runner.Stop;
  end;

  node.MakeVisible;
  node.Checked := not node.Checked;
  clickTreeNode(tree, node);
end;

function clickTreeNode(tree, node);
var
  x, y;
begin
  node.MakeVisible;
  x := (node.TextRect.Left + node.TextRect.Right) / 2;
  y := (node.TextRect.Top + node.TextRect.Bottom) / 2;
  tree.Click(x, y);
end;

function getTreeChildNode(rootNode, nodeName);
var
  i;
  item;
  nodeCaption;
begin
  result := nil;
  if rootNode = nil then
    exit;

  nodeCaption := aqString.GetListItem(nodeName, 0);

  for i := 0 to rootNode.ChildrenCount - 1 do
  begin
    item := rootNode.Children(i);
    if item.Caption = nodeCaption then
    begin
      result := item;
      break;
    end;
  end;

  if aqString.GetListLength(nodeName) > 1 then
    result := getTreeChildNode(result, aqString.DeleteListItem(nodeName, 0));
end;

function getTreeNode(tree, nodeName);
var
  rootNodeCaption;
  item;
  i;
begin
  aqString.ListSeparator := '|';
  rootNodeCaption := aqString.GetListItem(nodeName, 0);
  result := nil;

  for i := 0 to tree.Items.Count - 1 do
  begin
    item := tree.Items.Item(i);
    if item.Parent = nil then
    begin
      if item.Caption = rootNodeCaption then
      begin
        result := item;
        break;
      end;
    end;
  end;

  if aqString.GetListLength(nodeName) > 1 then
    result := getTreeChildNode(result, aqString.DeleteListItem(nodeName, 0));
end;
于 2012-04-13T16:16:51.563 に答える