Lazarus - последовательное воспроизведение файлов .wav

Я делаю программу преобразования числа в речь. У меня есть все записанные и работающие образцы голоса, но каждый раз, когда на входе есть числа в последовательном порядке (012 ... и т. Д.), Он начинает воспроизводить остальные числа до 9 против ввода.

Например, если набрать 24601, будет сказано:

2..4..6..0..1 .. 2..3..4..5..6..7..8..9..0 ..

Так не должно быть. Он даже заменит оставшиеся числа в последовательности, если они есть.

Полный код: http://pastebin.com/vFfBRYUu

Вот блок кода оскорбления. Если понадобятся оставшиеся части, я их выложу:

procedure TForm1.Button1Click(Sender: TObject);
begin
  for i := 0 to Length(input.Text) do
  begin
    case var1[i] of
     '0': PlaySound('zero.wav',0,SND_SYNC);
     '1': PlaySound('one.wav',0,SND_SYNC);
     '2': PlaySound('two.wav',0,SND_SYNC);
     '3': PlaySound('three.wav',0,SND_SYNC);
     '4': PlaySound('four.wav',0,SND_SYNC);
     '5': PlaySound('five.wav',0,SND_SYNC);
     '6': PlaySound('six.wav',0,SND_SYNC);
     '7': PlaySound('seven.wav',0,SND_SYNC);
     '8': PlaySound('eight.wav',0,SND_SYNC);
     '9': PlaySound('nine.wav',0,SND_SYNC);
     '-': Delay(400);
     '&': PlaySound('start.wav',0,SND_SYNC);
     '*': PlaySound('call to mess.wav',0,SND_SYNC);
    end;

    Delay(100);
end;                     

Вход в массив:

procedure TForm1.inputChange(Sender: TObject);
begin
  y := y+1;
  var1[y-1] := input.Text[y]
end;             

person Soprano Aurora    schedule 15.01.2015    source источник
comment
Откуда взялся y? Где вы устанавливаете и обновляете длину var1?   -  person Kromster    schedule 15.01.2015
comment
@KromStern y - целое число, используемое для подсчета. Он увеличивается каждый раз при изменении ввода, чтобы новый символ ввода можно было разместить в новой записи массива. Длина var1 не имеет значения. Это просто массив, а Length(input.Text); - длина. Кроме того, более крупный блок кода активируется только после того, как пользователь завершил набор текста.   -  person Soprano Aurora    schedule 15.01.2015
comment
Если вы добавляете в TextLength символов к var1, но всегда воспроизводите элементы 0..TextLength ... как вы думаете, это может быть вашей ошибкой? ;-)   -  person Kromster    schedule 15.01.2015
comment
Я предполагаю, что input.text - это строка. Тогда в целом было бы разумно начинать с 1.   -  person Marco van de Voort    schedule 15.01.2015
comment
@SopranoAurora: Пожалуйста, не меняйте / не обновляйте вопрос, кроме как сделать его более ясным / точным. Это сайт вопросов и ответов, и вопрос предназначен для того, чтобы быть самодостаточным и помочь другим людям, у которых есть похожие проблемы, независимо от развития вашей программы.   -  person Kromster    schedule 17.01.2015


Ответы (1)


Кажется, что переменная y никогда не сбрасывается, что означает, что вы добавляете текст в var1. Но вы проигрываете длину текста элементов из var1, всегда начиная с элемента 0.

Input Text | Stored text        | Played text

0123         0123                 0123
876          0123876              012
12345678     012387612345678      01238761
111          012387612345678111   012

Похоже на ошибку.

Также есть ряд ошибок:

  • Поскольку он всегда воспроизводит слишком много чисел, input.Text длина не сбрасывается должным образом
  • Вы перебираете input.Text, но играете с переменной var1. Вы должны всегда выполнять итерацию и получать доступ к одному и тому же массиву / строке!
  • Цикл должен быть for i := 1 to Length(input.Text) do, если вы перебираете строку
  • Опираясь на скрытое знание начальной позиции текста в var1
  • Возможно, это просто ваш пример, но вы не закрыли цикл for с помощью end;
  • Бессмысленные / не говорящие имена переменных
  • Форматирование (я исправил это в вашем вопросе, проверьте пожалуйста)

Вы также можете выполнить некоторую отладку самостоятельно, чтобы изолировать ошибку, выводя var1 для отображения перед "озвучиванием". Например. автор: ShowMessage(var1) или аналогичный;

person Kromster    schedule 15.01.2015
comment
Ой, извини. Я забыл упомянуть, что var1 - это отдельный блок кода, используемый для ввода массива символов. Я добавлю это. - person Soprano Aurora; 15.01.2015
comment
Пожалуйста, проверьте и добавьте это, потому что это, кажется, причина ошибки. - person Kromster; 15.01.2015
comment
@SopranoAurora: добавлено. - person Kromster; 15.01.2015
comment
Переменная y не должна сбрасываться. Это для индексации новых входных данных в массив var1. i используется в основном блоке кода как счетчик. - person Soprano Aurora; 15.01.2015
comment
@SopranoAurora: Если вы настаиваете на этом, тогда цикл должен быть for i := y to y + Length(Input.Text). Кстати, это ужасный дизайн - использовать так много переменных, взаимозаменяемых друг с другом. - person Kromster; 15.01.2015
comment
Думаю, я здесь немного расплывчатый ... извините за это. Если вам нужно увидеть весь код, он находится здесь: pastebin.com/vFfBRYUu. - person Soprano Aurora; 15.01.2015
comment
@SopranoAurora: Я обновлю свой ответ, чтобы определить ошибку в вашем коде. Если вы хотите обсудить свой код, мы, возможно, сможем сделать это в Skype. кромстер80 - person Kromster; 15.01.2015