De este modo sólo debes dejar el caFree, lo otro sobra.
Código:
procedure TFrmVentasClienteExpress.FormClose(Sender: TObject;var Action: TCloseAction);
begin
Action := caFree;
// FrmVentasClienteExpress := Nil;
// FrmVentasClienteExpress.Free;
end;
Y esto también es correcto, yo lo uso cuando necesito coger el valor de alguna variable o dato del form que se está cerrando... PERO, no uses caFree en el form frmVentasclienteExpress porque estarías igualmente liberando con free y poniendo a nil algo que ya no existe, debes usar, por ejemplo, caHide, esto te oculta el form y luego lo liberas tal y como haces o con freeandnil
Código:
If not Assigned(FrmVentasClienteExpress) then
FrmVentasClienteExpress := tFrmVentasClienteExpress.Create(Self);
Try
FrmVentasClienteExpress.ShowModal; // <-- en ese form no uses caFree, usa caHide
finally
FrmVentasClienteExpress.Free;
FrmVentasClienteExpress := Nil;
end;