FullCollapseを呼び出さないとTreeViewの内容が表示されない

解決


るるとん@K  2004-06-08 05:38:33  No: 9338

何故なのでしょうか?


るるとん@K  2004-06-08 05:42:55  No: 9339

普通は表示されますよね?
ソースはこんな感じです
function NodeNode(Node1,Node2:TTreeNode):string;
begin
if Assigned(Node2) then begin
if Node1.Level>Node2.Level then result:='<' else
if Node1.Level<Node2.Level then result:='>' else
result:='=';
end;
end;

function MakeNode(Str:String;Node:TTreeNode):TTreeNode;
var
N:TTreeNode;
P:PBookMarkItem;
begin
Str:=C_FtoU(Str);
if Ansipos(#13#10,Str)>0 then
begin
New(P);
P^.URL:=CSRight(Str,#13#10);
N:=Main.TagTreeView.Items.AddObject(Node,Thebsys.CSLeft(Str,#13#10),P);
end
else
begin
N:=Main.TagTreeView.Items.AddObject(Node,Str,nil);
end;
N.MoveTo(Node,naAddChild);
result:=N;
end;

procedure TMain.WriteT();
var
i:integer;Node1,Node2:TTreeNode;
TagFile:string;
SL1:TStringList;
begin
if TagTreeView.Items.Count>0 then
begin
  tagfile := FPath+TemplateFile;
  SL1 := TStringList.Create;
  try
Node1:=nil;
Node2:=nil;
for i:=0 to TagTreeView.Items.Count-1 do
begin
Node1:=TagTreeView.Items[i];
if i>0 then SL1.Add(NodeNode(Node1,Node2));
SL1.Add(C_UtoF(Node1.Text));
if Assigned(Node1.Data) then SL1.Add(C_UtoF(PBookMarkItem(Node1.Data)^.URL));
Node2:=Node1;
end;
if Node1.Level>0 then SL1.Add('>') else SL1.Add('=');
    SL1.SaveToFile(tagfile);
  finally
    SL1.Free;
  end;
end;
end;

procedure TMain.ReadT();
var
tagfile:string;
i:integer;
Node:TTreeNode;
SL1:TStringList;
Str:string;
begin
TagTreeView.Items.BeginUpdate;
  tagfile := FPath+TemplateFile;
  if FileExists(tagfile) = True then
  begin
    TagTreeView.Items.Clear;
    SL1 := TStringList.Create;
    try
      SL1.LoadFromFile(tagfile);
TagTreeView.Items.Clear;
Node:=nil;
for i:=0 to SL1.Count-1 do
begin
if ansipos('<',SL1[i])=1 then begin Node:=MakeNode(CSRight(Str,#13#10),Node); Str:=''; end else
if ansipos('>',SL1[i])=1 then begin MakeNode(CSRight(Str,#13#10),Node); Node:=(Node.Parent); Str:='' end else
if ansipos('=',SL1[i])=1 then begin MakeNode(CSRight(Str,#13#10),Node); Str:='' end else
Str:=Str+#13#10+SL1[i];
end;
    finally
      SL1.Free;
      TagTreeView.FullCollapse;
      TagTreeView.Items.EndUpdate;
    end;
    end;
end;

function C_FtoU(s:string):string;
begin
s:=StringReplace(s,'&eq','=',[rfReplaceAll]);
s:=StringReplace(s,'&rg;','<',[rfReplaceAll]);
s:=StringReplace(s,'&lf;','>',[rfReplaceAll]);
s:=StringReplace(s,'&ad;','&',[rfReplaceAll]);
result:=s;
end;

function C_UtoF(s:string):string;
begin
s:=StringReplace(s,'&;','&ad',[rfReplaceAll]);
s:=StringReplace(s,'=','&eq',[rfReplaceAll]);
s:=StringReplace(s,'<','&rg;',[rfReplaceAll]);
s:=StringReplace(s,'>','&lf;',[rfReplaceAll]);
result:=s;
end;
//お願いします


つっか  2004-06-08 09:50:55  No: 9340

そんな長大なコードを付けられても試したくありませんね。第一、関数やメソッド
ばかりで、イベントハンドラがないので一つも実行されませんし。
質問をするなら現象を再現する最小なコードを示してください。


sss  2004-06-08 10:20:02  No: 9341

どうせ

      TagTreeView.FullCollapse;

この一行を書きたくない、とかのどうでもいい質問なんでしょう?


るるとん@K  2004-06-09 01:14:03  No: 9342

すみませんでした
何故か、BeginUpdateをなくすとFullCollapse無しでも表示されます
ファイルが存在すれば、EndUpdateは実行されるはずなのに..


るるとん@K  2004-06-09 01:32:24  No: 9343

FullCollapseのかわりにShowMessage('');を書くと、表示されます
      SL1.Free;

      TagTreeView.Items.EndUpdate;
の間に、時間のかかる処理?がいるのでしょうか?


るるとん@K  2004-06-09 01:36:53  No: 9344

間違いました、未解決です


通りすがり  2004-06-09 01:45:54  No: 9345

るるとん@Kさん、BeginUpdateとEndUpdateの使い方が違いますよ。
EndUpdateだけをif文の中にを入れてはいけません。
BeginUpdateとEndUpdateは対にならなければ。

インデントされていないコードを貼り付けるのはお互いにやめませんか?
コードを読む人のことを考えましょう。


るるとん@K  2004-06-09 01:52:44  No: 9346

これでも同じです
procedure TMain.ReadT();
var
tagfile:string;
i:integer;
Node:TTreeNode;
SL1:TStringList;
Str:string;
begin
  tagfile := FPath+TemplateFile;
  if FileExists(tagfile) = True then
  begin//ファイルがあれば
    SL1 := TStringList.Create;
    try
    TagTreeView.Items.BeginUpdate;
    TagTreeView.Items.Clear;
    SL1.LoadFromFile(tagfile);
Node:=nil;
for i:=0 to SL1.Count-1 do
begin
if ansipos('<',SL1[i])=1 then begin Node:=MakeNode(CSRight(Str,#13#10),Node); Str:=''; end else
if ansipos('>',SL1[i])=1 then begin MakeNode(CSRight(Str,#13#10),Node); Node:=(Node.Parent); Str:='' end else
if ansipos('=',SL1[i])=1 then begin MakeNode(CSRight(Str,#13#10),Node); Str:='' end else
Str:=Str+#13#10+SL1[i];
end;
    finally
ShowMessage('');
    TagTreeView.Items.EndUpdate;
    SL1.Free;
    end;
    end;//ファイルがあれば
end;


通りすがり  2004-06-09 02:02:09  No: 9347

どうしてBeginUpdateがtry〜finallyの中に入っているんですか?
それともう一度書いておきますが、
インデントされていないコードを貼り付けるのはお互いにやめませんか?
コードを読む人のことを考えましょう。


るるとん@K  2004-06-09 02:11:21  No: 9348

すみませんでした
BeginUpdateもEndUpdateも一番外側にして見ましたが、同じでした
EndUpdateの前にダイアログをだしたりすると、上手くいきます


jok  2004-06-09 02:17:38  No: 9349

> EndUpdateの前にダイアログをだしたりすると、上手くいきます

メッセージ処理が止まってるんですね。Application.ProcessMessages; でも
うまくいくんじゃないの。ま、すなおに FullCollapse 実行するのが一番。


るるとん@K  2004-06-09 02:22:10  No: 9350

>Application.ProcessMessages;
でうまくいきました
皆様有難う御座いましたn(_ _)n
>すなおに FullCollapse 実行するのが一番。
Expandedも読み込みたかったので


Q  2004-06-09 23:48:14  No: 9351

>BeginUpdateもEndUpdateも一番外側にして見ましたが、同じでした

なんだか通りすがりさんの言ってることを勘違いしてるようですね。
try〜finallyの中にBeginUpdateがある場合、
BeginUpdateを呼び出す前に例外が発生しても、
EndUpdateを呼び出すようになります。
BeginUpdateがtry〜finallyの中の一番最初にあったとしても
BeginUpdateはtry〜finally文より前に書くべきです。
「Createしたら必ずFree」の場合と同じ並べ方がいいと思います。


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

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






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