De acuerdo a lo que entiendo, si el valor ingresado en el TextBox del nombre del proyecto ya existe en la tabla Proyectos, no se debe permitir que se agregue (aunque podría dar lugar a una edición ó modificación de los restantes valores: dirección y estado.)
Para saber si el proyecto ya está incluido se ejecuta una búsqueda.
Alternativas:
1) Busqueda secuencial (tablas no indexadas ó campo de búsqueda no indexado)
Objeto: thisform.pageframe1.proyecto.txtNom_pr
Evento Valid
IF !EMPTY(THIS.VALUE)
SELECT PROYECTO
&& Se establece una búsqueda exacta en la tabla para lo cual eliminamos blancos inicial y final
LOCATE FOR ALLTRIM(Nom_pr)==alltrim(this.value)
IF FOUND() && El nombre de proyecto ya está en la tabla Proyecto
Messagebox("Nombre de Proyecto ya grabado")
THIS.VALUE="" && Limpia el valor del TextBox
RETURN 0 && Logra que el cursor vuelva al Textbox para ingresar otro nombre
ENDIF
ENDIF
2) Búsqueda Indexada
Supone que hay una etiqueta de índice sobre el campo Nom_Pr de la tabla PROYECTO.
Por ejemplo, se hubiera creado INDEX ON nom_pr TAG iNom_Pr
Objeto: thisform.pageframe1.proyecto.txtNom_pr
Evento Valid
IF !EMPTY(THIS.VALUE)
IF INDEXSEEK(Alltrim(This.Value),.F.,"PROYECTO","INOM_PR")
&& Indexseek() en este caso, no mueve el puntero de la tabla y no necesita estar seleccionada
&& Si devuelve Verdadero, el proyecto ya fue incluido en la tabla.
Messagebox("Nombre de Proyecto ya grabado")
THIS.VALUE="" && Limpia el valor del TextBox
RETURN 0 && Logra que el cursor vuelva al Textbox para ingresar otro nombre
ENDIF
ENDIF
El evento Valid sucede justo antes del Evento Lostfocus, lo que permite realizar la validación correctamente.
En el evento LostFocus se puede habilitar o no el botón de "Grabar" ó similar donde tenés el código que remitiste.
Por ejemplo
Thisform.PageFrame1.Proyecto.CmdGrabar.Enabled=!empty(this.value)
Sugerencias:
1) LENC() se utiliza para Strings de doble bytes. Si escribimos en castellano, inglés, italiano, etc., esta función equivale a LEN()
2) En lugar de determinar si la cadena tiene tamaño Cero [ if Len(cString)=0 ], te sugiero:
if Empty(cString) ó CASE Empty(cString)
3) Guardar los valores en la Tabla. Puedes ahorrarte el Trim(). Incluso puedes colocar las referencias a los objetos directamente dentro de la cláusula VALUES (Thisform.... )
Esta escritura es igualmente eficiente y mucho más legible (además es más rápida porque hay solo una búsqueda de referencia de objeto).
With Thisform.PageFrame1.Proyecto
prNombre =.txtNom_pr.value
prDireccion=.txtDir_pr.Value
prEstado=.txtEstado_pr.Value
ENDWITH
INSERT INTO inventarioA!proyecto (nom_pr, dir_pr, estado_pr) ;
VALUES (prNombre,prDireccion,prEstado