Русификация компонента TRichEdit

Для того, чтобы компонент TRichEdit сохранял символы национальных алфавитов в их натуральном виде, а не в виде шестнадцатиричных кодов, необходимо создать специальный конвертор и зарегистрировать его в компоненте. Конвертор наследуется от класса TConversion, в котором определены два виртуальных метода ConvertReadStream и ConvertWriteStream, которые отвечают за преобразование потока символов соответственно при чтении и записи файла. Чтение файла, содержащего русские символы, происходит корректно и без применения специальных мер, поэтому мы должны перекрыть только метод записи. В перекрытом методе необходимо разместить код, преобразующий шестнадцатиричные коды в символы русского алфавита. Ниже приведен пример русификации (redMain - компонент типа TRichEdit).


type  
  // Объявляем класс конвертора.  
  TRussianConvertor=class(TConversion)  
    // Перекрываем только метод записи в поток.  
    function ConvertWriteStream(Stream: TStream; Buffer: PChar;  
      BufSize: Integer): Integer; override;  
  end;  
  
// Реализация метода записи в поток.  
function TRussianConvertor.ConvertWriteStream(Stream: TStream;   
  Buffer: PChar; BufSize: Integer): Integer;  
  
type  
  // Тип, упрощающий анализ потока символов.  
  TFourChars = record  
    HexTag,HexCode: array[0..1] of Char;  
  end;  
  PFourChars=^TFourChars;  
  
var  
  RusBuffer: PChar;  
  i,RusSize: Integer;  
  
  // Функция, преобразующая двухсимвольное  
  // Hex-представление в символ.  
  function HexToChar(Hex: PChar): Char;  
  
    function HexNumber(C: Char): Integer;  
    begin  
      C:=UpCase(C);  
      case C of  
        '0'..'9': Result:=Ord(C)-Ord('0');  
        'A'..'F': Result:=Ord(C)-Ord('A')+10;  
      else Result:=0;  
      end;  
    end;  
  
  begin  
    Result:=Chr(HexNumber(Hex[0])*16+HexNumber(Hex[1]));  
  end;  
  
begin  
  RusBuffer:=StrAlloc(BufSize);  
  RusSize:=0;  
  i:=0;  
  // Цикл по всем символам.  
  while i<BufSize do  
  begin  
    with PFourChars(@Buffer[i])^ do  
      // Hex-представление символа.  
      if HexTag='\''' then  
      begin  
        RusBuffer[RusSize]:=HexToChar(HexCode);  
        Inc(i,4);  
      end  
      else  
      // Все остальные случаи.  
      begin  
        RusBuffer[RusSize]:=Buffer[i];  
        Inc(i);  
      end;  
    Inc(RusSize);  
  end;  
  // Запись нового буфера в поток.  
  Result:=Stream.Write(RusBuffer^,Pred(RusSize));  
  StrDispose(RusBuffer);  
end;  
  
procedure TfrmMain.FormCreate(Sender: TObject);  
begin  
  // Регистрация конвертора для расширения rft.  
  redMain.RegisterConversionFormat('rtf',TRussianConvertor);  
end; 

По аналогичному принципу может быть построен, например, конвертор, позволяющий загружать и сохранять файлы в формате Microsoft Word.
Теги:
TRichEdit
Добавлено: 02 Августа 2018 07:35:55 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...