Your code can be simplified in several ways. I will write each step separately, so you can more easily adapt your code if you need additional functionality beyond the code shown here.
First, as I mentioned in previous post, you don't need to write getter and setter functions at all, if you just read or write field in those and noting more. First optimization would be removing all that redundant code. This is not just speed optimization, but also makes cleaner code that is easier to read and follow. This code is functionally completely equivalent to your declaration and you would create and initialize the form the same way you do now.
TTracksAddEditForm = class(TForm)
private
FsMode: string;
FiAlbum: integer;
FsTrack: string;
public
property sMode: string read FsMode write FsMode;
property iAlbum: integer read FiAlbum write FiAlbum;
property sTrack: string read FsTrack write FsTrack;
end;
Your next question was whether you need to have both getters and setters. If you are just setting property, then you don't need getter. Similarly, if you have read only property that you will just read, then you don't need setter.
So next optimization would be following. There is no difference in how you create and initialize your form.
TTracksAddEditForm = class(TForm)
private
FsMode: string;
FiAlbum: integer;
FsTrack: string;
public
property sMode: string write FsMode;
property iAlbum: integer write FiAlbum;
property sTrack: string write FsTrack;
end;
procedure TAudioForm.btnInsertTrackClick(Sender: TObject);
begin
TracksAddEditForm := TTracksAddEditForm.Create(Self);
TracksAddEditForm.sMode := 'Insert';
TracksAddEditForm.iAlbum := Albums.FieldByName('Index').AsInteger;
TracksAddEditForm.sTrack := TracksView.FieldByName('Title').AsString;
TracksAddEditForm.Show;
end;
But, the best way to initialize any class that you will construct through code (without bringing in dependency injection) would be declaring all required information as parameters to the constructor, Such code would also require different code when constructing form.
TTracksAddEditForm = class(TForm)
private
FsMode: string;
FiAlbum: integer;
FsTrack: string;
public
constructor Create(AOwner: TComponent; const AsMode: string; AiAlbum: integer; const AsTrack: string); reintroduce;
end;
procedure TAudioForm.btnInsertTrackClick(Sender: TObject);
begin
TracksAddEditForm := TTracksAddEditForm.Create(Self, 'Insert', Albums.FieldByName('Index').AsInteger, TracksView.FieldByName('Title').AsString);
TracksAddEditForm.Show;
end;
The advantage of passing all required data as parameters during construction process is that you cannot accidentally forget to initialize some required field. If some fields are optional, then you can stick to initializing through properties, but using simplified examples before this last one.