If the current use of the tag doesn't require the full range of values, then perhaps Clive's second suggestion is a workable solution.
E.g. If tags range from 1 to 999 now, and you need to "piggy-back" additional numbers from 1 to 999 (although trying to manage more than a few configurations is bound to be rather difficult), then you could use tags like 1001, 1002, 1003, 2001, 2002, 2003, etc.
Otherwise I don't know of any other way than to create custom components. I'm told that it's not too difficult, although I have never done it myself.
Good luck.
By the way, how are you planning to use an integer for access control. Say, for example, you have 6 fields and 6 classes of users where each class of user sees a different set of four of the fields. I can visualize assigning codes of 1, 2, 4, 8, 16, and 32 to each of the user classes and then assigning values of 15, 30, 27, etc. to the number. This seems rather cumbersome and error-prone. I'm not sure, but I think if I were doing something like that (6 fields 6 type of users), I would probably have some code that puts the names of the four specific fields per user type (concatenated with an access ID number) into an TStringList at design time. Then during execution I would loop thru the components on the form, looking up in the TStringList to see whether to hide (not found) or show (found) the fields one by one. I think this "scales up" (handles growth when additional items need to be handled for security sake) better than using an integer as well.
Here is some sample code that may give you some ideas:
Code:
var
SecurityAssignments:TStringList;
procedure TForm1.Button1Click(Sender: TObject);
var
SecurityID:string;
begin;
if not Assigned(SecurityAssignments) then
SecurityAssignments := TStringList.Create;
SecurityAssignments.Clear;
SecurityId := '1';
SecurityAssignments.Add(SecurityId + 'dfFieldA');
SecurityAssignments.Add(SecurityId + 'dfFieldB');
SecurityAssignments.Add(SecurityId + 'dfFieldC');
SecurityAssignments.Add(SecurityId + 'dfFieldD');
SecurityID := '2';
SecurityAssignments.Add(SecurityId + 'dfFieldB');
SecurityAssignments.Add(SecurityId + 'dfFieldD');
SecurityAssignments.Add(SecurityId + 'dfFieldE');
SecurityAssignments.Add(SecurityId + 'dfFieldF');
if SecurityAssignments.IndexOf('2dfFieldD') >= 0 then
ShowMessage('dfFieldD ok for security ID 2');
end;