Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Problema Word Automation con Open en Lazarus (https://www.clubdelphi.com/foros/showthread.php?t=85870)

WPascal 18-05-2014 15:25:32

Problema Word Automation con Open en Lazarus
 
Cordial saludo
Tengo un problema a la hora de usar el método Open de los word automation en Lazarus, este es mi código:

Código Delphi [-]

for i:=0 to CantidadDeArchivos-1 do
begin
 RutaArchivoActual:=ExtractFilePath(Application.exename)+carpeta+'\'+ListaDeArchivos[i]+'.doc';
 dw.Documents.Open(RutaArchivoActual);
end;

Anteriormente haciendo pruebas abrí un documento por ejemplo:
Código Delphi [-]
dw.Documents.Open('C:/documento.doc');
dentro del ciclo for, y lo hace correctamente, pero cuando pongo el nombre del archivo como una variable como es RutaArchivoActual, me lanza el error "espacio de almacenamiento insuficiente para completar esta información". Me puse a investigar en el foro y encontré que cuando el nombre de archivo es variable, se le ponen más parámetros a Open, por ejemplo:

Código Delphi [-]
Document := Word.Documents.Open(NombreDoc,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,fals  e);

Pero cuando hago esto, lazarus me dice que no reconoce a EmptyParam, que no está definido; luego investigué en el boletín 6 de rinconcito delphi y da un ejemplo:

Código Delphi [-]
dw.Documents.Open(RutaArchivoActual,0,0,0,'','',1,'','',0);

pero al hacer esto, me sale un error diciendo que "word ha dejado de funcionar", lo mismo pasa cuando intento usar otras opciones como.

Código Delphi [-]
dw.Documents.Open(RutaArchivoActual,null,null,null);

Mi interés es que el nombre de archivo sea variable porque mi aplicación debe hacer una búsqueda dentro de muchos archivos word.
De antemano gracias por sus respuestas y su interés.

WPascal 20-05-2014 14:22:04

Función completa
 
Aquí les dejo la función completa, lo que hace es buscar una frase en documentos word que están en una carpeta y cada resultado lo inserta como un objeto TResultado en un TObjectList:

Código Delphi [-]
type
  Tresultado=class(TObject)
  NombreArchivo:String;
  TextoVistaPrevia:String;
  Relevancia,EncontradoEnLinea:integer;
end;  


function TFrmPrincipal.BuscarPalabra(carpeta,frase:String;TipoBusqueda:integer):TObjectList;
var
  aliasArchivo:Text;
  renglonTemporal,RutaArchivoActual:string;
  numeroRenglonActual,i,j,m,relevancia,CantidadPalabrasSeparadas,CantidadDeArchivos,numeroDeParrafos:i  nteger;
  resultado:TResultado;
  ListaDeArchivos,PalabrasSeparadas:TStringList;
  dw:Variant;
begin
  dw:=CreateOleObject('word.Application');


  result:=TObjectList.create(true);  //result va a contener la lista de objectos resultado
  ListaDeArchivos:=TStringList.Create;
  PalabrasSeparadas:=TStringList.Create;



  frase:=trim(frase);
  PalabrasSeparadas:=Dividir(frase,' '); //separamos la frase de busqueda en las palabras que la conforman
  CantidadPalabrasSeparadas:=PalabrasSeparadas.Count;

  ListaDeArchivos:=ListaArchivos(ExtractFilePath(Application.ExeName)+carpeta,'*.doc',false);
  CantidadDeArchivos:=ListaDeArchivos.Count;

  for i:=0 to CantidadDeArchivos-1  do
  begin
    RutaArchivoActual:=ExtractFilePath(Application.exename)+carpeta+'\'+ListaDeArchivos[i]+'.doc'; //cambio
    //dw.Documents.Open('D:\INFORMACION\Documentos\DOCUMENTOS\CODIGO.doc'); //De esta forma funciona correctamente
    dw.Documents.Open(RutaArchivoActual,null,false);  //esta es una de las formas que intenté
    numeroRenglonActual:=1;

    numeroDeParrafos:=dw.ActiveDocument.paragraphs.count;

    while numeroRenglonActual < numeroDeParrafos  do  //no sé por que el editor me deja pegado el 'do' de la palabra anterior
    begin
      numeroRenglonActual:=numeroRenglonActual+1;
      renglonTemporal:=dw.ActiveDocument.paragraphs.item(numeroRenglonActual).range.text;
      if TipoBusqueda=1 then   //si se busca una palabra
      begin
        relevancia:=0;

        for j:=0 to CantidadPalabrasSeparadas-1 do
        begin
          if AnsiContainsText(renglonTemporal,PalabrasSeparadas[j]) then
             relevancia+=1;
        end;

        if relevancia>0 then
        begin
          resultado:=TResultado.Create;  //creamos la instancia de la clase TResultado
          resultado.EncontradoEnLinea:=numeroRenglonActual;
          resultado.TextoVistaPrevia:=renglonTemporal;

          resultado.NombreArchivo:=RutaArchivoActual;
          resultado.Relevancia:=relevancia;

          result.Add(resultado); //agrego el resultado al TObjectList
        end;
      end
      else if TipoBusqueda=2 then     //si se busca una ley
      begin
        if AnsiPos(frase,renglonTemporal)<>0 then
        begin
          resultado:=TResultado.Create;  //creamos la instancia de la clase TResultado
          resultado.EncontradoEnLinea:=numeroRenglonActual;
          resultado.TextoVistaPrevia:=renglonTemporal;

          resultado.NombreArchivo:=RutaArchivoActual;
          result.Add(resultado);
        end;
      end;
    end;

    dw.quit;
    ShowMessage('termino la busqueda');
  end;
end;

Gracias por su atención

Casimiro Notevi 20-05-2014 14:59:04

while numeroRenglonActual < numeroDeParrafos do //no sé por que el editor me deja pegado el 'do' de la palabra anterior

He dejado un espacio antes y depués del <
No sé por qué, habrá que buscar ese bug.

WPascal 21-05-2014 03:41:47

Sí, es un error extraño, ¿Alguien me puede echar una mano con mi duda?


La franja horaria es GMT +2. Ahora son las 06:56:24.

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