Seja bem vindo Edu a nossa comunidade !
Já que você pediu duas vezes opinião sobre o seu código, eu tenho para aconselhar mais sobre o método que você deve empregar. É importante que você mantenha uma programação com mais ordem e padronização que certamente irá ajudar-lhe ao longos dos anos, seja para você mais tarde rever os seus códigos como outros poderem entender-los com maior facilidade. Começa com a indentação dos laços de repetição (Do While, For.., Do Case, If..), sobre os nomes das variáveis que possam saber com a nomenclatura se elas são do tipo (numérico, caracter, lógico, data, memo, CONSTANTES, vetores, etc.), como já disse o nosso amigo Jairo. Depois ter em mente que apartir do Clipper 5, surgiu a característica de funções, retorno, parâmetros, isto é, passou a ser mais Function do que módulo prg. O que eu quero dizer, é que quanto você mais consiga definir e desmembrar cada necessidade, cada função, cada tipo de processamento... melhor. Deixe o conceito de fazer tudo num PRG só. Faça mais funções. Elas irão ajudar a diminuir o seu código, deixar mais enxuto e de processamento mais rápido também. Outra coisa, deixe sempre o seu programa de forma amigável com o usuário. Não faça perguntas ao usuário em demasia ou repetitivo, deixe o seu programa inteligente. Essa questão deseja sair ? Na minha opinião não deveria fazer. Deixe no rodapé da tela, dito que pressionando ESC sai do programa.
Não entendi o que você quer com esse seu código. Se você quer cadastrar ou validar. Pois bem, como já disse, tá ai, faça uma função que apenas valide e outra para cadastrar. Se para cadastrar, você precisa validar a pessoa que irá fazer a inclusão do usuário com nome e senha, então chame uma função que apenas obtenha essas informações (nome e senha) e depois valide. Uma vez sabendo se a pessoa tem direitos administrativos para inclusão de novos usuários, chame outra vez a função que irá obter o novo nome e a nova senha. Logo verifique se já não existe, dando uma mensagem ou saindo da inclusão.
Se você tem sempre mais do que um usuário a cadastrar, utilize o TBrowse. Imagine uma tela com colunas: nome e senha (claro que oculta, com asteriscos). Fica mais ágil e com maior visibilidade.
Eu estimulo você a refazer o seu código, visando o desdobramento de funções. Mas se decidir deixar como está, eu tenho algumas observações a fazer:
1. A abertura de arquivo USUARIO, isto é, senhas. Linhas 11 a 18. Deixe assim:
Código: Selecionar todos
SELECT 1
USE USUARIO
If !File("INDIC3.NTX")
INDEX ON LOGIN TO INDIC3
Endif
SET INDEX TO INDIC3
// USE USUARIO INDEX INDIC3
// SELECT 1
// SET ORDER TO 1
Se o seus sistema não for rodar em rede, até pode ficar assim, Mais seria conveniente que você faça a abertura de forma compartilhada (uso do Shared New) e o tratamento de bloquear registro quando é gravado. Você estava sempre criando o arquivo de índice, o que é desnecessário se você mantém ele aberto e atualizado.
2. Sobre os SAYs e DECLARE dos vetores dentro de um laço de repetição (neste caso dentro do Do While), na minha opinião, estão desnecessários. Lembre, "laço de repetição" irá repetir N vezes o que poderia ter sido feito apenas uma vez, o que ocuparia mais lixo de memória, mais interrupções de vídeo. Para mim totalmente desnecessário.
3. Você tem um DO MENU, dentro desse do while. Se a questão era apresentar uma janelinha para validar e cadastrar um ou mais usuários, você a exibe, valida e grava e depois retornar ao menu. A utilização dos recursos de funções é fundamental para que o seu código não vire uma linguiça.
4. Sobre gravar as senhas, evidentemente que é necessário. Para evitar que espertinhos possam descobrir senhas editando o seu arquivo USUARIO.DBF então seria melhor encriptar as senhas e até mesmo o nome do usuário. Aqui no fórum tem exemplo de encriptação, veja este do Sr. Toledo:
https://pctoledo.org/forum/fileba ... t=s&page=1 ou pode utiliza a função MD5 que o Maligno mencionou.