function DoNodeVisit(Node: IGMTreeable): Boolean;
  begin
    Result := True;
    while (Node <> nil) and Result do
     begin
      Result := AVisitFunc(Node, AParameter);
      if ARecurse and Result then Result := DoNodeVisit(Node.FirstChild);
      Node := Node.NextSibling;
     end;
  end;