Исходники.Ру - Программирование
Исходники
Статьи
Книги и учебники
Скрипты
Новости RSS
Магазин программиста

Главная » Статьи по программированию » Delphi - Все статьи »

Обсудить на форуме Обсудить на форуме

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


Может пригодится:


Автор: Неизвестен
Прочитано: 5504
Рейтинг:
Оценить: 1 2 3 4 5

Комментарии: (0)

Добавить комментарий
Ваше имя*:
Ваш email:
URL Вашего сайта:
Ваш комментарий*:
Код безопастности*:

Рассылка новостей
Рейтинги
© 2007, Программирование Исходники.Ру