Im einfachsten Fall schreibst du statt record einfach Klasse und du bist was den Zugriff inkl. Schreiben angeht fertig.

Die einzige andere Änderung ist, dass du die Instanzen dann explizit mit Create erstellen musst, sprich
FItems[0] := TProgReleaseItem.Create;
, aber ich frage mich, ob du das überhaupt so möchtest. Mit dem Array ist das unnötig kompliziert.
Viel einfacher:
Delphi-Quellcode:
uses
System.Generics.Collections;
type
TProgReleaseItem = class
public
ProductID: Integer;
MachineTypeName: String;
ProgfieldName: String;
constructor Create(AProductID: Integer; AMachineTypeName: String; AProgfieldName: String);
end;
TProgRelease = class(TObjectList<TProgReleaseItem>)
end;
constructor TProgReleaseItem.Create(AProductID: Integer; AMachineTypeName: String; AProgfieldName: String);
begin
ProductID := AProductID;
MachineTypeName := AMachineTypeName;
ProgfieldName := AProgfieldName;
end;
var
Test: TProgRelease;
begin
Test := TProgRelease.Create(True);
try
Test.Add(TProgReleaseItem.Create(1, '2', '3'));
DoSomething(Test);
finally
Test.Free;
end;
end;
Natürlich wären ggf. propertys statt einfacher Felder sinnvoller, aber funktionieren tut es so.