Here is a slightly cleaner way without resorting to StrNew()/StrDispose():
var tag: Pointer;
tag := nil;
string(tag) := 'yourstringhere';
TButton.Tag := PtrInt(tag);
var tag: Pointer;
tag := Pointer(TButton.Tag);
Somestring := string(tag);
...
string(tag) := '';
As someone who is still learning, I find this example very instructive into how Pointers operate. Thanks for sharing.