Asunto: Enlazar aplicación Delphi con aplicación C# CSharp
Tengo dos aplicaciones, tengo el código fuente de ambas, una está desarrolada en Delphi 6 y la otra en Visual C# CSharp. La de Delphi es una aplicación de Facturación y la de C# es una aplicación de contabilidad.
Lo que quiero es pasar tres valores de la de Delphi a la de C# (del programa de facturación al de contabilidad). Desde el programa de facturación (delphi) quiero ejecutar el programa de contabilidad mostrando una única ventana con los datos del de facturación para integrarlos en contabilidad.
¿Cómo podría hacer esto? he visto varios métodos pero ninguno me gusta: usando el regedit, usando un fichero "temporal", etc. El problema es que quiero tener el "control" y la certeza absolutas de que se ha ejecutado la ventana de contabilidad y, además, quiero que cuando se pulse el botón desde el programa Delphi para abrir el de contabilidad no se pueda tocar nada en el de Delphi hasta que se haya cerrado la ventana de C# de contabilidad ¿esto es posible?
Publicado:
Mar Feb 21, 2012 6:39 am
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Enlazar aplicación Delphi con aplicación C# CSharp
Anuncios
varios escribió:
Tengo dos aplicaciones, tengo el código fuente de ambas, una está desarrolada en Delphi 6 y la otra en Visual C# CSharp. La de Delphi es una aplicación de Facturación y la de C# es una aplicación de contabilidad.
Lo que quiero es pasar tres valores de la de Delphi a la de C# (del programa de facturación al de contabilidad). Desde el programa de facturación (delphi) quiero ejecutar el programa de contabilidad mostrando una única ventana con los datos del de facturación para integrarlos en contabilidad.
¿Cómo podría hacer esto? he visto varios métodos pero ninguno me gusta: usando el regedit, usando un fichero "temporal", etc. El problema es que quiero tener el "control" y la certeza absolutas de que se ha ejecutado la ventana de contabilidad y, además, quiero que cuando se pulse el botón desde el programa Delphi para abrir el de contabilidad no se pueda tocar nada en el de Delphi hasta que se haya cerrado la ventana de C# de contabilidad ¿esto es posible?
Efectivamente puedes usar varios métodos para esto, en nuestro caso te recomendamos que ejecutes la aplicación C# desde Delphi con "WaitForSingleObject", este procedimiento detendrá la ejecución de tu programa Delphi hasta que no se haya cerrado el de C# ejecutado desde Delphi. Por supuesto le pasarás los parámetros que quieras a la aplicación C# desde la de Delphi. En la de C# te recomendamos que uses un fichero de texto plano para escribir el resultado de la ejecución del de C#, cuando el usuario haya cerrado la aplicación C# desde la de Delphi podrás abrir el fichero creado por la de C# y actuar según su valor.
A continuación te mostramos el código de la aplicación Delphi que hace todo esto, ejecuta la aplicación C# con los parámetros que queramos, espera a que se cierre y luego ejecuta otro código en función del contenido del fichero que se haya creado en C#:
Código:
ficheroEjecutar :=
IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) +
'GISAMRRHH.exe';
if not FileExists (ficheroEjecutar) then
begin
MessageDlg('Para poder insertar esta solicitud en Control de Presencia ' +
'debe tener el fichero "GISAMRRHH.exe" en la carpeta: ' + chr(13) +
ExtractFilePath(Application.ExeName) + chr(13) +
'Contacte con el departamento de NNTT.', mtWarning, [mbok], 0);
end
else
begin
parametro1 := mdRRHH.tcRRHHSolicitudreferencia.AsString;
if parametro1 = '' then
MessageDlg('Faltan datos por introducir para insertar la incidencia '+
'en Control de Presencia: referencia de la solicitud.',
mtWarning, [mbok], 0)
else
begin
parametro2 := obtenerCampo(mdRRHH.tcRRHHSolicitudcodigousuario.AsInteger,
vtTablaUsuario, 'dni');
if parametro2 = '' then
MessageDlg('Faltan datos por introducir para insertar la incidencia '+
'en Control de Presencia: código de usuario.',
mtWarning, [mbok], 0)
else
begin
parametro3 := obtenerCampo(mdRRHH.tcRRHHSolicitudcodigotipo.AsInteger,
vtTablaRRHHSolicitudTipo, 'codigoexterno');
if parametro3 = '' then
MessageDlg('Faltan datos por introducir para insertar la incidencia '+
'en Control de Presencia: código del tipo de solicitud.',
mtWarning, [mbok], 0)
else
begin
DecodeDate (mdRRHH.tcRRHHSolicituddesde.AsDateTime, ano, mes, dia);
parametro4 :=
llenarCadena (IntToStr(ano), 4, '0', false) +
llenarCadena (IntToStr(mes), 2, '0', false) +
llenarCadena (IntToStr(dia), 2, '0', false);
if parametro4 = '00000000' then
MessageDlg('Faltan datos por introducir para insertar la incidencia '+
'en Control de Presencia: fecha desde.',
mtWarning, [mbok], 0)
else
begin
DecodeDate (mdRRHH.tcRRHHSolicitudhasta.AsDateTime, ano, mes, dia);
parametro5 :=
llenarCadena (IntToStr(ano), 4, '0', false) +
llenarCadena (IntToStr(mes), 2, '0', false) +
llenarCadena (IntToStr(dia), 2, '0', false);
if parametro5 = '00000000' then
MessageDlg('Faltan datos por introducir para insertar la incidencia '+
'en Control de Presencia: fecha hasta.',
mtWarning, [mbok], 0)
else
begin
if mdRRHH.tcRRHHSolicitudacuentaanoanterior.AsString = 'S' then
parametro6 := 'S'
else
parametro6 := 'N';
parametro7 := mdRRHH.tcRRHHSolicitudobservacionusuario.AsString;
parametro7 := AnsiReplaceStr(parametro7, #10, ' ');
parametro7 := AnsiReplaceStr(parametro7, #13, '');
numProceso := ejecutarProceso (ficheroEjecutar, parametros);
if numProceso <> 0 then
WaitForSingleObject (numProceso, INFINITE);
Application.Restore;
nombreFicheroCP := IncludeTrailingPathDelimiter (ExtractFilePath(Application.ExeName)) +
IncludeTrailingPathDelimiter ('Control_Presencia')
+ 'incidencia_' + parametro1 + '.inc';
if FileExists(nombreFicheroCP) then
begin
ficheroResultadoCP := TStringList.Create;
ficheroResultadoCP.LoadFromFile(nombreFicheroCP);
if ficheroResultadoCP.Count > 0 then
begin
resultadoCP := UTF8Decode(ficheroResultadoCP.Strings[0]);
if resultadoCP = 'Inserción correcta' then
begin
insertarLogIncidenciaRRHH(vtCodigoUsuario, 'Inserción Control Presencia', now,
mdRRHH.tcRRHHSolicitudcodigo.AsInteger, mdRRHH.tcRRHHSolicituddesde.AsDateTime,
mdRRHH.tcRRHHSolicitudhasta.AsDateTime,
'Insertada incidencia en Control de Presencia', 0, 'N',
'Incidencia de GISAM RRHH insertada en software externo ' +
'de Control de Presencia');
//actualizar check como insertada en control de presencia
actualizarControlPresenciaSolicitud(mdRRHH.tcRRHHSolicitudcodigo.AsInteger);
end;
end;
end;
end;
end;
end;
end;
end;
end;
La aplicación C#, desde la que escribiremos el resultado en el fichero sería algo así:
En el evento "Load" del formulario de Visual C#:
Código:
//comprobamos si se han pasado parámetros
if (Environment.GetCommandLineArgs().Length > 1)
codigoIncidenciaGISAM = Environment.GetCommandLineArgs()[0];
else
codigoIncidenciaGISAM = "";
//Si son 7 parámetros es una inserción de incidencia
if (Environment.GetCommandLineArgs().Length == 7)
{
String[] parametros = Environment.GetCommandLineArgs();
Text = "GISAM RRHH Inserción de incidencia " +
codigoIncidenciaGISAM + " en Control de Presencia";
/* for (int i = 0; i < parametros.Length; i++)
{
MessageBox.Show("Parámetro " + parametros[i]);
} */
}
else
{
MessageBox.Show("No se han pasado los valores desde GISAM. " +
"Esta aplicación sólo puede usarse desde GISAM RRHH.",
"Faltan datos",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Application.Exit();
}
La función C# para escribir texto en un fichero de texto sin formato:
Código:
private void escribirFichero (string texto)
{
//obtenemos la carpeta y ejecutable de nuestra aplicación
string rutaFichero = System.AppDomain.CurrentDomain.BaseDirectory;
//obtenemos sólo la carpeta (quitamos el ejecutable)
string carpeta = Path.GetDirectoryName(rutaFichero);
carpeta = Path.Combine(carpeta, "Control_Presencia");
//Montamos la carpeta y el fichero temporal con el
//primer parámetro que es el código de solicitud
rutaFichero = Path.Combine(carpeta, "incidencia_" +
codigoIncidenciaGISAM + ".inc");
try
{
//si no existe la carpeta temporal la creamos
if (!(Directory.Exists(carpeta)))
{
Directory.CreateDirectory(carpeta);
}
if (Directory.Exists(carpeta))
{
//Creamos el fichero temporal y
//añadimos el texto pasado como parámetro
System.IO.StreamWriter ficheroTemporal =
new System.IO.StreamWriter(rutaFichero);
ficheroTemporal.WriteLine(texto);
ficheroTemporal.Close();
}
}
catch (Exception errorC)
{
MessageBox.Show("Ha habido un error al intentar " +
"crear el fichero temporal:" +
Environment.NewLine + Environment.NewLine +
rutaFichero + Environment.NewLine +
Environment.NewLine + errorC.Message,
"Error al crear fichero temporal",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
Usaremos esta función en la aplicación C# para guardar el valor del resultado que luego se leerá desde la aplicación Delphi.
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A