Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Ubicar cursor en word (https://www.clubdelphi.com/foros/showthread.php?t=48171)

zidfrid 18-09-2007 01:56:06

Ubicar cursor en word
 
hola amigos, resulta que tengo una plantilla en word en la cual deseo insertar unos datos, ojala usando los componentes WordApplication, WordDocument.
El hecho es que primero debo hubicar el cursor en la pocision del documento donde deseo insertar la informacion, esto no lo he podido hacer; me apeno de mi ignorancia, pero de verdad he buscado durante horas y horas con el google, altavista, mamma y no he encontrado algo que me funcione.
imagino que debe haber alguna funcion que me permita hacer esto con coordenadas en x,y.
de todas maneras agradesco de ante mano cualquier ayuda que me puedan brindar, seria muy bueno algun link si es que existe, donde muestren las funciones relacionadas con la automatizacion de word y como se usan; bueno en ultimas cualquier ayuda es cariño.
gracias por su tiempo.....:)

zidfrid 21-09-2007 03:44:56

he pero nadie que me eche un empujon con esto, acaso sera que no hay algun lugar donde uno pueda encontrar documentacion de soporte sobre los componentes con los que se maneja el word? :confused:

JAVH 24-09-2007 22:09:00

Si, la MSDN de Microsoft, y también una búsqueda por Google arroja buenos resultados, también los foros de club builder
Código:

http://www.areabuilder.com
hay muy buena documentación, el problema ahí es que son un poco elitistas y si eres nuevo muchas veces no te hacen caso, pero es muy buen sitio para consultar, de ahí saqué este código

Código:

#if (__BORLANDC__ >= 0x0530)
    #include <Comobj.hpp>
#else
    #include <oleauto.hpp>  // BCB 1
#endif
......

Variant vWord, vDocumentos, vDocumento, vSeleccion, vBuscar;
    String sPath = ExtractFilePath( Application->ExeName );
    String sFicheroPlantilla = sPath + "plantilla.doc";
    String sFicheroGenerado  = sPath + "plantilla2.doc";
    //--- Abre Word
    vWord = CreateOleObject( "Word.Application" );
    vWord.OlePropertySet( "Visible", !checkGuardar->Checked );
    //--- 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
    vBuscar.Exec( Procedure( "Execute" )
        << "{{nombre}}"              // 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
        << Edit1->Text.c_str()        // Reemplazar con...
        << 2                          // 2 = reemplazar todo
    );
    //--- sustituimos otra palabra
    vBuscar.Exec( Procedure( "Execute" ) << "{{direccion}}"
        << VT_EMPTY << VT_EMPTY << VT_EMPTY << VT_EMPTY << VT_EMPTY
        << true << VT_EMPTY << VT_EMPTY << Edit2->Text.c_str() << 2 );
    //--- salvamos automaticamente si procede y cerramos Word
    if ( checkGuardar->Checked )
    {
        vDocumento.OleProcedure( "SaveAs", sFicheroGenerado.c_str() );
        vDocumento.OleProcedure( "Close", 0xFFFFFFFF);
        vWord.OleProcedure( "Quit" );
        ShowMessage("Documento generado.");
    }
    vWord = vDocumentos = vDocumento = vSeleccion = vBuscar = Unassigned;

Es que no se puede saber todo HOYGAN.

zidfrid 27-09-2007 14:07:11

hola javh, una vez mas me echas la mano, te lo agradezco mucho.
veras en cuanto a lo de elitistas tienes toda la razón ya lo he notado por que ya he ingresado a ese sitio, pero bueno eso no importa cada quien tiene su forma de ser.
oye el problema no es que no encuentre información, ya que si se encuentra, el detalle es que no me funciona la que he encontrado, por ello ando buscando como una especie de manual sobre los componentes visuales con los que se maneja el word "WordApplication, WordDocument", encontre un doc de ayuda "help file" de la empresa que diseño los componentes, pero no es freeware, y por que hago esto?, por que todo lo que encuentro esta compilado sobre delphi, java y paradox y he notado que muchas veces las funciones que ellos usan y la forma como las usan son las mismas que yo empleo y sin embargo a mi no me funcionan.
dejame probar tu código, aunque puedo notar que la posición del cursor depende de una palabra previamente determinada.:)

JAVH 28-09-2007 00:19:06

Si, no te puedes mover libremente como si fuera una pantalla de DOS, solamente por el texto, donde sí puedes moverte libremente es para insertar objetos:

Código para insertar una imagen (tomado también de areabuilder), lo probé y funciona incluso con jpegs.

Código:

#include <comobj.hpp>
// En versiones anteriores a la 6 ademas la siguiente:
// #include <utilcls.h>

inline float MmToPoints(float mm) {return mm * 2.83464567;}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant word = GetActiveOleObject("Word.Application");
Variant doc = word.OlePropertyGet("ActiveDocument");

Variant sections = doc.OlePropertyGet("Sections");
Variant footers = sections.OlePropertyGet("First").OlePropertyGet("Headers");
Variant footer = footers.OleFunction("Item", 1 /*wdHeaderFooterPrimary*/);

Variant shapes = footer.OlePropertyGet("Shapes");
Variant shape = shapes.OleFunction("AddPicture",
    "c:\\dir\\imagen.bmp", // ruta a la imagen
    false,                // Vincular imagen al documento?
    true);                // Guardar la imagen vinculada con el documento?

// Coordenadas relativas al borde de la página
//  en este ejemplo a 100 mm. del borde izquierdo y a 10 mm del superior
shape.OlePropertySet("RelativeHorizontalPosition", 1 /*wdRelativeHorizontalPositionPage*/);
shape.OlePropertySet("Left", MmToPoints(100));
shape.OlePropertySet("RelativeVerticalPosition", 1 /*wdRelativeVerticalPositionPage*/);
shape.OlePropertySet("Top", MmToPoints(10));
}


zidfrid 29-09-2007 18:13:46

tienes todita la razón el código funciona muy bien, te agradezco una vez mas tu ayuda, y por si algo ya me estoy defendiendo con la pos del cursor a punta de tabuladores.


La franja horaria es GMT +2. Ahora son las 21:59:58.

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