Hola
Chris,
Yo sigo sin ver del todo la necesidad de los dos constructores. Bueno, entiendo que tengas razones para hacerlo y seguramente tienes razón, pero tu argumento de los distintos dataset no me convence

.
Yo también uso datasets distintos según si son para mostrar una lista de registros o si son para editar un registro. Aquí un ejemplo extraido de un caso real:
Inserción:
Código Delphi
[-]
begin
with TSolicitanteEditorForm.Create(Self) do
begin
SolicitudesDm.QSolicitante.Open;
SolicitudesDm.QSolicitante.Append;
if ShowModal = idOk then
begin
Self.txtRfc.Text := SolicitudesDm.QSolicitante['rfc'];
Self.txtApellidos.Text := SolicitudesDm.QSolicitante['apellidos'];
Self.txtNombre.Text := SolicitudesDm.QSolicitante['nombre'];
end;
end;
end;
Edición:
Código Delphi
[-]
var
SolicitanteId: Integer;
begin
SolicitanteId := QSolicitantesSesion['solicitante_id'];
SolicitudesDm.QSolicitante.Close;
SolicitudesDm.QSolicitante.ParamByName('id').AsInteger := SolicitanteId;
SolicitudesDm.QSolicitante.Open;
with TSolicitanteEditorForm.Create(Self) do
begin
SolicitudesDm.QSolicitante.Edit;
if ShowModal = idOk then
begin
QSolicitantesSesion.Refresh;
QSolicitantesSesion.Locate('id', SolicitanteId, []);
end;
end;
end;
En ambos casos se usa una dataset específico (QSolicitante) para editar los datos que se pone en modo de inserción o edición según la operación, y esto lo hace quien llama, no el editor en sí.
En el evento Show del formulario de edición se hace una ligera distinción entre edición e inserción:
Código Delphi
[-]
procedure TSolicitanteEditorForm.FormShow(Sender: TObject);
begin
if dsSolicitantes.DataSet.State = dsInsert then
Caption := 'Nuevo solicitante'
else if dsSolicitantes.State = dsEdit then
Caption := 'Datos del solicitante';
end;
pero el resto del formulario funciona igual tanto en uno como en otro caso. Aun suponiendo que tuviera muchas distinciones entre inserción y edición (que, insisto, no veo porqué habría de ser así) haría algo como esto:
Código Delphi
[-]
procedure TSolicitanteEditorForm.FormShow(Sender: TObject);
begin
if dsSolicitantes.DataSet.State = dsInsert then
InicializaInserción()
else if dsSolicitantes.State = dsEdit then
InicializaEdicion();
end;
// Saludos