Воскресенье, 05.05.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нашли свой исходник?
Всего ответов: 94
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Система » Компоненты

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

Получить ссылку на материал

Категория: Компоненты | Добавил: Барон (20.12.2011)
Просмотров: 1216 | Теги: TRichEdit, компонент | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
ActiveX [10]
CORBA и COM [16]
Kol и MCK [23]
WinAPI [28]
Компоненты [27]
Работа с Bluetooth [4]
Железо [8]
Текст [18]
Разное [98]
Королевство Delphi © 2010-2024
Яндекс цитирования