以下はTTreeViewのあるノードの階層化のノードをすべてソートするためのものですが
自前のソートを使った場合うまくいきません。ノードをスワップしているところがまず
いのでしょうか?
procedure ChildNodeSort(Node: TTreeNode;);
var
 gap,width,i,j :Integer;
 dmy      :TTreeNode;
begin
 if Node.GetFirstChild <> Nil then
  for j := 0 to Node.Count-1 do ChildNodeSort(Node.Item[j]);
 //Node.AlphaSort; や Node.CustomSort(@CustomSortProc, 0); ならもちろんOK!
 gap := Node.Count-1;  //ShellSort(昇順)
 while gap > 0 do
 begin
  gap := gap div 2;
  width := Node.Count-1-gap;
  for i := 0 to width do
  begin
   j := i;
   while j >= 0 do
   begin
    CompareStr(Node[j].Text,Node[j+gap].Text) <= 0 then break;
    dmy := Node[j];  Node[j] := Node[j+gap];  Node[j+gap] := dmy; //これがまずい?
    j := j-gap;
   end;
  end;
 end;
end;