unit _fm_Word;


interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;



type
   
   Tfm_Word       = class(TForm)
                    edWord     : TEdit;
   
   btApply    : TBitBtn;
   
   btWDir     : TBitBtn;
   
   stWWeight  : TStaticText;
   
   meHelp     : TMemo;
   
   imV        : TImage;
   
   imH        : TImage;
   
   btCancel   : TSpeedButton;
   

procedure btApplyClick(Sender: TObject);
   

   procedure btWDirClick(Sender: TObject);
      

      procedure FormActivate(Sender: TObject);
         

         procedure edWordChange(Sender: TObject);
            

            procedure btCancelClick(Sender: TObject);
               

               procedure FormKeyPress(Sender: TObject; var Key: Char);
                  
                  private
                  { Private declarations }
                  public
                  { Public declarations }
end;



var
   
   fm_Word       : Tfm_Word;
   
   
   implementation{================================================================}
   
   uses _fm_Main, LangSupp, _fm_DMan;
   
   

   var
      
      LCol,LRow       : integer;
      
      
         {$R *.DFM}
      
         {------------------------------------------------------------------------------}

procedure Tfm_Word.btApplyClick(Sender: TObject);
   

var
   i          : integer;
   

begin
   
   {Слова менее чем из 2 букв не пропускать}
   if length(edWord.Text)<2 then
      exit;
   
   
   sWord := AnsiLowerCase(edWord.Text);
   
   SCol := LCol;
   
   SRow := LRow;
   
   
   if not CheckWordLayout then begin
      
      if EMessage='*' then
         
         MessageDlg(_W_mReplaceAst, mtWarning, [mbOk], 0)
      else
         
         if EMessage<>'' then
            MessageDlg(EMessage, mtError, [mbOk], 0);
      {Возможен выход без сообщений}
      exit;
      
      end
   
   
   else
      {синтаксис и расположение в порядке...}
      
      {Проверка на содержание вводимого слова в словаре программы}
      if SendMessage(fm_DMan.lbActive.Handle, LB_FindStringExact, 0, Longint(PChar(sWord))
      )<0 then
         
         if MessageBox(0,PChar(Format(_W_mIsAdd,
                              [AnsiUpperCase(sWord)])),
                       PChar(Application.Title),
                       MB_YESNO or MB_TASKMODAL or
                       MB_ICONQUESTION or MB_DEFBUTTON2)=IDYES then begin
            
            fm_DMan.lbActive.Items.Add(sWord);
            
            end
         
   else begin
      
      MessageDlg(_W_mAbortAdd, mtInformation, [mbOk], 0);
      
      exit;
      
      end;
   
   
   {Проверка на предшествие ходу пользователя - подсказки компьютера}
   if Suggested then
      
      for i:=1 to FoundedWords do begin
         
         if Drafts[i].Word=sWord then begin
            
            if MessageBox(0,PChar(_W_mSuggested),
                          PChar(Application.Title),
                          MB_YESNO or MB_TASKMODAL or
                          MB_ICONQUESTION or MB_DEFBUTTON2)=IDYES then
               exit
            else begin
               Players[PCNo].Rec.Caption := 
             IntToStr(StrToInt(Players[PCNo].Rec.Caption)+SuggestionValue);
               
               {Запись подсказки как хода в архив ходов}
               inc(PlayerMoves);
               
               PlayerMove[PlayerMoves].PlayerName := Players[PCNo].Name.Text;
               
               PlayerMove[PlayerMoves].DirHor := WordDirHor;
               
               PlayerMove[PlayerMoves].Pos := Point(SCol,SRow);
               
               PlayerMove[PlayerMoves].Word := Format(_G_cHelp,[AnsiUpperCase(sWord)]);
               
               PlayerMove[PlayerMoves].Points := SuggestionValue;
               
               PlayerMove[PlayerMoves].Total := StrToInt(Players[PCurrent].Rec.Caption);
               
               PlayerMove[PlayerMoves].UsedLetters := '';
               
               PlayerMove[PlayerMoves].ReceivedLetters := '';
               
               end;
            {else}
            break;
            
            end;
         {if =Word}
         end;
   {for i}
   Close;
   
   end;


{------------------------------------------------------------------------------}

procedure Tfm_Word.btWDirClick(Sender: TObject);
   

var
   i,j          : byte;
   
   k          : integer;
   
   l,l1         : string;
   

begin
   
   LCol := SCol;
   
   LRow := SRow;
   
   edWord.OnChange := nil;
   
   
   WordDirHor := not WordDirHor;
   
   
   if WordDirHor then
      btWDir.Glyph := imH.Picture.Bitmap
   else
      btWDir.Glyph := imV.Picture.Bitmap;
   
   if WordDirHor then
      btWDir.Caption := _W_WDirHor
   else
      btWDir.Caption := _W_WDirVer;
   
   
   fm_Word.edWord.Text := '';
   
   ActiveControl := btApply;
   
   
   {Расчет правильного отображения предполагаемого слова}
   
   if GameState=gsJustStarted then
      {Пересечений точно не ожидается}
      for i:=1 to Players[PCurrent].LettersObj.col+1 do
         
