При беглом просмотре в глаза бросилось следующее:
procedure TForm2.Button1Click(Sender: TObject);
begin
OpenDialog1.Execute;
if(OpenDialog1.FileName <> '') then begin
Nametext:= FileUtil.UTF8ToSys(OpenDialog1.FileName);
Form3.ShowModal;
end;
end;
Первое. Делать не просто
Execute, а
if OpenDialog.Execute then begin ... - в этом случае, если пользователь выбрал файл, но нажал кнопку в диалоге "Отмена", то событие Execute возвращает False. А так у вас может возвращать в качестве имени файла мусор.
Второе.
UTF8ToSys - зачем? Диалог и так работает в системной кодировке, и возвращает имя файла в ней же.