unit UConvert;

interface

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

type
  TForm1 = class(TForm)
    GroupBox3: TGroupBox;
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    BFile1: TButton;
    RadioGroup1: TRadioGroup;
    GroupBox2: TGroupBox;
    Edit2: TEdit;
    BFile2: TButton;
    RadioGroup2: TRadioGroup;
    BConvert: TButton;
    GroupBox4: TGroupBox;
    RichEdit1: TRichEdit;
    BOpen: TButton;
    BSave: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    OpenDialog2: TOpenDialog;
    SaveDialog2: TSaveDialog;
    ApplicationEvents1: TApplicationEvents;
    procedure BFile1Click(Sender: TObject);
    procedure BFile2Click(Sender: TObject);
    procedure BConvertClick(Sender: TObject);
    procedure BOpenClick(Sender: TObject);
    procedure BSaveClick(Sender: TObject);
    procedure ApplicationEvents1ShowHint(var HintStr: String;
      var CanShow: Boolean; var HintInfo: THintInfo);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const Win: string =  'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' +
                     'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ№';
      KOIR: string = 'БВЧЗДЕЈЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС' +
                     'бвчздеіцъйклмнопртуфхжигюыэящшьас?';
      KOIU: string = 'БВЧЗДЕЈЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС' +
                     'бвчздеіцъйклмнопртуфхжигюыэящшьас?';
      ISO: string =  'РСТУФХсЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп' +
                     '°±ІіґµЎ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПр';
var F1, F2: TextFile;

function Convert(const S, Lang1, Lang2: string): string;
var i, p: integer;
begin
 Result:=S;
 for i:=1 to Length(S) do begin
  p := Pos(S[i],Lang1);
  if p > 0 then Result[i] := Lang2[p];
 end;
end;

procedure TForm1.BFile1Click(Sender: TObject);
begin
 if OpenDialog1.Execute
 then Edit1.Text := OpenDialog1.FileName;
end;

procedure TForm1.BFile2Click(Sender: TObject);
begin
 if SaveDialog1.Execute
 then Edit2.Text := SaveDialog1.FileName;
end;

procedure TForm1.BConvertClick(Sender: TObject);
var S, Lang1, Lang2: string;
    RichEdit: TRichEdit;
