Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Salir de Word sin grabar

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Salir de Word sin grabar Responder citando

Hola amigos, hace tiempo me enseñaron como manipular un archivo de word y gracias a eso he terminado mi programa de facturación y ya me está reportando ingresos. Pero cuando creo mi plantilla de word y los margenes de la impresión (dependiendo de la impresora de mi usuario) quedan fuera de los límites word automáticamente les manda un mensaje y ellos dan enter para aceptar los nuevos márgenes.
El caso es que al hacer el quit no dice nada word y se queda esperando, y como no tengo activado que se vea pues se queda allí (se puede ver en el control de tareas Ctrl-Alt-Supr). y cuando quiero imprimir otra factura me marca excepción por que mi archivo anterior estaba abierto. Como hago que salga de word sin grabar ? es decir forzar que cierre el documento y ya ?

esta es la función que uso:

Código:

  Variant vWord, vDocumentos, vDocumento, vSeleccion, vBuscar;
  int ii_z=0;
  String arch_z, sPath, sFicheroPlantilla, sFicheroGenerado;
  arch_z = formatofact_z;
  sPath = ExtractFilePath( Application->ExeName );
  sFicheroPlantilla = arch_z;
  sFicheroGenerado  = sPath + "factura2.doc";
  ///-------> Area de llamado a Word <vWord>Checked );
    vWord.OlePropertySet( "Visible", false);
    //--- Abre el documento que usaremos como plantilla
    vDocumentos = vWord.OlePropertyGet( "Documents" );
    vDocumento = vDocumentos.OleFunction( "Open",
          sFicheroPlantilla.c_str(),  // Documento
          false,                      // Confirmar conversiones
          true,                       // Modo se solo lectura
          false,                      // Añadir al menu de ficheros recientes
          ""                          // Clave del documento
    );
    //--- Selecciona todo el documento para reemplazar
    vSeleccion = vWord.OlePropertyGet( "Selection" );
    vSeleccion.OlePropertyGet( "Range" ).OleProcedure( "SetRange", 0, 0 );
    vBuscar = vSeleccion.OlePropertyGet( "Find" );
    vBuscar.OleProcedure( "ClearFormatting" );
    vBuscar.OlePropertyGet( "Replacement" ).OleProcedure( "ClearFormatting" );
    //--- sustituimos una palabra
    // Aqui podemos meter el bucle que va a ir reemplanzando palabras
    for( ii_z = 0; ii_z <campos_z>Count; ii_z++) {
       //vSeleccion.OleProcedure("HomeKey", 6,0); // 6=wdStory 0=wdMode //principio documento        vSeleccion = vWord.OlePropertyGet( "Selection" );
       //vSeleccion= vWord.OlePropertyGet( "Selection" );
       //vSeleccion.OlePropertyGet( "Range" ).OleProcedure( "SetRange", 0, 0 );
       vBuscar.Exec( Procedure( "Execute" )
          <<campos_z>Strings[ii_z]+"}}"               // Texto a buscar
          << VT_EMPTY                   // Coincidir mayusculas y minusculas
          << VT_EMPTY                   // Solo palabras completas
          << VT_EMPTY                   // Usar caracteres comodin
          << VT_EMPTY                   // Suena como
          << VT_EMPTY                   // Todas las formas de la palabra
          << true                       // Hacia adelante
          << VT_EMPTY                   // Wrap
          << VT_EMPTY                   // Format
          <<valores_z>Strings[ii_z].Trim().c_str()   // Reemplazar con...
          << 2                          // 2 = reemplazar todo
       );
    }
    //--- salvamos automaticamente si procede y cerramos Word
    vDocumento.OleProcedure( "SaveAs", sFicheroGenerado.c_str() );
    vDocumento.OleProcedure("PrintOut");
    vDocumento.OleProcedure( "Close", 0xFFFFFFFF);
    vWord.OleProcedure( "Quit" );
    vWord = vDocumentos = vDocumento = vSeleccion = vBuscar = Unassigned;

por cierto, si alguien quiere ver mis programas se encuentra en http://www.bastoexpress.com
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Si lo que quieres es "matar" el proceso (winword.exe) te puede servir el siguiente enlace:

https://cppbuilder.es/viewtopic.php?p=2108#2108

---

Y si quieres otra opción mas "limpia" aunque un poco más complicada, puedes usar lo siguiente. Lo que hace es que en vez de saltar esa excepción se queda esperando la respuesta del usuario:

- Añade la siguiente clase a tu programa (por ejemplo en la cabecera del modulo donde la vayas a usar):
Código:
// Añadir: #include<ole2.hpp>

class IOleMessageFilter : public TInterfacedObject, public IMessageFilter
{
public:
    //--- IUnknown
    HRESULT STDMETHODCALLTYPE QueryInterface(const GUID& IID, void **Obj)
        { return TInterfacedObject::QueryInterface(IID, (void*)Obj); }
    ULONG STDMETHODCALLTYPE AddRef() { return TInterfacedObject::_AddRef(); }
    ULONG STDMETHODCALLTYPE Release() { return TInterfacedObject::_Release(); }

    //--- IMessageFilter
    DWORD STDMETHODCALLTYPE HandleInComingCall(DWORD dwCallType,
        HTASK htaskCaller, DWORD dwTickCount, LPINTERFACEINFO lpInterfaceInfo)
    {
        return SERVERCALL_ISHANDLED;
    }

