「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@639) [低] [アイデア]
@639■ (#2024) ツリー部品の選択パス設定の動作がおかしい - nakkaa (2012-07-16 13:44) /低 未処理
【症状】
1番上に表示される最初のノードが2つ以上あるとツリー部品の選択パス設定が正しく動作しない。
【再現方法】

TWREEとはツリー
そのレイアウトは全体
そに「,NODE6,6Node,,
,NODE1,1NODE,,
NODE1,NODE2,2NODE,,
NODE1,NODE3,3NODE,,
NODE3,NODE4,4NODE,,
NODE3,NODE5,5NODE,,」を一括作成。
0.1秒待つ
TWREEの「3NODE\5NODE」を選択パス設定

//上記の,NODE6,6Node,,を消せばちゃんと動作する。

【要望】
1番上に表示される最初のノードが2つ以上あってもしっかり選択できるようにしてほしい。
また、トップノード(1番上に表示される最初のノード)から順に指定して動作するようにしてほしい。(『TWREEの「3NODE\5NODE」を選択パス設定』を『TWREEの「1NODE\3NODE\5NODE」を選択パス設定』にして動作できるようにしいてほしいです。)
【バージョン】
1.53352
【その他】
ツリー部品で実装できることが増えると思うので、ぜひ修正をよろしくお願いします。

(#2111) 修正案(開発者向け) - うぇいく (2013-03-31 01:49) /低 アイデア
開発向け情報です。
パス設定を以下のような感じに修正するとよさそうです。
この場合、依然の動作とは非互換となるため、取り込んだリリースの際には、
注意書きがあったほうがよさそうです。
---- unit_tree_list.pasの、THiTreeViewのSetSelectPath
procedure THiTreeView.SetSelectPath(path: string);
var
  n, ok: TTreeNode;
  sl: TStringList;
  name: string;
  k: Integer;

  function findChildNode(n:TTreeNode;i:Integer):TTreeNode;
  var
    c, ok: TTreeNode;
    j: Integer;
    name: String;
  begin
    if (i >= sl.Count) or (sl.Strings[i] = '') then
    begin
      // 見つけた。
      Result := n;
      Exit;
    end;
    name := sl.Strings[i];
    for j := 0 to n.Count - 1 do
    begin
      c := n.Item[j];
      if c.Text = name then
      begin
        ok := findChildNode(c,i+1);
        if ok <> nil then
        begin
          Result := ok;
          Exit;
        end;
      end;
    end;
    Result := nil;
  end;

begin
  sl := SplitChar('\', path);
  try
    ok := Self.TopItem;
    if (sl.Count > 0) and (sl.Strings[0]<>'') then
    begin
      name := sl.Strings[0];
      ok := nil;
      for k := 0 to Self.Items.Count -1 do
      begin
        n := Self.Items.Item[k];
        if (n.Parent = nil) and (n.Text = name) then
        begin
          ok := findChildNode(n,1);
          if ok <> nil then Break;
        end;
      end;
      if ok = nil then Exit;// 一致なし
    end;
    ok.Selected := True;
  finally
    sl.Free;
  end;
end;

(#2024)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能