Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   No cerrar Excel (https://www.clubdelphi.com/foros/showthread.php?t=35765)

RaulChemical 20-09-2006 10:04:07

No cerrar Excel
 
Hola Foro!!!!

Tengo cierto problemilla con mi carga desde Excel. Os cuento:

Realizo una carga desde un fichero excel y cuando llego al final del fichero cierro Excel.

Hasta aqui, no hay ningun problema, el caso es que si el usuario ya tenia abierto el excel antes, al finalizar mi carga, cierro mi fichero y el que ya tenia abierto el usuario.

Uso ExcelXP.

Os detallo como hago la creacion, apertura, cierre y liberacion del excel:

Para la creacion y apertura llamo al siguiente procedimiento:

Código Delphi [-]

Procedure CrearYConectarExcel(Fichero: String;
                              Var Lcid : Integer;
                              Var EXAplication : TExcelApplication;
                              Var EXWorkBook : TExcelWorkbook;
                              Var EXWorkSheet : TExcelWorksheet);
var
  wbk : _Workbook;
begin
  Lcid := LOCALE_USER_DEFAULT;
  EXAplication := TExcelApplication.Create(Application);
  EXWorkBook := TExcelWorkbook.Create(Application);
  EXWorkSheet := TExcelWorksheet.Create(EXWorkBook);
  wbk := EXAplication.Workbooks.Add(EmptyParam,LCID);
  EXWorkBook.ConnectTo(EXAplication.Workbooks.Open(fichero, EmptyParam, EmptyParam,
                                                   EmptyParam, EmptyParam, EmptyParam,
                                                   EmptyParam, EmptyParam, EmptyParam,
                                                   EmptyParam, EmptyParam, EmptyParam,
                                                   EmptyParam, EmptyParam, EmptyParam,
                                                   Lcid));
  EXWorkSheet.ConnectTo(EXWorkBook.ActiveSheet as ExcelWorkSheet);
  EXAplication.DisplayAlerts[Lcid];
end;

Y para el cierre y la liberacion hago esto:

Código Delphi [-]
Procedure CerrarYLiberarExcel(Fichero: String;
                              Var Lcid : Integer;
                              Var EXAplication : TExcelApplication;
                              Var EXWorkBook : TExcelWorkbook;
                              Var EXWorkSheet : TExcelWorksheet);
begin
  EXAplication.DisplayAlerts[LCID]:=False;
  EXWorkBook.Close(True,Fichero,emptyParam,LCID);
  EXWorkSheet.Disconnect;
  EXWorkBook.Disconnect;
  EXAplication.Quit;
  EXAplication.Disconnect;
  FreeAndNil(EXWorkSheet);
  FreeAndNil(EXWorkBook);
  FreeAndNil(EXAplication);
end;

El problema que tengo es que no se como hacer para que al CerrarYLiberarExcel(...) no se como hacer para que no se cierre el/los otro/s posible/s exceles abiertos.

He probado de momento quitando el EXAplication.Quit y el EXAplication.Disconect, pero al liberar el objeto, me cierra la aplicacion y si no libero, me suelta un RunTimeError de los que te suelta Excel.

¿Realmente se puede hacer que se cierre el excel que yo he abierto y que continue ejecutandose el otro excel?

Estoy pensando continuar por otra via, que es comprobar al principio de la ejecucion si excel está corriendo. En caso de que esté, soltarle un mensaje al usuario diciendole que Excel ya está en ejecucion.

¿Sabeis alguno como saber encontrar una tarea en ejecucion (en concreto el excel) dentro del administrador de tareas?.


Cualquiera de las opciones me es viable, tanto la "bonita" (solo cerrar mi fichero y que Excel continue en ejecucion) como la "drastica" (evitar mi porceso de carga si Excel esta en ejecucion).


Muchas gracias a todos.

Raul.

roman 21-09-2006 09:03:45

Inmediatamente después de crear la instancia de Excel, especifica el modo de conexión:

Código Delphi [-]
EXAplication := TExcelApplication.Create(Application);
EXAplication.ConnectKind := ckNewInstance;

Esto hará que se abra un nuevo proceso de Excel. Incluso verás un segundo botón en la barra de tareas. Cuando desconectes, sólo se cerrará el segundo proceso.

// Saludos

RaulChemical 21-09-2006 09:40:12

Muchas gracias!!!!

En vez de eso, puse un buclecillo que hasta que no detectase que se habia cerrado el excel, no iniciaba el proceso de carga, pero ya lo he modificado y mola xq con lo que tu me has dicho se permiten "n" procesos de excel y no se cierra ninguno al finalizar.

Muchas gracias de nuevo!!!

Un saludo.


Raul.

grotero76 21-02-2008 10:38:17

Buenas a todos,

Necesito saber si EXCEL se está ejecutando antes lanzar la instancia del mismo que crea mi aplicación, ¿Es posible saber si EXCEL está en ejecución dentro del administrador de tareas?.

Muchas gracias.
Un saludo.

RaulChemical 21-02-2008 10:47:45

Matamos el excel
 
Buenas....

En algunos otros puntos de la aplicación, a petición del cliente, matamos el excel. Para matarlo, llamamos a esta función que encontramos en el TrucoMania (creo).

Código Delphi [-]
function KillTask(FileName:String):integer;
var
  ContinueLoop:BOOL;
  FSnapshotHandle:THandle;
  FProcessEntry32:TProcessEntry32;
const
  PROCESS_TERMINATE=$0001;
begin
Result:=0;
  FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
  ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
  while integer(ContinueLoop)<>0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName)) or
       (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName))) then
      Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),
                                       FProcessEntry32.th32ProcessID),0));
    ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

Espero que te sirva la función o parte de ella.

Suerte.

grotero76 21-02-2008 11:41:53

Muchas gracias por tu rápida respuesta,

el caso es que la función que me has pasado no consigue matarme el proceso de Excel.
He conseguido detectar si un fichero en cuestión se está ejecutando con la siguiente función:

Código:

function EstaEjecutandose (FileName:string): boolean;
var H:word;
begin
    H := CreateFile(PChar(FileName), GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
    Result := (H >= 65535);
    CloseHandle(H);
end;

de esta manera controlo que un mismo fichero no intenten
abrirlo dos veces, pero lo que quería era poder matar el proceso
que se está ejecutando y a continuación abrir una nueva instancia.
Hago una llamada a la función KillTask pero no hace nada, no se
si la estoy utilizando bien, simplemente hago lo siguiente:

Código:

  if EstaEjecutandose(FileName) then
      KillTask(FileName)

¿Hay algo que se me escape que pueda estar haciendo mal?

Muchas gracias de nuevo.

Un saludo.

RaulChemical 21-02-2008 11:48:21

Yo llamo al killtask así y funciona:

Código Delphi [-]
KillTask('EXCEL.EXE');

Prueba así a ver....

grotero76 21-02-2008 12:00:42

Ok, funciona, como el parámetro de la función KillTask era Filename pensé que había que pasarle el nombre del fichero en lugar del proceso, me había echo un lio.

Muchas gracias.


La franja horaria es GMT +2. Ahora son las 09:47:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi