А вообще какие шаблоны, тут надо f: ()->string. Возвращать надо именно string, потому что, к примеру, при вводе числа - можно поставить пробелы слева и справа от числа при вводе. Тогда получится что ввели больше символов, чем надо чтоб представить это число после .ToString .
И аргументы f тут ни к чему, вы же пишете не инвоук для вызова между доменами.
TryRead тут не сработает, раз число нельзя вводить напрямую. Но если нужна проверка ввода - то её надо делать ручками:
procedure Backspace(f: ()->string);
begin
//ToDo
end;
begin
Backspace(()->
begin
while true do
begin
Result := ReadString;
if Result.All(ch->ch.IsDigit or char.IsWhiteSpace(ch)) then
break;
Writeln('Повторите ввод');
end;
end);
end.
ReadLexem имеет алгоритм, оптимизированный на потоки данных (System.IO.Stream) и привязанный к потоку ввода. Можно перенаправить весь поток ввода на строку в памяти (в том числе временно).
Но это скорее костыли, потому что если вам надо вытащить слово из строки - надо использовать методы работы со строками, а не пытаться прикрутить методы работы с потоками. Тогда код будет и эффективнее, и проще:
##
var ind := 1;
var s := ReadString;
while ind<>s.Length do
s.ReadWord(ind).Println;
Проблема появляется, только если подключить GraphWPF. У меня всё работает только в окне IDE. Как только ввод направляется прямо из окна консольного приложения, так сразу вылетает исключение. (Кстати, исключение можно не заметить, если не вызвать запись в окно консоли, поскольку запрос на ввод числа и последующее исключение не вызывают выделения консольного окна.)
Как в PascalABC.NET использовать EventHandler, а именно: события public event SpeakStarted, SpeakCompleted, SpeakProgress, BookmarkReached, VoiceChange, PhonemeReached, VisemeReached, StateChanged в unit Speech, namespace System.Speech.Synthesis?
type
t1 = class
event ev: procedure(o: object; e: System.EventArgs);
procedure CallEv;
begin
var ev := ev;
if ev<>nil then ev(self, new System.EventArgs);
end;
end;
begin
var a := new t1;
a.ev += (o,e)->Writeln('Ивент вызван');
a.CallEv;
end.
EventHandler объявлен так:
type EventHandler = procedure(o: object; e: System.EventArgs);
Но, обратите внимание, это не синоним типа, а объявление нового типа делегата.
Разница в том, что typeof(EventHandler) = typeof(EventHandler), потому что это 2 обращения к одному и тому же типу.
А каждый раз как вы пишете тип procedure(o: object; e: System.EventArgs) - вы создаёте новый анонимный тип делегата.
Ну, вы как бы отреагировали… И в ответ ничего не сделали. Я в своём примере сделал чтоб на консоль выводило строку в момент вызова, чтоб было визуально заметно когда ивент вызывается…
А если вы пытались сделать минимальный пример - лучше (o,e)->exit(), немного короче получается.