unit newfileu;

interface

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

type
  TFileManageForm = class(TForm)
    OpenDialog1: TOpenDialog;
    sbMain: TStatusBar;
    pbMain: TProgressBar;
    Label1: TLabel;
    rgLength: TRadioGroup;
    btnGo: TBitBtn;
    btnOK: TBitBtn;
    procedure rgLengthClick(Sender: TObject);
    procedure btnGoClick(Sender: TObject);
  private
    { Private declarations }
    Len, NextGrp : Integer;
    procedure ProcessWordFile(const fName : String; Len : Integer);
  public
    { Public declarations }
  end;

var
  FileManageForm: TFileManageForm;

implementation

uses ladSharU;

{$R *.DFM}


procedure TFileManageForm.rgLengthClick(Sender: TObject);
begin
  WITH Sender AS TRadioGroup DO
    IF ItemIndex > -1 THEN
      begin
        btnGo.Enabled := True;
        Len := ItemIndex + 3;
      end;
end;

procedure TFileManageForm.ProcessWordFile(const fName : String; Len : Integer);
VAR
  SLin, slTemp, slOut : TStringList;
  Posn, N, M, counter : Integer;
  C1, C2 : Char;
  S : String;
  FileOK : Boolean;

  procedure WriteItOut;
  VAR
    T : TextFile;
    N, M, Posn : Integer;
  begin
    slOut.Sort;
    AssignFile(T, Format('WZ%.02d.TXT',[Len]));
    Rewrite(T);
    pbMain.Max := slOut.Count-1;
    sbMain.Panels[1].Text := 'Building word-links';
    FOR N := 0 TO slOut.Count-1 DO
      WITH TWordObj(slOut.Objects[N]) DO
        begin
          pbMain.Position := N;
          FOR M := N+1 TO slOut.Count-1 DO
            begin
              IF OneDifferent(slOut[N], slOut[M], Posn, C1, C2) THEN
                begin
                  TWordObj(slOut.Objects[N]).AddLink(Posn, C1);
                  TWordObj(slOut.Objects[M]).AddLink(Posn, C2);
                  Application.ProcessMessages;
                end;
            end;
          WriteLn(T, Format('%s%.03X%s', [slOut[N], Group, LinkString]));
        end;
    CloseFile(T);
  end;

begin
  Counter := 0;
  pbMain.Position := 0;
  SLin := TStringList.Create;
  try
    slTemp := TStringList.Create;
    try
      slOut := TStringList.Create;
        try
          SLin.LoadFromFile(fName);
          pbMain.Max := slIn.Count-1;
          sbMain.Panels[1].Text := 'Validating File';
          FileOK := True;
          FOR N := 0 TO slIn.Count-1 DO
            begin
              pbMain.Position := N;
              Application.ProcessMessages;
              IF Length(slIn[N]) <> Len THEN
                begin
                  FileOK := False;
                  Break;
                end;
              FOR M := 1 TO Len DO
                CASE slIn[N][M] OF
                  'A'..'Z' : ;
                  ELSE
                    begin
                      FileOK := False;
                      Break;
                    end;
                END;
            end;
          IF NOT FileOK THEN
            begin
              ShowMessage(Format('File %s is not valid. It should contain '+
                'only %d-letter uppercase words', [fName, Len]));
              Exit;
            end;
          NextGrp := 1;
          pbMain.Position := 0;
          sbMain.Panels[1].Text := 'Building word-groups';
          WHILE SLin.Count > 0 DO
            begin
              slTemp.Clear;
              slTemp.AddObject(SLin[0], TWordObj.Create(NextGrp));
              SLin.Delete(0);
              N := 0;
              WHILE N < slTemp.Count DO
                begin
                  S := slTemp[N];
                  M := 0;
                  WHILE M < SLIn.Count DO
                    begin
                      IF OneDifferent(S, SLIn[M], Posn, C1, C2) THEN
                        begin
                          slTemp.AddObject(SLin[M], TWordObj.Create(NextGrp));
                          SLin.Delete(M);
                          pbMain.Position := pbMain.Max - slIn.Count + 1;
                          Application.ProcessMessages;
                          Counter := (Counter + 1) MOD 100;
                          IF Counter=0 THEN
                            Application.ProcessMessages;
                        end
                      ELSE Inc(M);
                    end;
                  Inc(N);
                end;
              IF slTemp.Count > 2 THEN
                begin
                  Inc(NextGrp);
                  IF NextGrp > 999 THEN
                    Raise(Exception.Create('foobie'));
                  slOut.AddStrings(slTemp);
                end;
            end;
        WriteItOut;
      finally
        SLOut.Free;
      end;
    finally
      slTemp.Free;
    end;
  finally
    SLin.Free;
    pbMain.Position := 0;
    sbMain.Panels[1].Text := 'Done';
  end;
end;


procedure TFileManageForm.btnGoClick(Sender: TObject);
begin
  WITH OpenDialog1 DO
    begin
      Title := Format('Open %d-letter word file',
        [Len]);
      IF Execute THEN
        begin
          rgLength.Enabled := False;
          btnGo.Enabled := False;
          btnOK.Enabled := False;
          ProcessWordFile(Filename, Len);
          rgLength.Enabled := True;
          btnGo.Enabled := True;
          btnOK.Enabled := True;
        end;
    end;
end;

end.