begin
 try
  AssignFile(F1, Edit1.Text);
  Reset(F1);
  CloseFile(F1);
  except
   Application.MessageBox(PChar('Файл "' + Edit1.Text +'" не может быть открыт'),
                                'Нет доступа к файлу',MB_ICONSTOP);
   exit;
  end;
 if FileExists(Edit2.Text)
  then
   if Application.MessageBox(PChar('Файл "' + Edit2.Text +
              '" существует. Заменить его?'),
              'Подтвердите замену',MB_ICONQUESTION + MB_OKCANCEL)
            <> IDOK
    then exit;
 try
   AssignFile(F2, Edit2.Text);
   Rewrite(F2);
   CloseFile(F2);
  except
   Application.MessageBox(PChar('Файл "' + Edit2.Text +'" не может быть создан для записи'),
                                'Нет доступа к файлу',MB_ICONSTOP);
   exit;
  end;
 if (Edit1.Text = Edit2.Text)
 then begin
  Application.MessageBox(PChar('Исходный Файл - ' + Edit1.Text +
              #13'Результирующий файл - ' + Edit2.Text +
              #13'Они должны быть разными'),
              'Файлы должны быть разными',MB_ICONSTOP);
   exit;
 end;
 Screen.Cursor := crHourGlass;
 case RadioGroup1.ItemIndex of
     0, 1, 2: Lang1 := WIN;
     3:       Lang1 := KOIR;
     4:       Lang1 := KOIU;
     5:       Lang1 := ISO;
 end;
 case RadioGroup2.ItemIndex of
     0, 1, 2: Lang2 := WIN;
     3:       Lang2 := KOIR;
     4:       Lang2 := KOIU;
     5:       Lang2 := ISO;
 end;
 if (RadioGroup1.ItemIndex = 0) or (RadioGroup2.ItemIndex = 0)
 then begin
  RichEdit := TRichEdit.Create(Form1);
  RichEdit.Visible := false;
  RichEdit.Parent := Form1;
  RichEdit.PlainText := (RadioGroup1.ItemIndex > 0);
  RichEdit.Lines.LoadFromFile(Edit1.Text);
  if Lang1 <> Lang2
   then RichEdit.Text := Convert(RichEdit.Text, Lang1, Lang2);
  RichEdit.PlainText := (RadioGroup2.ItemIndex > 0);
  RichEdit.Lines.SaveToFile(Edit2.Text);
  RichEdit.Free;
  Screen.Cursor := crDefault;
  exit;
 end;
 Reset(F1);
 Rewrite(F2);
 while not Eof(F1) do begin
  Readln(F1, S);
  if S <> ''
  then begin
   if RadioGroup1.ItemIndex = 1
    then OemToChar(PChar(S), PChar(S));
   S := Convert(S, Lang1, Lang2);
   if RadioGroup2.ItemIndex = 1
    then CharToOem(PChar(S), PChar(S));
  end;
  Writeln(F2, S);
 end;
 CloseFile(F1);
 CloseFile(F2);
 Screen.Cursor := crDefault;
end;

procedure TForm1.BOpenClick(Sender: TObject);
var S, Lang1: string;
begin
 if OpenDialog2.Execute
 then begin
  if OpenDialog2.FilterIndex < 3
   then begin
    RichEdit1.Lines.LoadFromFile(OpenDialog2.FileName);
    exit;
   end;
  case OpenDialog2.FilterIndex of
   3: Lang1 := KOIR;
   4: Lang1 := KOIU;
   5: Lang1 := ISO;
   6: Lang1 := WIN;
  end;
  try
   AssignFile(F1, OpenDialog2.FileName);
   Reset(F1);
  except
   Application.MessageBox(PChar('Файл "' + OpenDialog2.FileName +'" не может быть открыт'),
                                'Нет доступа к файлу',MB_ICONSTOP);
   exit;
  end;
  RichEdit1.Clear;
  while not Eof(F1) do begin
   Readln(F1, S);
   if S <> ''
   then begin
    if OpenDialog2.FilterIndex = 6
     then OemToChar(PChar(S), PChar(S));
    S := Convert(S, Lang1, WIN);
   end;
   RichEdit1.Lines.Add(S);
  end;
  CloseFile(F1);
 end;
end;

procedure TForm1.BSaveClick(Sender: TObject);
var S, Lang2: string;
begin
 if SaveDialog2.Execute
 then begin
 if FileExists(SaveDialog2.FileName)
  then
   if Application.MessageBox(PChar('Файл "' + SaveDialog2.FileName +
              '" существует. Заменить его?'),
              'Подтвердите замену',MB_ICONQUESTION + MB_OKCANCEL)
            <> IDOK
    then exit;
  if SaveDialog2.FilterIndex < 3
   then begin
    RichEdit1.PlainText := (SaveDialog2.FilterIndex = 2);
    RichEdit1.Lines.SaveToFile(SaveDialog2.FileName);
    RichEdit1.PlainText := false;
    exit;
   end;
  case SaveDialog2.FilterIndex of
   3: Lang2 := KOIR;
   4: Lang2 := KOIU;
   5: Lang2 := ISO;
   6: Lang2 := WIN;
  end;

  if SaveDialog2.FilterIndex <> 6
   then RichEdit1.Text := Convert(RichEdit1.Text, WIN, Lang2)
   else begin
    SetLength(S, Length(RichEdit1.Text));
    S := RichEdit1.Text;
    CharToOem(PChar(S), PChar(S));
    RichEdit1.Text := S;
   end; 
  RichEdit1.PlainText := true;
  RichEdit1.Lines.SaveToFile(SaveDialog2.FileName);
  RichEdit1.PlainText := false;
  RichEdit1.Clear;
 end;
end;

procedure TForm1.ApplicationEvents1ShowHint(var HintStr: String;
  var CanShow: Boolean; var HintInfo: THintInfo);
begin
if (HintInfo.HintControl.ClassName = 'TEdit')
  then if (Canvas.TextWidth(
              (HintInfo.HintControl as TEdit).Text) >
              (HintInfo.HintControl as TEdit).ClientWidth)
  then begin
    HintStr:=(HintInfo.HintControl as TEdit).Text;
    ApplicationEvents1.CancelDispatch;
  end;
end;

end.
