Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

RxRichEdit и Unicode [D7, WinXP]


Zoom ©   (2010-05-04 15:12:00) 

Помогите  пожалуйста!!! зашел почти в тупик...
как отправить Unicode символы в RxRichEdit ?

нашел такое решение:

procedure TJvCustomRichEdit.SetTextW(const Value: WideString);
var
  SetText: TSetText;
const EM_SETTEXTEX = WM_USER + 97;
begin
  SetText.flags := 0;
  SetText.codepage := 1200;
  SendMessage(Handle, EM_SETTEXTEX, Longint(@SetText),
Longint(PWideChar(Value)));
end;


но не могу найти класс TSetText, можно ли его где найти, и приспособить для D7 ???


Zoom   (2010-05-04 21:24:00) [1]

задача решена :) RxRichEdit1.SelStart := -1;


Zoom   (2010-05-04 19:07:00) [2]

Сделал такую функцию:


function WideStringToRTF(color: Tcolor; FontName, Extratag: string; ws: WideString): string;
var
 rtf: string;
 i: integer;
 red, green, blue: byte;
begin
 // \b - жирный  \i - курсив  \fs100 - размер шрифта
 red := color and $FF;
 green := (color shr 8) and $FF;
 blue := color shr 16;
 rtf := '{\rtf1{\fonttbl{\f0\fnil\fcharset204 ' + FontName + ';}}{\colortbl ;\red'
   + inttostr(red) + '\green' + inttostr(green) + '\blue' + inttostr(blue) + '; }\cf1\f0' + Extratag;
 for i := 1 to length(ws) do begin
   rtf := rtf + '\u' + inttostr(integer(ws[i])) + '?';
 end;
 rtf := rtf + '\u13?}';
 result := rtf;
end;



вызываю так:


 RxRichEdit1.PlainText := False;
 RxRichEdit1.StreamMode := [smSelection];
 RxRichEdit1.Lines.LoadFromStream(TStringStream.Create(WideStringToRTF(clgreen, 'Arial Unicode MS', '\fs20\b\i', ws)));
 RxRichEdit1.perform(WM_VSCROLL, SB_BOTTOM, 0);


все работает но! текст вставляется туда где на данный момент расположен курсор, можно ли как-то загнать курсор в конец текста ???


Zoom   (2010-05-04 17:15:00) [3]

все бы хорошо, но так не бывает :)

EM_SETTEXTEX - полностью стирает предыдущее содержимое RichEdit ...
других сообщений типа EM_APPENDTEXTEX к сожалению нету...

а вот как бы сделать добавление текста к уже имеющемуся содержимому ?

похоже надо добавлять при помощи rtf формата....
единственное неудобство почему-то нельзя  добавить rtf код через RxRichEdit1.Lines.Add(str) ; вернее можно но только один раз...
даже если не закрывать '}' все равно следующая строка уже будет отображаться не символами, а rtf тегами напр. '\u-12977?'....

пока только так получилось...

 SS := TStringStream.Create('{\rtf1{\fonttbl{\f0\fnil\fcharset204 Arial Unicode MS;}}{\colortbl ;\red255\green0\blue0;}\cf1\f0\u-12978?\u-12977?\u-12995?\par}');
 RxRichEdit1.PlainText := False;
 RxRichEdit1.StreamMode := [smSelection];
 RxRichEdit1.Lines.LoadFromStream(SS);
 SS.Free;


но в этом случае нельзя комбинировать с Lines.Add... rtf пишет на свое старое место (выше в строке), а Lines.Add начинает с новой строки(ниже)... весьма забавно...


Zoom   (2010-05-04 16:45:00) [4]

MBo, спасибо! в JVCL ее небыло ...

заработала!


type
 _settextex = record
   flags: Longword;
   codepage: Cardinal;
 end;
 TSETTEXTEX = _settextex;


MBo   (2010-05-04 15:26:00) [5]

это не класс, а запись. Если ее объявления нет в JVCL, то этот тип надо объявить самостоятельно по описанию из статьи MDSN по EM_SETTEXTEX
typedef struct _settextex {
   DWORD flags;
   UINT codepage;
} SETTEXTEX


Наверх

Титульная страница Поиск, карта сайта Написать письмо