Page 1 of 1

Internal Hyperlink in RTF documents

Posted: Fri Oct 05, 2007 10:28 am
by matteop
Hello,
I've searched the forum but I've not found any example matching my question. I've to create run time an RTF document with internal links and I dont know the functions of the TRichView component Ive to call to
- create the link. I think the RTF code maybe like this:

Code: Select all

{\field{\*\fldinst HYPERLINK \\l "_Recording_List" }{\fldrslt \pard\f0\fs20\cf0 Element2}}
- create the anchor where the previous link points, with a code like this (I think):

Code: Select all

{\*\bkmkstart _Recording_List}{\*\bkmkend _Recording_List}Element5
Any suggestion?

Thanks in advance,

Matteo

Posted: Sat Oct 06, 2007 7:39 am
by Sergey Tkachenko
This feature is much better implemented in the latest version available for registered users, than in the trial version.

1) Bookmarks.
RichView checkpoints are saved in bookmarks. Checkpoint name is used as bookmark name. The trial version can save bookmark. The last version can save and load them.

2) Links to bookmarks.
The last version automatically saves the link "#_Recording_List" as link to "_Recording_List" bookmark (and performs a reverse operation when loading). So standard code for OnReadHyperlink and OnWriteHyperlink is enough:

Code: Select all

procedure TfrmMain.rveReadHyperlink(Sender: TCustomRichView; const Target,
  Extras: String; DocFormat: TRVLoadFormat; var StyleNo, ItemTag: Integer;
  var ItemName: String);
begin
  ItemTag := Integer(StrNew(PChar(Target)));
end;

procedure TfrmMain.rveWriteHyperlink(Sender: TCustomRichView; id: Integer;
  RVData: TCustomRVData; ItemNo: Integer; SaveFormat: TRVSaveFormat;
  var Target, Extras: string);
begin
  Target := PChar(RVData.GetItemTag(ItemNo));
end;
In trial version, you can use OnWriteHyperlink event to add "\l" in Extras when necessary (but, as far as I know, it is not necessary in new versions of MS Word, they should understand "#"-links as well)

Update 2011-Oct-22: Starting from TRichView 13.3, the code must be:

Code: Select all

procedure TfrmMain.rveReadHyperlink(Sender: TCustomRichView; const Target, 
  Extras: String; DocFormat: TRVLoadFormat; var StyleNo: Integer;
  var ItemTag: TRVTag; var ItemName: String); 
begin 
  ItemTag := Target; 
end; 

procedure TfrmMain.rveWriteHyperlink(Sender: TCustomRichView; id: Integer; 
  RVData: TCustomRVData; ItemNo: Integer; SaveFormat: TRVSaveFormat; 
  var Target, Extras: string); 
begin 
  Target := RVData.GetItemTag(ItemNo); 
end;

Posted: Sun Oct 07, 2007 10:43 am
by matteop
Hi and thanks for the answers!

So, to create the RTF with the hyperlinks (without user input but all in the program's code) I've to add a tag to write the hyperlink and add a bookmark to write the anchor where the hyperlink points, right?

Posted: Sun Oct 07, 2007 12:52 pm
by Sergey Tkachenko
Yes.

Posted: Mon Oct 08, 2007 8:44 am
by matteop
Sergey Tkachenko wrote:This feature is much better implemented in the latest version available for registered users, than in the trial version.
I'm using a registered 1.9.15 version

Ok, after some experiments I've an almost working code, writing this string:

Code: Select all

{\field{\*\fldinst HYPERLINK "1" \\l}{\fldrslt \plain \f1\ul\fs20\cf11 LINK}}
but when I click on the link it try to open a 1.rtf file, instead with

Code: Select all

{\field{\*\fldinst HYPERLINK \\l "1" }{\fldrslt \plain \f1\ul\fs20\cf11 LINK}}
it would be correct.

I've solved with

Code: Select all

procedure TmainForm.exporteditWriteHyperlink(Sender: TCustomRichView;
  id: Integer; RVData: TCustomRVData; ItemNo: Integer;
  SaveFormat: TRVSaveFormat; var Target, Extras: String);
begin
   Extras := '\l' + '"' + IntToStr((RVData.GetItemTag(ItemNo)))+ '"';
   Target := '';
end;

Thanks!

Matteo

Posted: Tue Oct 09, 2007 12:52 pm
by Sergey Tkachenko
I recommend to upgrade to the newer version.
I can open access to the protected section of this form for you. Send me a private message with e-mail address you used when ordered TRichView.

some more explanation?

Posted: Thu Oct 11, 2007 4:50 pm
by Usch Wildt
Hello,

I also need internal references in documents, but I don't understand you explanations in this topic.
I know how to create a Checkpoint, but how can I create a link to this checkpoint? Where and to what do I add the "{\field{...". If I just add it as text, it is just text of course. Does it have to be a tag of some item or how(where/to what do I have to add it?
Could you give a small code example?

Thank you very much!

Usch Wildt

Posted: Thu Oct 11, 2007 7:02 pm
by Sergey Tkachenko
You do not need to worry about RTF fields, TRichView saves all this stuff automatically.

As for checkpoints, see RichView Items' "Checkpoints" Overview in the help file. In editor, they are inserted with SetCurrentCheckpointInfo. The latest version also has an alternative method InsertCheckpoint.
Checkpoints have names, these names are stored in RTF as bookmark names (checkpoints also have tags, but they are not stored in RTF)
The only difference between checkpoints and RTF bookmarks: checkpoints define the specific position, not a text fragment like bookmark.

As for links, process them just like external links. Just add '#' to the beginning of target. I.e., if checkpoint name = 'abc', link target must be '#abc'. TRichView will save such links correctly both in HTML (no conversion is needed) and RTF (by converting them to links to bookmarks).
The latest version is required for automatic local links conversion and for loading bookmarks from RTF.

reference with dynamic text?

Posted: Fri Oct 12, 2007 8:27 am
by Usch Wildt
Hi,

thank you for your quick answer!
Unfortunately I think I need bookmarks on a text fragment, noit only a position, because I would like to make dynamic text references like "see chapter xxx", where xxx is the text of the chapter title, and the text "see chapter xxx" changes to "see chapter yyy", when the chapter title is changed from xxx to yyy.
And - if possible - all this should survive an export to Word; so I would like to have fields like {REF _Ref123 \r \h } and {REF _Ref123 \h } in Word.
Is that possible?

Thanks a lot!

Usch Wildt

Posted: Fri Oct 12, 2007 6:07 pm
by Sergey Tkachenko
Unfortunately, references are not supported yet.
You can insert RTF code in the specific place of document in 2 ways:
1) Insert text with rvteoRTFCode in Options of text style (and protected, so that user cannot edit it)
2) Insert some component, and use OnSaveComponentToFile event.