Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Русификация компонента 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.

Z-центр

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
8 ноября 2005, 20:56:21
// Регистрация конвертора для расширения rft.
описка. Не rft, a rtf.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог