TreeViewの展開


いまむら  2010-11-12 04:29:59  No: 39521

TreeView1を配置しております、FORMを開いたときにBookMark.txtから読み込むようになっていますが読み込んだ際に全てのフォルダが開いた状態になってほしいのですが方法がわかりません、自分なりに//この部分  の所に
TreeView1.FullExpand();
Node.Collapse(False);
Node.Expand(False);
などを入れてみましたが思ったようにいきません。

宜しくお願いします。

  if FileExists('BookMark.txt') = True then
  begin
    SL1 := TStringList.Create;
    try
      SL1.LoadFromFile('BookMark.txt'); // ブックマークは、
      intLevelB := 0; // ノードの階層レベル,タイトル,URL
      Node := nil; // の形式で格納してある。
      for i := 0 to SL1.Count - 1 do
      begin
        strLine := SL1.Strings[i];
        intA := Pos(',', strLine);
        for n := Length(strLine) downto 1 do
        begin
          if strLine[n] = ',' then
          begin
            intB := n;
            Break;
          end;
        end;
        try
          intLevelA := StrToInt(Copy(strLine, 1, intA - 1));
        except
          on EConvertError do
          begin
            ShowMessage('ブックマークの読み込みに失敗しました。');
            Exit;
          end;
        end;
        // 読み込んだ設定ファイルをFolderに反映
        strTitle := Copy(strLine, intA + 1, intB - intA - 1);
        New(P);
        P^.URL := Copy(strLine, intB + 1, Length(strLine) - intB);
        Node := TreeView1.Items.AddObject(Node, strTitle, P);

        if intLevelB > intLevelA then
        begin
          intLevelB := intLevelA;
          while Node.Level > intLevelA do
          begin
            Node.MoveTo(Node.Parent, naAdd);
            //この部分
          end;
        end
        else if intLevelB < intLevelA then
        begin
          Node.MoveTo(Node.GetPrev, naAddChild);
          intLevelB := intLevelA;
          //この部分
        end;
      end;
      // TreeView1.FullCollapse;
      //この部分
    finally
      SL1.Free;
    end;
  end;

Book.txt の中身
0,検索,Folder
1,Google,http://www.google.co.jp/


tor  2010-11-12 05:05:13  No: 39522

これを実行しているのはどのイベントでしょう。
たとえばコンストラクタやOnCreateの中だと、まだTreeViewのウィンドウハンドルがないため
Expandしても効果がない(厳密に言うと、後でウィンドウの実体が作られたときにリセットされてしまう)のだったと思います。

OnShowあたりで実行するか、先にTreeView.HandleNeededを入れてみたらどうなりますか?


いまむら  2010-11-12 05:22:30  No: 39523

tor様早速のご返答ありがとうございます、どうしてこの様な状況になっているのかが理解できました、しかし、なかなかうまくきません、、、

このさいアプリが立ちあがってからFolderを展開するボタンを作ってもよいかと思ってきました、どの様にすればできますでしょうか?


KHE00221  2010-11-12 09:19:48  No: 39524

さんぷる

procedure TForm6.FormCreate(Sender: TObject);
var
    TreeNode1,TreeNode2,TreeNode3: TTreeNode;
begin
    TreeNode1 := TreeView1.Items.AddFirst(TreeView1.TopItem,'AAA');
    TreeNode2 := TreeView1.Items.AddChild(TreeNode1,'BBBB');
    TreeNode3 := TreeView1.Items.AddChild(TreeNode2,'CCC');
    TreeView1.TopItem.Expand(True);
end;


通りすがり  2010-11-12 19:48:38  No: 39525

type
  TMyNode = record
    URL: String;
  end;
  PMyNode = ^TMyNode;

procedure TForm1.LoadBookMark(AFileName: String);
var
  SL1: TStringList;
  intA, intLevelA, intB, intLevelB: Integer;
  strLine, strTitle: String;
  i, n: Integer;
  Node: TTreeNode;
  P: PMyNode;
begin
  if FileExists(AFileName) = True then
  begin
    SL1 := TStringList.Create;
    try
      SL1.LoadFromFile(AFileName); // ブックマークは、
      intLevelB := 0; // ノードの階層レベル,タイトル,URL
      Node := nil; // の形式で格納してある。
      for i := 0 to SL1.Count - 1 do
      begin
        strLine := SL1.Strings[i];
        intA := Pos(',', strLine);
        for n := Length(strLine) downto 1 do
        begin
          if strLine[n] = ',' then
          begin
            intB := n;
            Break;
          end;
        end;
        try
          intLevelA := StrToInt(Copy(strLine, 1, intA - 1));
        except
          on EConvertError do
          begin
            ShowMessage('ブックマークの読み込みに失敗しました。');
            Exit;
          end;
        end;
        // 読み込んだ設定ファイルをFolderに反映
        strTitle := Copy(strLine, intA + 1, intB - intA - 1);
        New(P);
        P^.URL := Copy(strLine, intB + 1, Length(strLine) - intB);
        Node := TreeView1.Items.AddObject(Node, strTitle, P);

        if intLevelB > intLevelA then
        begin
          intLevelB := intLevelA;
          while Node.Level > intLevelA do
          begin
            Node.MoveTo(Node.Parent, naAdd);
            //この部分
          end;
        end
        else if intLevelB < intLevelA then
        begin
          Node.MoveTo(Node.GetPrev, naAddChild);
          intLevelB := intLevelA;
          //この部分
        end;
      end;
      // TreeView1.FullCollapse;
      //この部分
    finally
      SL1.Free;
    end;
  end;
end;

//

procedure TForm1.FormCreate(Sender: TObject);
begin
  TreeView1.Tag := 0;
  LoadBookMark('Book.txt');
end;

//

procedure TForm1.Button1Click(Sender: TObject);
begin
  if TreeView1.Tag=0 then
  begin
    TreeView1.FullCollapse;
    TreeView1.Tag := 1;
  end
  else
  begin
    TreeView1.FullExpand;
    TreeView1.Tag := 0;
  end;
end;

なんて試してみましたが、開いた状態になっていると思いますよ。
SL1.LoadFromFile('BookMark.txt');
Book.txt の中身


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加