fm                                             _Word.edWord.Text:=fm_Word.edWord.Text + Players[PCurrent].Letters[i]

else                                               begin
         {Могут быть пересечения}
         j := 1;
         
         for k:=1 to MaxWordLength do begin
            
            
            l1 := FieldNextCell(k+1).Letter;
            
            l := FieldNextCell(k).Letter;
            
            
            if l=' ' then begin
               
               fm_Word.edWord.Text := fm_Word.edWord.Text + AnsiLowerCase(Players[PCurrent
               ].Letters[j]);
               
               inc(j);
               
               end
            
            else
               
               fm_Word.edWord.Text := fm_Word.edWord.Text + AnsiUpperCase(l);
            
            
            if (j>Players[PCurrent].LettersObj.Col+1) and (l1=' ') then
               break;
            
            if     WordDirHor and (LCol+k>=fm_Main.sg.ColCount) then
               break;
            
            if not WordDirHor and (LRow+k>=fm_Main.sg.ColCount) then
               break;
            
            
            end;
         {for}
         end;
   {else}
   
   {Если перед буквой стоит слово, то также его включить}
   if WordDirHor and (LCol>0) then
      
      for i:=LCol-1 downto 0 do begin
         
         if Field[i,LRow].Letter=' ' then
            break;
         
         fm_Word.edWord.Text := AnsiUpperCase(Field[i,LRow].Letter) + fm_Word.edWord.Text;
         
         dec(LCol);
         
         end;
   
   if not WordDirHor and (LRow>0) then
      
      for i:=LRow-1 downto 0 do begin
         
         if Field[LCol,i].Letter=' ' then
            break;
         
         fm_Word.edWord.Text := AnsiUpperCase(Field[LCol,i].Letter) + fm_Word.edWord.Text;
         
         dec(LRow);
         
         end;
   
   
   ActiveControl := edWord;
   
   
   {Если среди букв есть зведочка, то ее выделить.  Иначе - выделить все слово}
   if Pos('*',edWord.Text)>0 then begin
      
      edWord.SelStart := Pos('*',edWord.Text)-1;
      
      edWord.SelLength := 1;
      
      end
   
   else begin
      
      edWord.SelStart := 0;
      
      edWord.SelLength := length(edWord.Text);
      
      end;
   
   
   edWord.OnChange := edWordChange;
   
   edWordChange(Sender);
   
   end;


{------------------------------------------------------------------------------}

procedure Tfm_Word.FormActivate(Sender: TObject);
   
begin
   
   Left := fm_Main.Left + fm_Main.sg.Left + fm_Main.sg.Width + 16;
   
   Top := fm_Main.Top  + Players[PCurrent].LettersObj.Top + 140;
   
   
   if ShowTips then
      
      fm_Word.Height := 202
   else
      
      fm_Word.Height := 131;
   
   
   EMessage := 'Cancelled';
   {Must be non empty!}
   fm_Word.Caption := _W_cCaption + ' - ' + _H_LPName + ': ' + Players[PCurrent].Name.Text
   ;
   
   fm_Word.meHelp.Lines.Text := Players[PCurrent].Name.Text + ', ' + _W_mHelp;
   
   fm_Word.btWDirClick(Self);
   
   end;



procedure Tfm_Word.edWordChange(Sender: TObject);
   

var
   i,j          : byte;
   
   

begin
   
   {Прорисовываем на поле место будущего слова}
   for i:=0 to MaxWordLength-1 do
      
      for j:=0 to MaxWordLength-1 do
         Field[i,j].JustSet:=false;
   
   if WordDirHor then
      for i:=1 to length(edWord.Text) do
         Field[LCol+i-1,LRow].JustSet:=true
else                                    for i:=1 to length(edWord.Text) do
            Field[LCol,LRow+i-1].JustSet:=true;
   
   fm_Main.sg.Repaint;
   
   
   {Расчет веса слова}
   sWord := AnsiLowerCase(edWord.Text);
   
   WWeight := WordWeight;
   
   
   {Указываем количество очков слова}
   stWWeight.Caption := Format(_W_mWWeight, [WWeight, Ending(WWeight)]);
   
   if pos('*',edWord.Text)<>0 then
      stWWeight.Caption := stWWeight.Caption + ' + *'
   end;



procedure Tfm_Word.btCancelClick(Sender: TObject);
   
begin
   
   Close
   end;



procedure Tfm_Word.FormKeyPress(Sender: TObject; var Key: Char);
   
begin
   
   if Key=#27 then
      Close
   end;


end.