Ver Mensaje Individual
  #3  
Antiguo 20-11-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Siem Ver Mensaje
por mas que lo he intentado, no me deja hacer esto ultimo.
En estos casos, nunca está de más indicar cuáles son los intentos que has hecho y cuáles los problemas que has tenido.

Hasta donde yo veo, la asignación de valores a campos DocVariable como los usados en el hilo que refieres, puede hacerse tanto si se trata de un documento creado a partir de una plantilla como si se trata de un documento existente.

El único problema que he observado es que si el campo ya contiene un valor, la sentencia

Código Delphi [-]
Documento.Variables.Add('telefono', '55-00-00-00');

produce un error, porque, tal como se lee en la referencia de Microsoft Word Visual Basic, no puede agregarse una variable que ya existe. Lo que hay que hacer en ese caso, es verificar si ya existe la variable y, de ser así, asignarle un valor directamente.

Aquí pongo un ejemplo de cómo tratar ambos casos:

Código Delphi [-]
var
  Word: Variant;
  Documento: Variant;
  I: Integer;

begin
  (* Creas un objeto Word *)
  Word := CreateOleObject('Word.Application');

  (* Abres el documento *)
  Word.Documents.Open('C:\ruta\al\documento.doc');
  Documento := Word.Documents.Item(1);

  (* Asignas valores a los campos *)
  I := IndexOfName(Documento.Variables, 'nombre');
  if I = 0 then
    Documento.Variables.Add('nombre', 'pepe pérez')
  else
    Documento.Variables.Item(I).Value := 'pepe pérez';

  I := IndexOfName(Documento.Variables, 'telefono');
  if I = 0 then
    Documento.Variables.Add('telefono', '55-00-00-00')
  else
    Documento.Variables.Item(I).Value := '55-00-00-00';

  Documento.Fields.Update;
  Word.Visible := true;
end;

IndexOfName obtiene el índice de la variable indicada en caso de que ya exista o 0 en caso contrario. Está definida así:

Código Delphi [-]
function IndexOfName(Variables: OleVariant; Name: String): Integer;
var
  I: Integer;

begin
  Result := 0;

  for I := 1 to Variables.Count do
    if Variables.Item(I).Name = Name then
    begin
      Result := I;
      break;
    end;
end;

El código no es óptimo porque tienes que recorrer toda la lista de variables por cada variable, pero sirve para que te des una idea de lo que hay que hacer.

// Saludos
Responder Con Cita