unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Menus, ShellApi;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    OD1: TOpenDialog;
    RE1: TRichEdit;
    openm: TMenuItem;
    ReadTm: TMenuItem;
    ReadSm: TMenuItem;
    pauzm: TMenuItem;
    Stopm: TMenuItem;
    resumem: TMenuItem;
    stresmm: TMenuItem;
    vswavm: TMenuItem;
    setvsm: TMenuItem;
    vs1m: TMenuItem;
    vs2m: TMenuItem;
    vs3m: TMenuItem;
    TrBar1: TTrackBar;
    spvelm: TMenuItem;
    TrBar2: TTrackBar;
    help1m: TMenuItem;
    SD1: TSaveDialog;
    procedure openmClick(Sender: TObject);
    procedure resumemClick(Sender: TObject);
    procedure StopmClick(Sender: TObject);
    procedure pauzmClick(Sender: TObject);
    procedure ReadSmClick(Sender: TObject);
    procedure ReadTmClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure stresmmClick(Sender: TObject);
    procedure vswavmClick(Sender: TObject);
    procedure vs1mClick(Sender: TObject);
    procedure vs2mClick(Sender: TObject);
    procedure vs3mClick(Sender: TObject);
    procedure TrBar1Change(Sender: TObject);
    procedure TrBar2Change(Sender: TObject);
    procedure help1mClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type //потік для виділення фраз, що читаються в re1
  TMyThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  procedure SetVsp(vs:char); stdcall; external 'Rozm2.dll';
  procedure Readtp(pfi:PChar; pfo:PChar; bi:integer; mi:integer); stdcall; external 'Rozm2.dll';
  procedure Readsp(pc:PChar; pfo:PChar; mi:integer); stdcall; external 'Rozm2.dll';
  procedure Pauzp; stdcall; external 'Rozm2.dll';
  procedure Resumep; stdcall; external 'Rozm2.dll';
  procedure Stopp; stdcall; external 'Rozm2.dll';
  function GetPozf:integer; stdcall; external 'Rozm2.dll';
  procedure StresModp(sm:integer); stdcall; external 'Rozm2.dll';
  procedure SetSpRatp(sr:integer); stdcall; external 'Rozm2.dll';
  procedure SetSpVolp(sv:integer); stdcall; external 'Rozm2.dll';
  procedure WaitEnd; stdcall; external 'Rozm2.dll';
  procedure WaitPoz; stdcall; external 'Rozm2.dll';
implementation

{$R *.dfm}
var
hEventE,hEventP:thandle;
rdir:string;//каталог
fi:string='';//ім'я файлу для читання
fo:string='';//ім'я вихідного файлу
bi:integer=0;//початок читання
s:string;// строка для читання
mi:integer=0;//0-голос, 1-Wav
sm:integer=2;//1-всі наголошені, 2-передостанні
nv:integer=1;//номер голосу
sr:integer=5;//швидкість
sv:integer=16;//гучність
cn:integer;//кількість символів в тексті
sp:TMyThread;//потік для виділення в re1
spon:boolean=false;//чи запущений потік sp
ec:cardinal;//exit code

procedure TForm1.openmClick(Sender: TObject);
begin// відкрити файл
 if od1.Execute then fi:=od1.FileName else exit;
 re1.Lines.LoadFromFile(fi);
 cn:=re1.GetTextLen;//розмір тексту
end;

procedure TForm1.resumemClick(Sender: TObject);
begin//продовжити читання
 resumep;
end;

procedure TForm1.StopmClick(Sender: TObject);
begin// зупинити
if not spon then exit;
 TerminateThread(sp.Handle,ec);//зупинка потоку для виділення тексту
 spon:=false;
 stopp;//власне, це процедура зупинки читання, все остальне для виділення фраз, що читаються
end;

procedure TForm1.pauzmClick(Sender: TObject);
begin// пауза
 pauzp;
end;

procedure TForm1.ReadSmClick(Sender: TObject);
begin //читати строку
 if spon then exit;
 s:=re1.SelText;
 if s='' then s:='нема ви\діленого тексту';
 readsp(pchar(s),pchar(fo),mi);
end;

procedure TMyThread.Execute;
var bp,ep:integer;
begin//для виділення фраз, що читаються в re1
 bp:=Form1.re1.SelStart;
 waitpoz;
 ep:=getpozf; Form1.re1.SelLength:=ep-bi;
 repeat
  bp:=ep;
  waitpoz;
  Form1.re1.SelStart:=bp;
  ep:=getpozf; Form1.re1.SelLength:=ep-bp;
 until ep>=cn;
 spon:=false;
end;

procedure TForm1.ReadTmClick(Sender: TObject);
var bp,ep:integer;
begin //читати текст з позиції курсору
 if spon then exit;
 bi:=re1.SelStart;
 if fi<>''then readtp(pchar(fi),pchar(fo),bi,mi);
//для виділення фраз, що читаються в re1
if mi=0 then begin sp:=TMyThread.Create(false); spon:=true;end;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
 getdir(0,rdir);
 od1.InitialDir:=rdir+'\ProbTxt';
// hEventE:=OpenEvent(EVENT_ALL_ACCESS,false,'EventE');
// hEventP:=OpenEvent(EVENT_ALL_ACCESS,false,'EventP');
end;

procedure TForm1.stresmmClick(Sender: TObject);
begin// спосіб наголошення слів, відсутніх в словнику
 if sm=2 then  sm:=1 else sm:=2;
 stresmm.Caption:='Наголос '+ inttostr(sm);
 StresModp(sm);
end;

procedure TForm1.vswavmClick(Sender: TObject);
begin// читати (mi=0), чи створити wav файл (mi=1)
 if mi=0 then
 begin
   if sd1.Execute then fo:=sd1.FileName else exit;
   mi:=1; vswavm.Caption:='В wav файл';
 end
  else begin mi:=0; fo:=''; vswavm.Caption:='Звук'; end;
end;

procedure TForm1.vs1mClick(Sender: TObject);
begin
SetVsp('1'); setvsm.Caption:='Голос 1';
end;

procedure TForm1.vs2mClick(Sender: TObject);
begin
SetVsp('2'); setvsm.Caption:='Голос 2';
end;

procedure TForm1.vs3mClick(Sender: TObject);
begin
SetVsp('3'); setvsm.Caption:='Голос 3';
end;

procedure TForm1.TrBar1Change(Sender: TObject);
begin// швидкість читання
sr:=trbar1.Position; SetSpRatp(sr); spvelm.Caption:='Швидкість '+inttostr(sr);
//sr=1..9
end;

procedure TForm1.TrBar2Change(Sender: TObject);
begin//гучність, амплітуда звуку
sv:=trbar2.Position; SetSpVolp(sv); //sv=0..16
end;

procedure TForm1.help1mClick(Sender: TObject);
begin
shellexecute(handle,'open',pchar(rdir+'\Rozm2Help.htm'),'',pchar(rdir),SW_SHOW);
end;

end.

