Monchito_elroro, estás bastante cerca, simplemente estás mirando la función equivocada. El asunto es que si se puede prescindir de la Ñ no hace falta la artimaña de evaluar el valor de c para determinar a que posición dentro de CHARS corrresponde para obtener el carácter aleatorio que ha sido necesaria armar para este caso tan particular. Mi primer código, que no trabaja con Ñ tiene un pequeño defecto en calcular la posición, pero puede corregirse fácilmente:
Sabiendo que tenemos 26 letras (no contamos la Ñ) y 10 números, sabemos entonces que los números aleatorios deben ir desde 1..36. El "problemita" es que Random(Nro) nos genera números en el rango 0..Nro - 1.
Tenemos que hacer que para un número R aleatorio, R := Random(algo) se corrresponda con una posición P válida de carácter. Entonces:
R = 0, -> P = 1
R = 1, -> P = 2
...
R = Maximo, -> P = 36
Sabiendo entonces que si P resulta ser R + 1, el máximo valor que puede tener R será P - 1 = 36 - 1 = 35.
Entonces el rango de valores aleatorios que debemos conseguir debe ser 0..35 de allí que Random(36).
Ahora efectivamente ya con esto en mente es que podemos hacer CHARS[Random(36) + 1] pero mi código original terminaba haciendo una operación equivalente a esto: CHARS[Random(37)] que no es lo mismo.
Haciendo esta simple corrección a mi 1ra propuesta tiene (y estoy completamente seguro) que funcionar sin problema alguno:
function TForm1.RandomStringsKeys(KeysCount, KeysLength: integer;
Separator: char): string;
const
CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
var k, l: integer;
rnd: string;
begin
rnd := '';
for k := 1 to KeysCount do
begin
for l := 1 to KeysLength do
rnd := rnd + CHARS[Random(36) + 1];
if k <> KeysCount
then rnd := rnd + Separator;
end;
result := rnd;
end;
Saludos,