[...] "assigning" the property with data is permanent throughout the life of the object?
Yes, of course. Otherwise it would make little sense.
Suppose you want a class to hold some strings, kind of a "light" version of TStringList, which you could access either by their index of by looking up its contents:
type
TMyStrings = class
private
fStrings: TStringArray; {= "array of Strings"}
function GetItems(Index: Integer): String;
procedure SetItems(Index: Integer; AValue: String);
function GetIndexOf(What: String): Integer;
public
property Items[Index: Integer]: String read GetItems write SetItems;
property IndexOf[What: String]: Integer read GetIndexOf;
end;
We have implemented it by using a real array, though it doesn't really matters, and since it belongs to the object, whatever we do with it, it will be there as long as the instance itself exits, so we can for example add a string using:
MyStrings.Items[8] := 'Something or other';
which will invoke the setter:
procedure TMyStrings.SetItems(Index: Integer; AValue: String);
begin
if Length(fStrings) <= Index then
SetLength(fStrings, Index+1);
fStrings[Index] := AValue;
end;
and we can now retrieve it by turning around and doing:
StrIndex := MyStrings.IndexOf['Something or other'];
with the security that, if we programmed it properly, the later won't fail and
StrIndex will be eight ( 8 ).