Сохранение в файл:
AssignFile(F, 'pbook.dat');
Rewrite(f);
for i:=1 to StringGrid1.RowCount-1 do
begin
pb.firstname:=StringGrid1.Cells[1,i];
pb.lastname:=StringGrid1.Cells[2,i];
pb.phonenumber:=StringGrid1.Cells[3,i];
pb.adress:=StringGrid1.Cells[4,i];
Write(F,pb);
end;
CloseFile(F);
Зачем вам были нужны n и Seek? Почему выходите за границы StringGrid-а?
Чтение:
AssignFile(F, 'pbook.dat');
Reset(F);
StringGrid1.RowCount := FileSize(F) + 1; // Точно не помню
Seek(F, 0); // Может быть не нужен
i := 1;
while not eof(F) do
begin
with pb do
begin
Read(F,pb);
StringGrid1.Cells[1,i]:=firstname;
StringGrid1.Cells[2,i]:=lastname;
StringGrid1.Cells[3,i]:=phonenumber;
StringGrid1.Cells[4,i]:=adress;
Inc(i);
end;
end;
Прочитайте еще раз про циклы и как они работают. Про свойства объектов и нумерацию массивов.
Учитесь "читать код" - прокручивать в голове выполнение алгоритма.