Attributes are declared as classes descending from TCustomAttribute.
DemoAttribute = class(TCustomAttribute)
  FID : Integer;
  constructor Create(ID : Integer);
  property ID : Integer read FID write FID;
Attributes can be applied to almost any type, class, variable or method. The word attribute can be omitted from the attribute name when applying them.
TSomeClass = class
  FNamed : string;
  property Named : string read FName write FName;
  procedure DoStuff;
Further reading
Introductory Tutorials
Malcolm Groves (Emb.) introduces attributes.
Robert Love shows many of the places in your code where attributes can be placed.
Malcolm Groves (Emb.) demonstrates the IDE refactoring support for attributes.
Use cases
Malcolm Groves (Emb.) uses attributes to specify constraints for validation.
Robert Love uses attributes as part of his XML serialization of objects.
Craig Stuntz (TeamB) suggests the developer of the CodeHealer static analysis tool could detect attributes within your code as signals to ignore certain code sections.
The Doric Temple talks about using attributes within Object Relational Mappers.
Barry Kelly (Emb.) discusses when an enumerated type is more appropriate than an attribute.
Jordi Corbilla experiments with using attributes within DUnit test projects.
Francois Piette uses attributes to indicate which class properties and fields need to be persisted out to disk.
Primoz Gabrijelcic discovers an undocumented syntax feature allowing multiple attributes to be listed on the one line.
Lars Fosdal discovers that attributes do not work with generic types.