|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Эффект печатной машинки
привет. помогите с задачей. нужна программка, имитирующая набор текста. проблема в том, что должен быть не только набор текста, но и стирание. отдельно с набором проблем нет. отдельно со стиранием тоже. но вот реализовать это вместе не получается. таймеры срабатывают одновременно...
|
#2
|
||||
|
||||
А где же ваш код чтоб его править? Показывайте
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AArtem (07.03.2014)
|
#3
|
|||
|
|||
Код:
unit UReal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, MMSystem; type TForm1 = class(TForm) Memo1: TMemo; Timer1: TTimer; Button1: TButton; Label1: TLabel; Button2: TButton; Button3: TButton; Timer2: TTimer; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public procedure Pechataem(slovo:string); procedure Stiraem(sim:integer); { Public declarations } end; var Form1: TForm1; n,i,num: integer; s,str: string; slovo: string; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin n:=0; slovo:='кусок текста'; Timer1.Enabled:=true; end; procedure TForm1.Button2Click(Sender: TObject); begin i:=0; num:=5; Timer2.Enabled:=True; end; procedure TForm1.Pechataem(slovo: string); begin Inc(n); if n<=length(slovo) then begin Memo1.Text:=Memo1.Text+slovo[n]; Timer1.Interval:=100 + Random(100); end else Timer1.Enabled:=false; end; procedure TForm1.Stiraem(sim: integer); begin if i<=sim then begin str:=Memo1.Text; Delete(str,length(str),i); Timer2.Interval:=100 + Random(50); Memo1.Text:=str; Inc(i); end else Timer2.Enabled:=false; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Pechataem(slovo); end; procedure TForm1.Timer2Timer(Sender: TObject); begin Stiraem(num); end; end. тут вызов только по кнопкам. как сделать так, чтобы ввести последовательное количество фрагментов текста и количества стираемых символов, в массив, например, и программа последовательно печатала фрагменты и удаляла символы? может непонятен смысл всего этого... имитация набора текста с ошибками. допускается ошибка, стираются символы, ввод текста продолжается. подскажите хотя бы в каком направлении думать Последний раз редактировалось AArtem, 06.03.2014 в 22:32. |
#4
|
||||
|
||||
С небольшими доработками тоже самое
Код:
unit UReal; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, MMSystem; type TForm1 = class(TForm) Memo1: TMemo; Timer1: TTimer; Button1: TButton; Button2: TButton; Timer2: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public procedure Pechataem(slovo:string); function Stiraem(sim:integer): boolean; { Public declarations } end; var Form1: TForm1; n,i,cnt: integer; str: string; slv: array[0..9] of string = ('vereteno','koleso','plug','topor','domkrat', 'ressora' ,'vagon' ,'led' ,'grot' ,'plot'); ers: array[0..9] of integer =(2, 4, 1, 3, 4, 2, 1, 1, 2, 1); flg: boolean; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Clear; cnt:= 0; n:= 0; Timer1.Enabled:= true; flg:= true; end; procedure TForm1.Pechataem(slovo: string); begin Inc(n); if n<=length(slovo) then begin Memo1.Text:=Memo1.Text + slovo[n]; Timer1.Interval:=100 + Random(100); end else begin n:=0; flg:=false; end; end; function TForm1.Stiraem(sim: integer): boolean; begin Result:= false; if i<=sim then begin str:=Memo1.Text; Delete(str,length(str),i); Timer1.Interval:=100 + Random(50); Memo1.Text:=str; Inc(i); end else begin Result:= true; i:=0; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if flg then Pechataem(' ' + slv[cnt]) else if Stiraem(ers[cnt])then begin inc(cnt); if cnt = 10 then cnt:= 0; flg:= true; end; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled:= false; end; end. Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AArtem (07.03.2014)
|
#5
|
|||
|
|||
спасибо огромное. то, что надо... а то я уже в сторону sleep начал делать
а как можно паузу сделать по больше между набором и стиранием. чето у меня не получается... ...и можно ли сделать перевод строки? Последний раз редактировалось AArtem, 07.03.2014 в 00:27. |
#6
|
||||
|
||||
Опа, оказывается-то ТЗ поменялось, нужно уже ашипки чтоб исправляло, тогда ещё вариант, только едит на форму киньте - в нём будет слово для "издевательств"
Код:
type TForm1 = class(TForm) Memo1: TMemo; Timer1: TTimer; Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public procedure Pechataem(s:string); function Stiraem(sim:integer): boolean; { Public declarations } end; var Form1: TForm1; n,i: integer; str: string; slovo,dovesok: string; flg,flt: boolean; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i: integer; fb: boolean; begin fb:=false; Slovo:=''; Dovesok:=''; // пример ввода в едит, после | идёт вариант исправления // Edit1.Text:= 'Veretino|eno'; for i:=1 to Length(Edit1.Text) do begin if Edit1.Text[i] = '|' then fb:= true; if fb then begin if Edit1.Text[i] <> '|' then Dovesok:= Dovesok + Edit1.Text[i]; end else Slovo:= Slovo + Edit1.Text[i]; end; Memo1.Clear; n:= 0; Timer1.Enabled:= true; flg:= true; flt:= false; end; procedure TForm1.Pechataem(s: string); begin Inc(n); if n<=length(s) then begin Memo1.Text:=Memo1.Text + s[n]; Timer1.Interval:=100 + Random(100); end else begin n:=0; flg:=false; if flt then Timer1.Enabled:= false; end; end; function TForm1.Stiraem(sim: integer): boolean; begin Result:= false; if i<=sim then begin str:=Memo1.Text; Delete(str,length(str),i); Timer1.Interval:=100 + Random(50); Memo1.Text:=str; Inc(i); end else begin Result:= true; i:=0; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if flg then Pechataem(Slovo) else if Stiraem(Length(Dovesok))then begin flg:= true; Slovo:= Dovesok; flt:= true; end; end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AArtem (07.03.2014)
|
#7
|
|||
|
|||
не, ТЗ не поменялось. это я неправильно выразился. идет имитация исправления ошибки. то есть типа человек набирает текст, ошибается, стирает все символы до ошибки, перепечатывает. потом идет продолжение ввода текста. первой программы достаточно. в самый раз.
только паузу бы между набором и стиранием и как реализовать возможность перевода строки |
#8
|
||||
|
||||
Цитата:
Цитата:
Цитата:
Цитата:
Вырисовывается такой алгоритм: в цикле разбиваем строку на отдельные куски по пробелам, их в свою очередь тоже раскладываем на "до исправлений" и "после", выполняем псевдопечать/упс, почесать затылок/исправ.ошибок и переходим к следующему слову. Встретился символ "^" к выходному тексту в мемо прибавляем #13#10 или выполняем Memo1.Lines.Add('') и так до конца фразы. Вроде всё это реализуемо (см. пост выше), и наверное так будет оптимально Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
AArtem (07.03.2014)
|
#9
|
|||
|
|||
спасибо большое. все понял. буду делать...
набор команд, то что надо... спасибо еще раз |
#10
|
||||
|
||||
Почти правильный алгоритм. Только живой человек обычно сначала печатает некую часть текста, по ходу правит. Затем наступает пауза, когда он читает свои вирши, и потом правит в произвольном месте, причем не обязательно правильно Так что он еще может вернуться и переделать заново абзац/стереть его/переставить слова и т.д.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |