Well, this kind of depends on what you mean by type of the value.
In OPC UA, the node has some value type. The type is identified by yet another Node in OPC UA address space. This "value type" is not available in UAAttributeData, but has to be obtained separately by reading the UAAttributeId.DataType attribute of the node (attribute number is 14, I am mentioning that as the enum-s are somewhat difficult to access from COM). What you get needs to be interpreted according to UA specs, and is not much usable without it, because for all standard types, it is a pre-defined NodeId that determines the actual type.
If what you ask for is somehow interpreting the type of the value that has actually arrived to the client from the server, then it should first be said that the value and its type go through a series of conversions, therefore a "precise" type may not be obtainable in this way. The value needs to be converted from UA encoding to a .NET type first. Then, some types are converted to their nearest CLS-compliant equivalents (CLS is a spec that restricts .NET for language interoperability). Further, the value needs to be converted to a COM Variant, and that is what ultimately gets transferred to Delphi.
UAAttributeData.ValueType simply looks at the value (after conversions to .NET/CLS), and returns its .NET type. What you get is a Type object (
msdn.microsoft.com/en-us/library/system.type(v=vs.110).aspx ). You can interrogate its properties, or you can convert it to string, as you suggested.
Similarly, there should be some way to figure out the value type from the .Value itself, but that depends on the language, and I am not a Delphi expert.
Best regards