trichview.com Forum Index trichview.com
TRichView support forums
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[How to] How to make Unicode editor

 
Post new topic   Reply to topic    trichview.com Forum Index -> Examples, Demos
View previous topic :: View next topic  
Author Message
Sergey Tkachenko
Site Admin


Joined: 27 Aug 2005
Posts: 6431

PostPosted: Wed Sep 07, 2005 9:43 am    Post subject: [How to] How to make Unicode editor Reply with quote

This information is about TRichView versions prior to 11. Information about TRichView 11 and newer is in the next post.

1) Set Unicode property to True for all TextStyles in TRVStyle
2) Set RichViewEdit1.RTFReadProperties.UnicodeMode = rvruOnlyUnicode
3) Some methods cannot be used if the document is in Unicode.
- Add, AddFmt, AddNL, AddNLTag, AddTextBlockNL (use AddNLATag or AddNLWTag instead)
- AddTextNL (use AddTextNLA or AddTextNLW instead);
- SetItemText (use SetItemTextA or SetItemTextW instead)
- SetItemTextEd (use SetItemTextEdA or SetItemTextEdW instead)
- SetCurrentItemText (use SetCurrentItemTextA or SetCurrentItemTextW
instead)
4) Existing non-Unicode RVF documents must be converted to Unicode by
calling ConvertToUnicode after loading them (see below).
It's safe to call this procedure for Unicode documents - it will do nothing.
Code:
uses CRVData, RVItem, RVUni;

procedure ConvertRVToUnicode(RVData: TCustomRVData);
var i,r,c, StyleNo: Integer;
    table: TRVTableItemInfo;
begin
  for i := 0 to RVData.ItemCount-1 do begin
    StyleNo := RVData.GetItemStyle(i);
    if StyleNo>=0 then begin
      if not RVData.GetRVStyle.TextStyles[StyleNo].Unicode then begin
        RVData.SetItemText(i, RVU_GetRawUnicode(RVData.GetItemTextW(i)));
        Include(RVData.GetItem(i).ItemOptions, rvioUnicode);
      end;
      end
    else if RVData.GetItemStyle(i)=rvsTable then begin
      table := TRVTableItemInfo(RVData.GetItem(i));
      for r := 0 to table.Rows.Count-1 do
        for c := 0 to table.Rows[r].Count-1 do
          if table.Cells[r,c]<>nil then
            ConvertRVToUnicode(table.Cells[r,c].GetRVData);
    end;
  end;
end;

procedure ConvertToUnicode(rv: TCustomRichView);
var i: Integer;
begin
  ConvertRVToUnicode(rv.RVData);
  for i := 0 to rv.Style.TextStyles.Count-1 do
    rv.Style.TextStyles[i].Unicode := True;
end;


Last edited by Sergey Tkachenko on Thu Dec 11, 2008 12:09 pm; edited 1 time in total
Back to top
View user's profile Send private message Visit poster's website
Sergey Tkachenko
Site Admin


Joined: 27 Aug 2005
Posts: 6431

PostPosted: Tue Dec 09, 2008 3:43 pm    Post subject: Reply with quote

How to make Unicode editor in TRichView v11 or newer in Delphi 4-2007

1) Set Unicode property to True for all TextStyles in TRVStyle.
2) Set RichViewEdit1.RTFReadProperties.UnicodeMode = rvruOnlyUnicode.
3) Methods working with text usually have 3 variants: default (e.g. SetItemText), A-method (e.g. SetItemTextA), W-method (e.g. SetItemTextW). All methods can be used for Unicode text, but to avoid losses and unnecessary conversions use W-methods.
4) Existing non-Unicode RVF documents must be converted to Unicode by calling ConvertToUnicode after loading them (see below).

Code:
uses CRVData, RVItem, RVUni;
// changes required for TRichView v11+ are marked with red
procedure ConvertRVToUnicode(RVData: TCustomRVData);
var i,r,c, StyleNo: Integer;
    table: TRVTableItemInfo;
begin
  for i := 0 to RVData.ItemCount-1 do begin
    StyleNo := RVData.GetItemStyle(i);
    if StyleNo>=0 then begin
      if not RVData.GetRVStyle.TextStyles[StyleNo].Unicode then begin
        RVData.SetItemTextR(i, RVU_GetRawUnicode(RVData.GetItemTextW(i)));
        Include(RVData.GetItem(i).ItemOptions, rvioUnicode);
      end;
      end
    else if RVData.GetItemStyle(i)=rvsTable then begin
      table := TRVTableItemInfo(RVData.GetItem(i));
      for r := 0 to table.Rows.Count-1 do
        for c := 0 to table.Rows[r].Count-1 do
          if table.Cells[r,c]<>nil then
            ConvertRVToUnicode(table.Cells[r,c].GetRVData);
    end;
  end;
end;

procedure ConvertToUnicode(rv: TCustomRichView);
var i: Integer;
begin
  ConvertRVToUnicode(rv.RVData);
  for i := 0 to rv.Style.TextStyles.Count-1 do
    rv.Style.TextStyles[i].Unicode := True;
end;


How to make Unicode editor in TRichView v11 or newer in Delphi 2009 or newer
1) Unicode property of text styles and RTFReadProperties.UnicodeMode property of TRichView have the proper values by default. If you convert old projects, check them.
2) Methods working with text usually have 3 variants: default (e.g. SetItemText), A-method (e.g. SetItemTextA), W-method (e.g. SetItemTextW). Default method work with String, so you can use them for Unicode text.
2) Existing RVF documents saved by applications compiled with older versions of Delphi are automatically converted to Unicode when loading.

For all versions of Delphi
There are some events having TRVRawByteString parameters: OnItemAction, OnReadHyperlink, OnRVDblClick, OnRVRightClick, OnSaveItemToFile, OnItemTextEdit, OnDrawStyleText.
These parameters contain text in internal representation. For Unicode text, this is a "raw Unicode", with each Unicode character represented by 2 adjacent 1-byte characters.
You can use this function to convert them to String:
Code:
uses RVTypes, RVUni;
{$I RV_Defs.inc}
// Converting text from internal representation to String
function ConvertItemTextToString(const ItemText: TRVRawByteString;
  UnicodeItem: Boolean; CodePage: Cardinal): String;
begin
  {$IFDEF RVUNICODESTR} // <-- declared in RV_Defs.inc
  // Delphi 2009+: String is Unicode
  if UnicodeItem then
    Result := RVU_RawUnicodeToWideString(ItemText)
  else
    Result := RVU_RawUnicodeToWideString(
      RVU_AnsiToUnicode(CodePage, ItemText));
  {$ELSE}
  // Delphi 4-2007: String is ANSI
  if UnicodeItem then
    Result := RVU_UnicodeToAnsi(CodePage, ItemText)
  else
    Result := ItemText;
  {$ENDIF}
end;

ItemText - text to convert.
UnicodeItem - pass True if this text is from Unicode text item.
CodePage - code page for conversion, you can use RVStyle1.DefCodePage.

Additional information:
http://www.trichview.com/help/index.html?unicode_in_richview.html
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    trichview.com Forum Index -> Examples, Demos All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group