Добавить в избранное 

a0-corner.gif (64 bytes)Home.gif (220 bytes)Zakaz.gif (388 bytes)java2.gif (300 bytes)Books.gif (225 bytes)Obmen.gif (232 bytes)e-mail.gif (177 bytes)



s-branch.gif (46 bytes)
  Услуги:
s-branch.gif (46 bytes)
  Сделать заказ
s-branch.gif (46 bytes)
  Исходники
s-branch.gif (46 bytes)
  Учебники
s-branch.gif (46 bytes)
  Java Script's
s-branch.gif (46 bytes)
  Ссылки
s-branch.gif (46 bytes)
  Обмен ссылками

 

 

 

 

 

 

 

 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Borland 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.


Copyright © 2003 Web, e-mail: web@nordnet.ru

Hosted by uCoz