Oki doki.
Al Edit le pones MaxLength a 1 y listo, solo permites una letra. Tambien le pones Charcase := ecUppercase y solo escribe en mayúsculas. Ya puedes usar el StrScan como te comenté.
El no responder a Resp.Clear, es precisamente porque lo haces dentro del evento KeyPress. Ten en cuenta que en ese evento puedes modificar por código la tecla pulsada, por tanto, aún no ha sido procesada, y por tanto no está en Resp.Text, solo cuando termine el evento, es cuando el carácter estará en Resp.Text (el carácter que pulsó el usuario, o el que tú has modificado por código).
La solución es bien fácil, en lugar de usar Resp.Text, usamos el parámetro Key.
Código Delphi
[-]
procedure TEvaRes.RespKeyPress(Sender: TObject; var Key: Char);
var
res : string;
begin
aux := inttostr(i);
if (i < 10) then Result.Text := concat('00',aux);
if (i >= 10) and (i < 100) then Result.Text := concat('0',aux)
else Result.text := aux;
Resp.SetFocus;
if strScan('ABCDEFGHV',key) <> nil begin
TTemporal.Append;
TTemporal.FieldByName('Pregunta').AsString := inttostr(i);
res := key; TTemporal.FieldByName('Respuesta').AsString := res; TTemporal.Post;
i := i + 1;
end
else Key := #0;
if i > 159 then
begin
tcp := 0;
tda := 0;
tcu := 0;
TRelacion.First;
TTemporal.First;
for j := 1 to (i - 1) do
begin
if TRelacion.FieldByName('Resultado').AsString = TTemporal.FieldByName('Respuesta').AsString then
begin
if TRelacion.FieldByName('Grupo').AsString = 'C' then tcp := tcp + 1;
if TRelacion.FieldByName('Grupo').AsString = 'A' then tda := tda + 1;
if TRelacion.FieldByName('Grupo').AsString = 'D' then tcu := tcu + 1;
end;
TRelacion.Next;
TTemporal.Next;
end;
tot := tcp + tda + tcu;
Resp.Enabled := False;
end;
end;
Obviamente queda hacer un Resp.Clear, pero como dije, no puede hacerse en este evento. Podría añadir Key := #0 despues de hacer el i:=i+1, pero el usuario no vería la tecla en el edit, daría la impresión de que no la acepta. Es mejor buscar otro lugar donde Hacer el Resp.Clear.
Saludos