No entiendo tu problema con la clave. Estamos hablando de la llave primaria ¿no? Entonces no debería editarse ¿o sí?
Bueno, como alguna vez he intentado hacer estas cosas es, primero que nada, usando una llave primaria artificial (un entero autoincremental, por ejemplo) para no caer en el caso de tener que editarla.
Cada objeto del negocio desciende de una clase común:
Código:
TObjetoNegocio = class
public
property Id;
procedure Load(Id: Integer); virtual; abstract;
procedure Save; virtual; abstract;
procedure Delete; virtual; abstract;
end;
Cada clase redefine los métodos para construir las sentencias SQL adecuadas y mandarlas al DataModule. El método Save es dual, sirve para insertar y modificar. Si el ID es 0, quiere decir que el objeto es nuevo y se requiere un INSERT. En caso contrario, quiere decir que ya existe en la base y se requiere un UPDATE.
Siguiendo tu ejemplo, se procedería así:
Código:
Empresa := TEmpres.Create();
try
Empresa.Load(EmpresaId);
if TViewEmpresa.Editar(Empresa) then
Empresa.Save;
finally
Empresa.Free;
end;
TViewEmpresa.Editar sería un método de clase que es el que se encarga de construir el visor y pasarle el objeto Empresa. Esto para evitar tener que construir explícitamente el visor en cada edición que se requiera.
---------
El paso de datos entre el objeto y los controles yo creo que es mucho más difícil. Una aproximación podría ser usar RTTI para inspeccionar las propiedades publicadas del objeto y llenar con ellas los controles con el mismo nombre.
// Saludos