Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.03.2014, 21:24
AArtem AArtem вне форума
Прохожий
 
Регистрация: 06.03.2014
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Эффект печатной машинки

привет. помогите с задачей. нужна программка, имитирующая набор текста. проблема в том, что должен быть не только набор текста, но и стирание. отдельно с набором проблем нет. отдельно со стиранием тоже. но вот реализовать это вместе не получается. таймеры срабатывают одновременно...
Ответить с цитированием
  #2  
Старый 06.03.2014, 21:28
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А где же ваш код чтоб его править? Показывайте
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AArtem (07.03.2014)
  #3  
Старый 06.03.2014, 21:34
AArtem AArtem вне форума
Прохожий
 
Регистрация: 06.03.2014
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
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  
Старый 06.03.2014, 23:37
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

С небольшими доработками тоже самое
Код:
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  
Старый 07.03.2014, 00:10
AArtem AArtem вне форума
Прохожий
 
Регистрация: 06.03.2014
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

спасибо огромное. то, что надо... а то я уже в сторону sleep начал делать

а как можно паузу сделать по больше между набором и стиранием. чето у меня не получается...

...и можно ли сделать перевод строки?

Последний раз редактировалось AArtem, 07.03.2014 в 00:27.
Ответить с цитированием
  #6  
Старый 07.03.2014, 00:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Опа, оказывается-то ТЗ поменялось, нужно уже ашипки чтоб исправляло, тогда ещё вариант, только едит на форму киньте - в нём будет слово для "издевательств"
Код:
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  
Старый 07.03.2014, 00:48
AArtem AArtem вне форума
Прохожий
 
Регистрация: 06.03.2014
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

не, ТЗ не поменялось. это я неправильно выразился. идет имитация исправления ошибки. то есть типа человек набирает текст, ошибается, стирает все символы до ошибки, перепечатывает. потом идет продолжение ввода текста. первой программы достаточно. в самый раз.

только паузу бы между набором и стиранием и как реализовать возможность перевода строки
Ответить с цитированием
  #8  
Старый 07.03.2014, 01:41
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от AArtem
..только паузу бы между набором и стиранием и как реализовать возможность перевода строки
Вероятно для этого нужно смотреть с самого начала, с задачи. Допустим, надо симулякрнуть набор с ошибками фразы
Цитата:
Мама мыла раму,
а может это рама пыталась её вымыть
с ошибками это должно выглядеть так
Цитата:
Мами мула ламу,
а могет это рима питалась ея вымать
здесь нужен ещё как бы управляющий набор комманд, допустим выполнить исправление это символ "|", перевод строки - "^", пауза - "_". Тогда вариант текста будет выглядеть примерно так
Цитата:
Мами|а мула|ыла ламу|раму,^а могет|может это рима|ама питалась|ыталась ея|ё вымать|ыть
паузу не знаю куда вснуть, но это можно сделать и позже

Вырисовывается такой алгоритм: в цикле разбиваем строку на отдельные куски по пробелам, их в свою очередь тоже раскладываем на "до исправлений" и "после", выполняем псевдопечать/упс, почесать затылок/исправ.ошибок и переходим к следующему слову. Встретился символ "^" к выходному тексту в мемо прибавляем #13#10 или выполняем Memo1.Lines.Add('') и так до конца фразы. Вроде всё это реализуемо (см. пост выше), и наверное так будет оптимально
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
AArtem (07.03.2014)
  #9  
Старый 07.03.2014, 02:06
AArtem AArtem вне форума
Прохожий
 
Регистрация: 06.03.2014
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

спасибо большое. все понял. буду делать...
набор команд, то что надо... спасибо еще раз
Ответить с цитированием
  #10  
Старый 07.03.2014, 18:53
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Почти правильный алгоритм. Только живой человек обычно сначала печатает некую часть текста, по ходу правит. Затем наступает пауза, когда он читает свои вирши, и потом правит в произвольном месте, причем не обязательно правильно Так что он еще может вернуться и переделать заново абзац/стереть его/переставить слова и т.д.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter