Page 1 of 1

Can't load RTF in a table cell programmatically

Posted: Tue Apr 10, 2007 6:09 pm
by merovingian
Hi to everybody,
I've a dummy problem i can't solve.
I need to put RTF text in a table cell programmatically, so i'm trying to obtain the in place editor, for having the InsertRTFFromStreamEd method,
but i'm not able to obtain a GetRVData as TRichViewRVData.
This should-be-simple-code desn't work, probably i've missed something important...

Code: Select all

procedure TForm1.BitBtn3Click(Sender: TObject);

const RTFString='{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\fswiss\fcharset0 Arial;}}{\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\ul\b\f0\fs24 RTF Text\ulnone\b0\f1\fs20\par}';

var table: TRVTableItemInfo;
    stringStream: TStringStream;
    RVData: TCustomRVData;

begin
    RichViewEdit1.Clear;

    stringStream := TStringStream.Create(RTFString);
    try
      RichViewEdit1.InsertRTFFromStreamEd(stringStream);
      RichViewEdit1.InsertText(#13#13);

      table := TRVTableItemInfo.CreateEx(3,3, RichViewEdit1.RVData);
      try
        table.EditCell(1,1);
        RVData:=table.Cells[1,1].GetRVData;
        stringStream.WriteString(RTFString);

        if RVData is TRVEditRVData then
          (TRVEditRVData(RVData).RichView as TCustomRichViewEdit).InsertRTFFromStreamEd(stringStream);

      finally
        RichViewEdit1.InsertItem('', table)
      end;

    finally
      stringStream.Free;
    end;
end;
I'm using Delphi 2006 and TRichView 1.9.24.
Thank you very much for any advice.

Posted: Thu Apr 12, 2007 7:00 pm
by Sergey Tkachenko
You can load RTF directly in table cell before inserting table in the editor:

Code: Select all

procedure TForm3.ToolButton64Click(Sender: TObject);

const RTFString='{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\fswiss\fcharset0 Arial;}}{\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\ul\b\f0\fs24 RTF Text\ulnone\b0\f1\fs20\par}';

var table: TRVTableItemInfo;
    stringStream: TStringStream;

begin
    RichViewEdit1.Clear;

    stringStream := TStringStream.Create(RTFString);
    try
      RichViewEdit1.InsertRTFFromStreamEd(stringStream);
      RichViewEdit1.InsertText(#13#13);

      table := TRVTableItemInfo.CreateEx(3,3, RichViewEdit1.RVData);
      stringStream.Position := 0;
      table.Cells[1,1].Clear;
      table.Cells[1,1].LoadRTFFromStream(stringStream);
      RichViewEdit1.InsertItem('', table)

    finally
      stringStream.Free;
    end;
end;

Posted: Thu Apr 12, 2007 7:02 pm
by Sergey Tkachenko
Or you can use cell editing. But you can edit table cell only AFTER inserting the table in editor:

Code: Select all

procedure TForm3.ToolButton64Click(Sender: TObject);

const RTFString='{\rtf1\ansi\ansicpg1252\deff0\deflang1040{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}{\f1\fswiss\fcharset0 Arial;}}{\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\ul\b\f0\fs24 RTF Text\ulnone\b0\f1\fs20\par}';

var table: TRVTableItemInfo;
    stringStream: TStringStream;

begin
    RichViewEdit1.Clear;

    stringStream := TStringStream.Create(RTFString);
    try
      RichViewEdit1.InsertRTFFromStreamEd(stringStream);
      RichViewEdit1.InsertText(#13#13);
      table := TRVTableItemInfo.CreateEx(3,3, RichViewEdit1.RVData);
      RichViewEdit1.InsertItem('', table);
      table.EditCell(1,1);
      stringStream.Position := 0;
      RichViewEdit1.InsertRTFFromStreamEd(stringStream);

    finally
      stringStream.Free;
    end;
end;
This code and the code above insert exactly the same content.
The difference is in undo (the first example inserts table with content as one operation; the second example uses 2 operations for this) and in ending caret position.

Thank you very much!

Posted: Fri Apr 13, 2007 3:34 pm
by merovingian
I was sure the solution was as simple as it seemed... but i wasn't able to find it! :-)
I prefer the first solution you proposed.
Thank you again for your support, and congratulations for your work. It's a week I'm evaluating TRichView, and i found it very interesting.

byebye