El fallo que te está ocurriendo es el siguiente:
Estás usando una factoría de Formularios a los cuales añades el nombre de la referencia de clase (en tu ejemplo, TForm2); cuando haces click y creas un formulario a partir de la referencia de clase tienes un formulario de tipo "TForm2" (que en realidad, es un puntero a un objeto de tipo formulario); sin embargo, al llamar al formulario 4, le pones estas líneas:
Código:
IF edit1.Text<>'' THEN
begin
form2.Edit1.Text:=edit1.Text; // <<<<< ¿Form2?
Aqui estás llamando a UNA VARIABLE de tipo TForm, que no ha sido creada en ningún sitio, por lo que te da el error de Access Violation.
Yo lo que haría en TForm4 es lo siguiente:
Código:
procedure TForm4.Button1Click(Sender: TObject);
begin
IF edit1.Text = '' THEN
showmessage('Debe llenar la caja');
else
close;
end;
Y en el propio formulario TForm2 es donde daría valor al EditBox:
Código:
procedure TForm2.Button1Click(Sender: TObject);
begin
Application.CreateForm(Tform4,form4);
try
form4.ShowModal;
self.Edit1.Text := Form4.Edit1.Text;
finally
form4.Free;
end;
end;
Espero haber sido claro
Un saludo