<< Click to Display Table of Contents >> Navigation: Programming > Objects > Hyperlinks |
Certain texts can be interactive in WPTools - this means the text can be automatically highlighted when the mouse is moved over it (hover or "hot" effect) or an event can be triggered when the user clicks on it.
The standard interactive texts are hyperlinks.
Hyperlinks in WPTools Version 9 start with a hyperlink start tag <a> and end with a closing tag </a>. All these tags are represented by TWPTextObj instances. (These tags can be made visible using the 'FormatOptions'!) To read the hyperlinks URL use obj.Source, to modify the visible text change obj.EmbeddedText!
This code can be used to create a hyperlink:
WPRichText1.InputHyperlink('WPTOOLS','BOOK1').
Since hyperlinks are marked with paired TWPTextObj instances it is also possible to create those tags directly by code. This is very useful if you are creating the text using the low level paragraph procedures:
var par : TParagraph;
link_tag : TWPTextObj;
begin
par := WPRichText1.ActiveText.AppendNewPar();
par.Append('This is a link: '); // Some Text
// Create a link
link_tag := par.AppendNewObjectPair(wpobjHyperlink,'WPCubed GmbH');
link_tag.Source := 'http://www.wpcubed.com';
// to display:
WPRichText1.Refresh;
end;
Note: The above code uses the function AppendNewObjectPair´. This function internally executes code similar to this example:
startobj := par.AppendNewObject(wpobjHyperlink,true,false); // Opening
par.Append('WPCubed GmbH'); // some text
endobj := par.AppendNewObject(wpobjHyperlink,true,true); // Closing
endobj.SetTag(startobj.NewTag); // Link Opening<->Closing
startobj.Source := 'http://www.wpcubed.com'; // The URL
Hyperlink tags can have a style attached. This style can be a paragraph style:
startobj.StyleName := ParStyleName; // set a reference to a paragraph style
If no style name was specified the list of paragraph styles will be searched for a style with the name "A".
Alternatively the style can be defined directly in the TWPTextObj instance:
startobj.MakeStyle(true);
startobj.Style.ASet(WPAT_CharFontSize, 2200); // create a large font
startobj.Style.ASetColor(WPAT_CharColor, clRed); // as red text
startobj.Style.ASetColor(WPAT_CharBGColor, clYellow); // on yellow background
startobj.Style.ASetFontName('Courier New');
Please note that these style definitions have a lower priority than the text attributes defined for the enclosed characters (this are the attributes which have been assigned to the text) and the attributes defined in the property AutomaticTextAttr. They are only loaded and saved in the WPTOOLS format, not in RTF format.
React on the click on hyperlinked text: Event OnClickHotText
procedure TForm1.WPRichText1HyperLinkEvent(Sender: TObject; text,
url: String; IgnoredNumber: Integer);
begin
if Pos('http:',url)>0 then
ShellExecute(Handle, 'open', PChar(url), '', '', SW_SHOW );
end;
This event is executed after a dounble click on hyperlinked text. It will be triggered after a single click if the property 'OneClickHyperlink' has been set to true.
React on the click on hyperlinked text: Event OnClickHotText
procedure TForm1.WPRichText1ClickHotText(Sender: TObject; par: TParagraph;
posinpar, X, Y: Integer; Button: TMouseButton; Shift: TShiftState;
TxtObj: TWPTextObj);
begin
if TxtObj.ObjType=wpobjHyperlink then
begin
WPRichText1.BookmarkMoveTo(TxtObj.Source);
end;
end;
this bookmark was created with WPRichText1.BookmarkInput('BOOK1');
Which types of text objects are clickable is always controlled by property ClickableCodes. This means the event can be also created for text which has been wrapped by merge fileds, bookmarks or span codes. The event OnClickHotText is always triggered by a single click.
Please note that in WPTools Version 9 hyperlinks are not represented by text with a certain attribute (asfHyperlink) followed by hidden text (afsHidden) as it was in WPTools 4 and before!
How to display visited hyperlinks in a different color:
We use the property
WPRichText1.HyperlinkTextAttr.UseOnGetAttrColorEvent := TRUE;
and a string list:
FVisitedHyperlinks := TStringList.Create;
In the hyperlink event we add URLs to the stringlist to know later if the link was already clicked:
procedure TForm1.WPRichText1HyperLinkEvent(Sender: TObject; text,
url: string; IgnoredNumber: Integer);
begin
FVisitedHyperlinks.Add(url);
if Pos('www', url) > 0 then
ShellExecute(Handle, 'open', PChar(url), '', '', WM_SHOWWINDOW);
end;
Now we can use the OnGetAttributeColor event to modify the special text attribute 'on the fly':
procedure TForm1.WPRichText1GetAttributeColor(Sender: TObject;
var CharStyle: TCharacterAttr; par: TParagraph; posinpar: Integer);
var txtobj : TWPTextObj;
begin
txtobj := WPRichText1.CodeInsideOf(par,posinpar,wpobjHyperlink);
if txtobj<>nil then
begin
if FVisitedHyperlinks.IndexOf(txtobj.Source)>=0 then
CharStyle.TextColor := clGreen;
end;
end;
The reference CharStyle: TCharacterAttr which is passed to the event is a reference to a copy of the HyperlinkTextAttr property object. We can modify it without any sideffect to the other links in the text. But please do not modify the reference, just the properties of this object!
This technique can be also used for other 'special texts' - but the property UseOnGetAttrColorEvent must be always set to true to activate the feature.