![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
||||
|
||||
|
Почти правильный алгоритм. Только живой человек обычно сначала печатает некую часть текста, по ходу правит. Затем наступает пауза, когда он читает свои вирши, и потом правит в произвольном месте, причем не обязательно правильно
Так что он еще может вернуться и переделать заново абзац/стереть его/переставить слова и т.д. |