@Dave Novo
Dave - many thanks for the heads up. Following your advice, I resorted to RegEx, using the following code, and it works well for me. I posted the code here, in case someone may have the same needs. Thanks again.
procedure MyFunkyRegExProcedure;
const
sUrlRegEx: String =
'^'#10 +
'(# Scheme'#10 +
' [a-z][a-z0-9+\-.]*:'#10 +
' (# Authority & path'#10 +
' //'#10 +
' ([a-z0-9\-._~%!$&''()*+,;=]+@)? # User'#10 +
' ([a-z0-9\-._~%]+ # Named host'#10 +
' |\[[a-f0-9:.]+\] # IPv6 host'#10 +
' |\[v[a-f0-9][a-z0-9\-._~%!$&''()*+,;=:]+\]) # IPvFuture host'#10 +
' (:[0-9]+)? # Port'#10 +
' (/[a-z0-9\-._~%!$&''()*+,;=:@]+)*/? # Path'#10 +
' |# Path without authority'#10 +
' (/?[a-z0-9\-._~%!$&''()*+,;=:@]+(/[a-z0-9\-._~%!$&''()*+,;=:@]+)*/?)?'#10 +
' )'#10 +
'|# Relative URL (no scheme or authority)'#10 +
' ([a-z0-9\-._~%!$&''()*+,;=@]+(/[a-z0-9\-._~%!$&''()*+,;=:@]+)*/? # Relative path'#10 +
' |(/[a-z0-9\-._~%!$&''()*+,;=:@]+)+/?) # Absolute path'#10 +
')'#10 +
'# Query'#10 +
'(\?[a-z0-9\-._~%!$&''()*+,;=:@/?]*)?'#10 +
'# Fragment'#10 +
'(\#[a-z0-9\-._~%!$&''()*+,;=:@/?]*)?'#10 +
'$';
begin
var LRegEx := TRegEx.Create(sUrlRegEx, [roIgnoreCase, roIgnorePatternSpace]);
var LMatch := LRegEx.Match(FUrl);
end;