Utilizamos cookies propias y de terceros. Al navegar entendemos que aceptas el uso de cookies. +Info.
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Usuario
· Wiki

Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Enlazar aplicación Delphi con aplicación C# CSharp
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Enlazar aplicación Delphi con aplicación C# CSharp

Publicar nuevo tema Responder al tema
Foros de discusión » VB.Net, C# .Net, Visual Studio .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Enlazar aplicación Delphi con aplicación C# CSharp Responder citando

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?
MensajePublicado:
Mar Feb 21, 2012 6:39 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Enlazar aplicación Delphi con aplicación C# CSharp Responder citando



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, '');

                      //quitamos posibles comillas para evitar errores en paso de parámetros
                      parametro1 := AnsiReplaceStr(parametro1, '"', '');
                      parametro2 := AnsiReplaceStr(parametro2, '"', '');
                      parametro3 := AnsiReplaceStr(parametro3, '"', '');
                      parametro4 := AnsiReplaceStr(parametro4, '"', '');
                      parametro5 := AnsiReplaceStr(parametro5, '"', '');
                      parametro6 := AnsiReplaceStr(parametro6, '"', '');
                      parametro7 := AnsiReplaceStr(parametro7, '"', '');

                      //quitamos posibles barras, reemplazamos por -
                      parametro1 := AnsiReplaceStr(parametro1, '/', '_');
                      parametro2 := AnsiReplaceStr(parametro2, '/', '_');
                      parametro3 := AnsiReplaceStr(parametro3, '/', '_');
                      parametro4 := AnsiReplaceStr(parametro4, '/', '_');
                      parametro5 := AnsiReplaceStr(parametro5, '/', '_');
                      parametro6 := AnsiReplaceStr(parametro6, '/', '_');
                      parametro7 := AnsiReplaceStr(parametro7, '/', '_');
                      parametro1 := AnsiReplaceStr(parametro1, '\', '_');
                      parametro2 := AnsiReplaceStr(parametro2, '\', '_');
                      parametro3 := AnsiReplaceStr(parametro3, '\', '_');
                      parametro4 := AnsiReplaceStr(parametro4, '\', '_');
                      parametro5 := AnsiReplaceStr(parametro5, '\', '_');
                      parametro6 := AnsiReplaceStr(parametro6, '\', '_');
                      parametro7 := AnsiReplaceStr(parametro7, '\', '_');


                      parametros := '"' + parametro1 + '"' + ' ' + '"' + parametro2 + '"' + ' ' +
                          '"' + parametro3 + '"' + ' ' + '"' + parametro4 + '"' + ' ' +
                          '"' + parametro5 + '"' + ' ' + '"' + parametro6 + '"' + ' ' +
                          '"' + parametro7 + '"';

                      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();
               
                txtDNI.Text = parametros[1];
                txtCodigoIncidencia.Text = parametros[2];
                txtDesdeFecha.Text = parametros[3];
                txtHastaFecha.Text = parametros[4];
                opCuentaAnoAnterior.Checked = parametros[5] == "S";
                txtDescripcion.Text = parametros[6];
                txtDNI.Enabled = false;
                txtCodigoIncidencia.Enabled = false;
                txtDesdeFecha.Enabled = false;
                txtHastaFecha.Enabled = false;

                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.
MensajePublicado:
Dom Jul 29, 2012 8:37 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » VB.Net, C# .Net, Visual Studio .Net  

Cambiar a:  
Key
  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
Este sitio web NO CONTIENE malware, todos los programas con código fuente aquí. Autor: Alonso Javier Pérez Díaz Google+ Síguenos en Google+