Page 1 of 2

Openening a RVF file

Posted: Tue Feb 21, 2012 2:48 pm
by Gismo
Hello proffesionals,

there is a bit of text inside a RVF file i want to have shown in Memo in delphi.
Also in this file are some images. But these images dont want to have shown.
Does anyone know if this is possible? And maybe have the code to do so? I got a RVF example file here and can send it to you if you need it.

With kind regards,

Gismo.

Posted: Tue Feb 21, 2012 7:37 pm
by Sergey Tkachenko
You cannot show RVF file without loading it in RichViewEdit (using LoadRVF method). Then you can export it to TMemo.

For Delphi 2009 or newer:

Code: Select all

var Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  RichViewEdit1.SaveTextToStreamW('', Stream, 80, False, False);
  Stream.Position := 0;
  Memo1.Lines.LoadFromStream(Stream, TEncoding.Unicode);
  Stream.Free;
end;
For older versions of Delphi:

Code: Select all

var Stream: TMemoryStream;
begin
  Stream := TMemoryStream.Create;
  RichViewEdit1.SaveTextToStream('', Stream, 80, False, False);
  Stream.Position := 0;
  Memo1.Lines.LoadFromStream(Stream);
  Stream.Free;
end;

Posted: Thu Feb 23, 2012 10:02 am
by Gismo
I still got a little problem since i want to use it in a while loop with over 6000 RVF files and place all the text of all the rvf's with additional text into the memo. But it seems te rewrite the memo and ends with a Eaccessviolation.

Posted: Thu Feb 23, 2012 1:22 pm
by Gismo
The problem is ound in the RVF file seems to be a image. Does anyone know how i could remove the images automaticly?

Posted: Thu Feb 23, 2012 4:42 pm
by Sergey Tkachenko
There should be no access violations.
Can you post your code?

Posted: Fri Feb 24, 2012 8:05 am
by Gismo

Code: Select all

 try with table1 do begin {table with 6000 records}
table1.open;  
     while not table1.eof do

       {rvf file that matches a variable of the table}
       richviewedit1.Clear;
       richviewedit1.Style := rvstyle1;
       if FileExists(filename) then begin
       richviewedit1.LoadRVF(filename);
       end;
       richviewedit1.Format;


       Stream := TMemoryStream.Create;
       RichViewEdit1.SaveTextToStream('', Stream, 80, False, False);      
      {^seems to cause the eaccessviolation}
       Stream.Position := 0;
       memo1.lines.add(text);
       Memo1.Lines.LoadFromStream(Stream, TEncoding.Unicode); 
       memo1.lines.add(text);

       Stream.Free;

       memo1.Lines.add('---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------')

table1.next; 
end;
finally
 if Memo1.Lines.Count > 0 then
      Memo1.Lines.Delete(Memo1.Lines.Count - 1 );


   table1.filtered := false;
   table1.close;
end;
'

i tried to copy the code that mathers from my code so might be that i miss a end or something. In anycase it seems tat the loading the RVF goes ok since i checked that myself.

Though it seems it cant put it into a stream. I think this could be cause it contains a picture.

This isnt much of a problem since i need the text without pictures anyway. I just dont know yet how to remove the pictures from the richviewedit.

Posted: Fri Feb 24, 2012 4:13 pm
by Sergey Tkachenko
If you use LoadFromStream(Stream, TEncoding.Unicode), you need to save using SaveTextToStreamW instead of SaveTextToStream.

Did it help?

Posted: Fri Feb 24, 2012 5:00 pm
by Gismo
to bad i cant test it out now. but does this saves it in the stream without the images? since i need to remove those images in the end anyway :)

Posted: Sat Feb 25, 2012 6:56 pm
by Sergey Tkachenko
It saves as a plain text, without images or formatting.

Posted: Mon Feb 27, 2012 9:51 am
by Gismo
I tried it but it didnt work out sadly. Though i managed to get all the code causing the eaccessviolation error in a single button click for testing. If needed i could give the file that might be causing the error. ill keep on tring to find the error. i posted the button code below.

Code: Select all


var
i: integer;
mychar: char;
Stream: TMemoryStream;
begin
richviewedit1.Clear;
richviewedit1.Style := rvstyle1;
richviewedit1.LoadRVF('c:\memo2_4796.rvf');
richviewedit1.Format;
Stream := TMemoryStream.Create;
RichViewEdit1.SaveTextToStreamw('', Stream, 80, False, False);
Memo1.Lines.LoadFromStream(Stream);
Stream.Position := 0;
memo1.Lines.add('---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------');
stream.Free;

end;
I still get the error on the save to stream part. If needed i can provide the file that could be causing it. Ill keep looking to solve the problem myself aswel.

Posted: Mon Feb 27, 2012 10:06 am
by Gismo
im using delphi 7

Posted: Mon Feb 27, 2012 1:04 pm
by Sergey Tkachenko
Is it possible to reproduce this problem in a sample project?

Posted: Mon Feb 27, 2012 2:11 pm
by Gismo
i hope this is what you mean with reproduce in a sample project.
I now made a form with 2 buttons 1 memo 1 richviewedit and a rvstyle.
button1 loads the file
button2 transfers the file to the memo causing a eaccessviolation error
the code looks like this

Code: Select all

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, RVScroll, RichView, RVEdit, RVStyle;

type
  TForm1 = class(TForm)
    RichViewEdit1: TRichViewEdit;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    RVStyle1: TRVStyle;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

richviewedit1.Clear;
richviewedit1.Style := rvstyle1;
richviewedit1.LoadRVF('c:\artikels.db_memo2_220.rvf');
RichViewedit1.DeleteUnusedStyles(True, True, True);
richviewedit1.Format;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
RichViewEdit1.SaveTextToStreamw('', Stream, 80, False, False);
Stream.Position := 0;
memo1.Lines.LoadFromStream(stream);
stream.Free;
end;

end.

Posted: Mon Feb 27, 2012 2:14 pm
by Gismo
i tried it with the W after savetostream but it ended up with only passing me the first letter of the text (on a rvf file that doesnt have the error) also i found a couple of more files also having this problem they all have the same thing in commen and that is that there is a table or a picture or anything like that present.

Posted: Mon Feb 27, 2012 3:03 pm
by Gismo
seems like i have found a selution by changing
RichViewEdit1.SaveTextToStream('', Stream, 80, False, False);
to
RichViewEdit1.SaveTextToStream('', Stream, 80, False, true);
i should read the parameters better before i use them :). thanks for your time helping a delphi starter :D