Pregunta

Estoy usando el siguiente código para insertar una tabla con 2 celdas en MS Word usando Delphi XE5.Todas las fuentes de las celdas de la tabla son bastante sencillas.Excepto 1 palabra.Necesito que esta palabra sea atrevida mientras que el resto no lo es.

Ayúdenme a ajustar mi código para poder poner la palabra en negrita.

wrdDoc.Tables.Add(wrdSelection.Range,3,2);
wrdDoc.tables.Item(3).Rows.Alignment := wdAlignRowLeft;

 wrdDoc.Tables.Item(3).Columns.Item(1).SetWidth(36,wdAdjustNone);
 wrdDoc.Tables.Item(3).Columns.Item(2).SetWidth(379,wdAdjustNone);
 wrdDoc.tables.Item(3).Borders.Item(wdBorderLeft).LineStyle := wdLineStyleNone;
 wrdDoc.tables.Item(3).Borders.Item(wdBorderRight).LineStyle := wdLineStyleNone;
 wrdDoc.tables.Item(3).Borders.Item(wdBorderVertical).LineStyle := wdLineStyleNone;
 wrdDoc.tables.Item(3).Borders.Item(wdBorderTop).LineStyle := wdLineStyleNone;
 wrdDoc.tables.Item(3).Borders.Item(wdBorderBottom).LineStyle := wdLineStyleNone;
 wrdDoc.tables.Item(3).Borders.Item(wdBorderHorizontal).LineStyle := wdLineStyleNone;

 wrdDoc.Tables.Item(3).Cell(1,1).Range.InsertAfter('8.1');
 wrdDoc.Tables.Item(3).Cell(1,1).Range.Paragraphs.Alignment := wdAlignParagraphleft;
 wrdDoc.Tables.Item(3).Cell(1,1).Range.Font.Size := 12;
 wrdDoc.Tables.Item(3).Cell(1,1).Range.Font.Bold := false;
 wrdDoc.Tables.Item(3).Cell(1,1).Range.Font.underline := false;

 wrdDoc.Tables.Item(3).Cell(1,2).Range.InsertAfter('this will not be bold text');
 wrdDoc.Tables.Item(3).Cell(1,2).Range.InsertAfter('this will not be bold text');
 wrdDoc.Tables.Item(3).Cell(1,2).Range.InsertAfter('THIS TEXT MUST BE BOLD');
 wrdDoc.Tables.Item(3).Cell(1,2).Range.Paragraphs.Alignment := wdAlignParagraphJustify;
 wrdDoc.Tables.Item(3).Cell(1,2).Range.Font.Size := 12;
 wrdDoc.Tables.Item(3).Cell(1,2).Range.Font.Bold := false;
 wrdDoc.Tables.Item(3).Cell(1,2).Range.Font.underline := false;

Como puede ver en la última parte del código, hay 3 llamadas para InsertAfter(), las frases que estoy insertando son muy largas.y Delphi me limita a 255, así que los llamo más de una vez y es tan bueno como llamarlo una vez.

Sólo la última convocatoria, debe estar en negrita.El resto debería permanecer en el formato definido anteriormente.

Cualquier ayuda sería apreciada.Gracias

¿Fue útil?

Solución

Logré encontrar una manera.Es un poco complicado pero cumple su función.

Procedure MakeBold(SearchStr:String);
Begin
 WrdApp.Selection.Find.ClearFormatting;
     WrdApp.Selection.Find.Text := SearchStr;
     WrdApp.Selection.Find.Forward := True;
     WrdApp.Selection.Find.Wrap := wdFindContinue;
     WrdApp.Selection.Find.Format := False;
     WrdApp.Selection.Find.MatchCase :=  true;
     WrdApp.Selection.Find.MatchWholeWord := wrfMatchCase in Flags;
     WrdApp.Selection.Find.MatchWildcards :=wrfMatchWildcards in Flags;
     WrdApp.Selection.Find.MatchSoundsLike := False;
     WrdApp.Selection.Find.MatchAllWordForms := False;
     { Perform the search }
     WrdApp.Selection.Find.Execute();
  WrdApp.Selection.Font.Bold:=True;
End;

Entonces solo llamo MakeBold('THIS TEXT MUST BE BOLD'); y resuelve el problema.

Cualquier otra respuesta posible sigue siendo bienvenida, porque este método puede hacer que otro texto no relacionado también esté en negrita.

Otros consejos

estás trabajando demasiado duro.:-) Necesitas estar más familiarizado con los rangos de palabras (y el uso de variables temporales).Probado utilizando la unidad Word2010 en Delphi 10 Seattle, usando Word 2013.

var
  WordTbl: Table;

// Grab a local reference to the table for ease of use
Tbl := wrdDoc.Selection.Tables.Item(3);
Tbl.Cell(1, 2).Range.Text := 'not bold';

// Make sure the cell is the current selection
Tbl.Cell(1, 2).Select;

// Move the selection to the end of the text we wrote before
wrdDoc.Selection.EndKey(wdLine, wdMove);

// Add the next section of the text and move to the end, so we
// know for sure where Word thinks we are now. Notice the spaces
// at both ends - for some reason they make a difference
wrdDoc.Selection.Range.Text := ' BOLD TEXT ';
wrdDoc.Selection.EndKey(wdLine, wdMove);

// Move back two words to select the text we just added and bold
wrdDoc.Selection.MoveLeft(wdWord, 2, wdExtend);
wrdDoc.Selection.Font.Bold := 1;

// End of the line again, and turn bold off, then more text
wrdDoc.Selection.EndKey(wdLine, wdMove);
wrdDoc.Selection.Font.Bold := 0;
wrdDoc.Selection.Range.Text := 'not bold again';

Esta solución hace que todas las coincidencias en el activedocument sean negrita

function TfmMain.MakeBold(SearchStr: String; App: OLEVariant {Word application var} ): Integer;
var
  Find: OLEVariant;
begin
  Find := App.Selection.Find;
  Find.ClearFormatting;
  Find.Forward := true;
  Find.Wrap := wdFindStop;
  Find.Format := false;
  Find.MatchCase := false;
  Find.MatchWholeWord := true;
  Find.MatchWildcards := false;
  Find.MatchSoundsLike := false;
  Find.MatchAllWordForms := false;

  Find.Text := SearchStr;
  while Find.Execute() do
  begin
    App.Selection.Font.Bold := true;
    App.Selection.Collapse(wdCollapseEnd);
  end;
  Find := UnAssigned;
end;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top