何故なのでしょうか?
普通は表示されますよね?
ソースはこんな感じです
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;
//お願いします
そんな長大なコードを付けられても試したくありませんね。第一、関数やメソッド
ばかりで、イベントハンドラがないので一つも実行されませんし。
質問をするなら現象を再現する最小なコードを示してください。
どうせ
TagTreeView.FullCollapse;
この一行を書きたくない、とかのどうでもいい質問なんでしょう?
すみませんでした
何故か、BeginUpdateをなくすとFullCollapse無しでも表示されます
ファイルが存在すれば、EndUpdateは実行されるはずなのに..
FullCollapseのかわりにShowMessage('');を書くと、表示されます
SL1.Free;
と
TagTreeView.Items.EndUpdate;
の間に、時間のかかる処理?がいるのでしょうか?
間違いました、未解決です
るるとん@Kさん、BeginUpdateとEndUpdateの使い方が違いますよ。
EndUpdateだけをif文の中にを入れてはいけません。
BeginUpdateとEndUpdateは対にならなければ。
インデントされていないコードを貼り付けるのはお互いにやめませんか?
コードを読む人のことを考えましょう。
これでも同じです
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;
どうしてBeginUpdateがtry〜finallyの中に入っているんですか?
それともう一度書いておきますが、
インデントされていないコードを貼り付けるのはお互いにやめませんか?
コードを読む人のことを考えましょう。
すみませんでした
BeginUpdateもEndUpdateも一番外側にして見ましたが、同じでした
EndUpdateの前にダイアログをだしたりすると、上手くいきます
> EndUpdateの前にダイアログをだしたりすると、上手くいきます
メッセージ処理が止まってるんですね。Application.ProcessMessages; でも
うまくいくんじゃないの。ま、すなおに FullCollapse 実行するのが一番。
>Application.ProcessMessages;
でうまくいきました
皆様有難う御座いましたn(_ _)n
>すなおに FullCollapse 実行するのが一番。
Expandedも読み込みたかったので
>BeginUpdateもEndUpdateも一番外側にして見ましたが、同じでした
なんだか通りすがりさんの言ってることを勘違いしてるようですね。
try〜finallyの中にBeginUpdateがある場合、
BeginUpdateを呼び出す前に例外が発生しても、
EndUpdateを呼び出すようになります。
BeginUpdateがtry〜finallyの中の一番最初にあったとしても
BeginUpdateはtry〜finally文より前に書くべきです。
「Createしたら必ずFree」の場合と同じ並べ方がいいと思います。
ツイート | ![]() |