    DWORD STDMETHODCALLTYPE RetryRejectedCall(HTASK htaskCallee,
        DWORD dwTickCount, DWORD dwRejectType)
    {
        if (dwRejectType == SERVERCALL_RETRYLATER)
            return 99;  //retry immediately if return >=0 & <100
        return -1;  // Too busy; cancel call
    }

    DWORD STDMETHODCALLTYPE MessagePending(HTASK htaskCallee,
        DWORD dwTickCount, DWORD dwPendingType)
    {
        return PENDINGMSG_WAITDEFPROCESS;
    }

    //--- Register
    static void Register(void)
    {
        IMessageFilter* newFilter = new IOleMessageFilter;
        IMessageFilter* oldFilter = 0;
        CoRegisterMessageFilter(newFilter, &oldFilter);
        if (oldFilter) oldFilter->Release();
    }

    static void Revoke(void)
    {
        IMessageFilter* oldFilter = 0;
        CoRegisterMessageFilter(0, &oldFilter);
        if (oldFilter) oldFilter->Release();
    }
};
// Más detalles: http://msdn.microsoft.com/library/ms228772.aspx

Y luego para usarla debes añadir la siguiente línea al principio de las llamadas a Word (por ejemplo debajo de la línea: vWord=CreateOleObject("Word.Application");):

    IOleMessageFilter::Register();

y esta otra al final de las llamadas a Word (por ejemplo debajo de la línea: vWord.OleProcedure("Quit");):

    IOleMessageFilter::Revoke();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola tronxx, he revisado el enlace hacia tú pagina y al ver las fotos que has puesto sobre cada uno de tus sistemas he visto un componente muy interesante. He visto que tienes un GRID que te muestra en cada titulo una marca tipo los autofiltros del excel y en la parte inferior los totales de cada columna, ¿es algún componente que tú has programado? o si se puede conseguir de la internet te agradecería mucho que me brindes el nombre del componente. Wink
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Excepciones de word Responder citando

muchas gracias por tu respuesta, eres un master que se merece todo mi respeto.

Me marcó un error al ingresarlo en mi programa

Código:

[C++ Error] ole2.hpp(4): E2278 Multiple base classes not supported for VCL classes
[C++ Error] ole2.hpp(8): E2034 Cannot convert 'void *' to 'void * *'
[C++ Error] ole2.hpp(8): E2342 Type mismatch in parameter 'Obj' (wanted 'void * *', got 'void *')

voy a intentar repararlo.

Respecto a la clase que me preguntan se llama Express Quantum grid.

y si me mandas un correo te indico como adquirirla
tron_xx@hotmail.com

de todas formas, visita mi página
http://www.bastoexpress.com

Gracias
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

¿Que versión de C++Builder utilizas ? Yo he probado la clase en la 6 y la 2010 y no me ha dado ningún error.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

uso la c++ builder version 5.0 Build 12.34 Gracias
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

No tengo la versión 5 a mano, pero lo he probado en el BCB4 y da el mismo error. He modificado la clase para que funcione en la versión 4, supongo que también debería ir en la 5. El problema está en que las versiones anteriores a la 6 no permiten herencia múltiple cuando se utiliza como base alguna clase de la VCL:
Código:
// Añadir: #include<ole2.hpp>

class IOleMessageFilter : public IMessageFilter
{
    long ref_count;

public:
    IOleMessageFilter() : ref_count(0) { }

    //--- IUnknown
    HRESULT STDMETHODCALLTYPE QueryInterface(const GUID& IID, void** Obj)
    {
        if (IID == IID_IUnknown || IID == IID_IMessageFilter)
            *Obj = static_cast<IMessageFilter*>(this);
        else
            return E_NOINTERFACE;
        AddRef();
        return S_OK;
    }

    ULONG STDMETHODCALLTYPE AddRef()
    {
        return InterlockedIncrement(&ref_count);
    }

    ULONG STDMETHODCALLTYPE Release()
    {
        ULONG ret = InterlockedDecrement(&ref_count);
        if (ret == 0) delete this;
        return ret;
    }

    //--- IMessageFilter
    DWORD STDMETHODCALLTYPE HandleInComingCall(DWORD dwCallType,
        HTASK htaskCaller, DWORD dwTickCount, LPINTERFACEINFO lpInterfaceInfo)
    {
        return SERVERCALL_ISHANDLED;
    }

    DWORD STDMETHODCALLTYPE RetryRejectedCall(HTASK htaskCallee,
        DWORD dwTickCount, DWORD dwRejectType)
    {
        if (dwRejectType == SERVERCALL_RETRYLATER)
            return 99;  //retry immediately if return >=0 & <100
        return -1;  // Too busy; cancel call
    }

    DWORD STDMETHODCALLTYPE MessagePending(HTASK htaskCallee,
        DWORD dwTickCount, DWORD dwPendingType)
    {
        return PENDINGMSG_WAITDEFPROCESS;
    }

    //--- Register
    static void Register(void)
    {
        IMessageFilter* newFilter = new IOleMessageFilter;
        IMessageFilter* oldFilter = 0;
        CoRegisterMessageFilter(newFilter, &oldFilter);
        if (oldFilter) oldFilter->Release();
    }

    static void Revoke(void)
    {
        IMessageFilter* oldFilter = 0;
        CoRegisterMessageFilter(0, &oldFilter);
        if (oldFilter) oldFilter->Release();
    }
};
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Excelente. Como siempre, Leo eres un master de master.

Gracias Laughing
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.