19 de agosto de 2005

VFP 9.0 y API StarOffice 7

Bueno despues de mucho buscar y tanto o mas de estar adaptando codigo, por fin he podido concretar un par de ejemplos a fin de dejar como referencia para aquellos que novatos como yo :-)

Estos ejemplos estan probados y aunque Fox no me marca ningun error y el programa hace todo lo que quiero, se que pudieran surgir algunos errores que no he notado. Como les comento estos ejemplos corren usando VFP9 version en Ingles y StarOffice 7 en Español para Windows.

Dado que estos son los unicos recursos con los que cuento, no he podido hacer mas pruebas; asi que cualquier correccion y comentario lo agradeceria ampliamente.

Por ultimo, el codigo que se muestra, contiene los comandos MAS BASICOS tanto para el procesador de Textos como para la Hoja de Calculo, excepto el insertado de imagenes, si alguien llegase a desarrollar tal codigo creo que seria bueno que lo anotase aqui a fin de darle una mayor continuidad.

De antemano agradesco la información obtenida de entre otras fuentes a:

PortalFox, FoxPress y OpenOffice.org
*###################################*
*                                   *
**** EJEMPLO 1 STAROFFICE WRITER ****
*                                   *
*###################################*

LOCAL ARRAY laPropertyValue[1]
LOCAL loManager, loDesktop, loDocument, loCursor, PaginaPre, EstilosPagina, FormaObjetoGrafico

loManager = CREATEOBJECT( "com.sun.star.ServiceManager" )
loDesktop = loManager.createInstance( "com.sun.star.frame.Desktop" )
comarray( loDesktop, 10 )

loReflection = loManager.createInstance("com.sun.star.reflection.CoreReflection" )
comarray( loReflection, 10 )
 
laPropertyValue[1] = createStruct( @loReflection,"com.sun.star.beans.PropertyValue" )
laPropertyValue[1].NAME = "ReadOnly"
laPropertyValue[1].VALUE = .F.
loDocument = loDesktop.LoadComponentFromUrl( "STAROFFICE.factory:swriter","_blank", 0, @laPropertyValue )
comarray( loDocument, 10 )

loCursor= loDocument.TEXT.CreateTextCursor()
loDocument.text.insertString(loCursor, "Esta es la primera linea del texto.", .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)
loCursor.text.insertString(loCursor, "Esta es la segunda linea", .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

Tabla= loDocument.createInstance( "com.sun.star.text.TextTable")
Tabla.initialize(4, 4)
loCursor.text.insertTextContent(loCursor, Tabla, .f.)

objRows= Tabla.getRows
ColumnaT= objRows.getByIndex( 0)
Tabla.setPropertyValue("BackTransparent", .f.)
Tabla.setPropertyValue("BackColor", 13421823)

ColumnaT.setPropertyValue( "BackTransparent", .f.)
ColumnaT.setPropertyValue( "BackColor", 6710932)

insertIntoCell ("A1","FirstColumn", Tabla )
insertIntoCell ("B1","SecondColumn", Tabla )
insertIntoCell ("C1","ThirdColumn", Tabla )
insertIntoCell ("D1","SUM", Tabla )

var1=2
var2=48
var3=4

Tabla.getCellByName("A2").setValue(var1)
Tabla.getCellByName("B2").setValue(var2)
Tabla.getCellByName("C2").setValue(var3)
Tabla.getCellByName("D2").setFormula ((var1*var2)/var3)
Tabla.getCellByName("A3").setValue(21.5)
Tabla.getCellByName("B3").setValue(615.3)
Tabla.getCellByName("C3").setValue(-315.7)
Tabla.getCellByName("D3").setFormula ("sum ")
Tabla.getCellByName("A4").setValue (121.5)
Tabla.getCellByName("B4").setValue (-615.3)
Tabla.getCellByName("C4").setValue (415.7)
Tabla.getCellByName("D4").setPropertyValue( "BackColor", 16700000)
Tabla.getCellByName("D4").setFormula("sum")

loCursor.setPropertyValue ("CharColor", 255)
loCursor.text.insertControlCharacter (loCursor, 0 , .f.)
loDocument.text.insertString (loCursor, " Texto de Color" , .f.)
loCursor.setPropertyValue ("CharShadowed", .t.)
loDocument.text.insertString (loCursor, " - texto con sombra" , .f.)
loCursor.setPropertyValue ("CharShadowed", .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loDocumentFrame= loDocument.createInstance("com.sun.star.text.TextFrame")

objSize= createStruct(@loReflection, "com.sun.star.awt.Size")
objSize.Width= 15000
objSize.Height= 400
loDocumentFrame.setSize( objSize)
loDocumentFrame.setPropertyValue("AnchorType", 1)
loDocument.text.insertTextContent(loCursor, loDocumentFrame, .f.)

objFrameText= loDocumentFrame.getText
objFrameTextCursor= objFrameText.createTextCursor
objFrameTextCursor.setPropertyValue ("CharHeight", 10)
objFrameText.insertString(objFrameTextCursor, "Primera linea dentro del marco.", .f.)
objFrameText.insertControlCharacter(objFrameTextCursor, 0, .f.)
objFrameText.insertString(objFrameTextCursor, "Otra linea dentro del marco.", .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)
 
loCursor.setPropertyValue ("CharColor", 65536)
loCursor.setPropertyValue ("CharFontName", 'Arial')
loDocument.text.insertString (loCursor, "Cambio de letra a Arial", .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("CharWeight", 150)
loCursor.text.insertString(loCursor, "Negritas ", .f.)
loCursor.setPropertyValue ("CharWeight", 100)
loCursor.setPropertyValue ("CharPosture", 50)
loCursor.text.insertString(loCursor, "Cursiva ", .f.)
loCursor.setPropertyValue ("CharPosture", 0)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loDocument.text.insertString (loCursor, "Texto Normal" ,.f.)
loCursor.setPropertyValue ("CharEscapement", 65)
loCursor.setPropertyValue ("CharHeight", 5)
loDocument.text.insertString (loCursor, " Superíndice" ,.f.)
loCursor.setPropertyValue ("CharEscapement", 0)
loCursor.setPropertyValue ("CharHeight", 10)
loDocument.text.insertString (loCursor, "  Texto Normal" ,.f.)
loCursor.setPropertyValue ("CharHeight", 5)
loCursor.setPropertyValue ("CharEscapement", -35)
loDocument.text.insertString (loCursor, " Subíndice" ,.f.)
loCursor.setPropertyValue ("CharEscapement", 0)
loCursor.setPropertyValue ("CharHeight", 10)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("CharUnderline", 1)
loDocument.text.insertString (loCursor, "Subrayado" ,.f.)
loCursor.setPropertyValue ("CharUnderline", 0)
loCursor.setPropertyValue ("CharFlash", .t.)
loDocument.text.insertString (loCursor, " Parpadeando" ,.f.)
loCursor.setPropertyValue ("CharFlash", .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("CharHeight", 8)
loCursor.setPropertyValue ("CharFontName", 'Arial Black')
loCursor.setPropertyValue ("CharColor", 14500)
loDocument.text.insertString (loCursor, "Color 1,4500" ,.f.)
loCursor.setPropertyValue ("CharColor", 18500)
loDocument.text.insertString (loCursor, CHR(9)+"Color 18,500" ,.f.)
loCursor.setPropertyValue ("CharColor", 20500)
loDocument.text.insertString (loCursor, CHR(9)+"Color 20,500" ,.f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("ParaAdjust", 3)
loDocument.text.insertString (loCursor, "Color 13,459,998 AAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB" ;
+" CCCCCC DDDDDD EEEEEEE F F F FFFF GGGGGGG HHHH" ,.f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("ParaAdjust", 0)
loDocument.text.insertString (loCursor, "Color 16,711,680 AAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB" ;
+" CCCCCC DDDDDD EEEEEEE F F F FFFF GGGGGGG HHHH" ,.f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("ParaAdjust", 2)
loCursor.setPropertyValue ("CharColor", 9603696)
loDocument.text.insertString (loCursor, "Color 9,603,696 AAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB" ;
+" CCCCCC DDDDDD EEEEEEE F F F FFFF GGGGGGG HHHH" ,.f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("ParaAdjust", 1)
loCursor.setPropertyValue ("CharColor", 8355711)
loDocument.text.insertString (loCursor, "Color 8,355,711 AAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB" ;
+" CCCCCC DDDDDD EEEEEEE F F F FFFF GGGGGGG HHHH" ,.f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

loCursor.setPropertyValue ("CharColor", RGB(0,0,255))
loDocument.text.insertString (loCursor, "Color 8,355,711 AAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB" ;
+" CCCCCC DDDDDD EEEEEEE F F F FFFF GGGGGGG HHHH " ,.f.)
loDocument.text.insertControlCharacter( loCursor, 0, .f.)

or_url="file:///c:/test.sxw"
laPropertyValue[1].NAME= "Overwrite"
laPropertyValue[1].VALUE= .T.
loDocument.storeAsURL( or_url, @laPropertyValue )

1 de agosto de 2005

Email y VFP: Parte 1b (Outlook)

Artículo original: Email and VFP: Part 1b (Outlook)
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,fb9e9267-3642-4176-94ea-9239691b61fa.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


Si puede contar conque sus usuarios utilizan Outlook como su cliente de correo (que no emplean Eudora u otro), entonces el siguiente código es muy cómodo. Enviar correo desde Automatización Outlook nos brinda el acceso a varias posibilidades que vienen con el objeto MailItem. He tocado algunas de ellas; pero para más información, se puede referir a la información del objeto MailItem en MSDN (http://msdn.microsoft.com/library/en-us/vbaol11/html/olobjMailItem_HV05247822.asp)
*******************************
*!* Ejemplo de utilización de SendViaOutlook
*******************************
#DEFINE olImportanceLow 0
#DEFINE olImportanceNormal 1
#DEFINE olImportanceHigh 2
DIMENSION aryAttach(2)
aryAttach(1) = "C:\attachment1.txt" &&  cambie a un archivo real que existe en su PC
aryAttach(2) = "C:\attachment2.zip" &&  cambie a un archivo real que existe en su PC
LOCAL lcTo, lcSubject, lcBody, lcCC, lcBCC, llHTMLFormat, llOpenEmail, lcErrReturn
lcTo = "alguien@algundominio.com"
lcSubject = "Hey, ¿Ha intentado enviar un email con VFP?"
*!* Enviando el cuerpo en formato HTML 
llHTMLFormat = .T.
lcBody = "<a href='http://www.sweetpotatosoftware.com/SPSBlog/default.aspx'>" + ;
  "Hey, ¿Ha intentado enviar un email con VFP?" + ;
  "</a>"
lcCC = "otro@otrodominio.com"
lcBCC = "mijefe@dominiodeljefe.com"
*!* para enviar correo automáticamente haga llOpenEmail igual a .F.
llOpenEmail = .T. && Si el correo se abrió o no, en el cliente de correo Outlook
SendViaOutlook(@lcErrReturn, lcTo, lcSubject, lcBody, @aryAttach, lcCC, lcBCC, llHTMLFormat, olImportanceHigh, llOpenEmail)
IF EMPTY(lcErrReturn)
  MESSAGEBOX("'" + lcSubject + "'" + IIF(llOpenEmail, " abierto ", " enviado ") + "satisfactoriamente.", ;
    64, "Envía email via Outlook")
ELSE
  MESSAGEBOX("'" + lcSubject + "' falló al enviar. Causa:"  + CHR(13) + lcErrReturn, 64, "Envía email via Outlook")
ENDIF

*******************************************
PROCEDURE SendViaOutlook(tcReturn, tcTo, tcSubject, tcBody, taFiles, tcCC, tcBCC, tlHTMLFormat, tnImportance, tlOpenEmail)
*******************************************
LOCAL loOutlook, loItem, lnCountAttachments
TRY
  loOutlook = CREATEOBJECT("outlook.application")
  loItem = loOutlook.CreateItem(0)
  WITH loItem
    .Subject = tcSubject
    .TO = tcTo
    IF tlHTMLFormat
      .HTMLBody = tcBody
    ELSE
      .Body = tcBody
    ENDIF
    IF TYPE("tcCC") = "C"
      .CC = tcCC
    ENDIF
    IF TYPE("tcBCC") = "C"
      .BCC = tcBCC
    ENDIF
    IF TYPE("tnImportance") != "N"
      tnImportance = 1 && importancia normal 
    ENDIF
    .Importance = tnImportance
    IF TYPE("tafiles",1) = "A"
      FOR lnCountAttachments = 1 TO ALEN(taFiles)
        .Attachments.ADD(taFiles(lnCountAttachments))
      ENDFOR
    ENDIF
    IF tlOpenEmail
      .DISPLAY()
    ELSE
      .SEND()
    ENDIF
  ENDWITH
CATCH TO loError
  tcReturn = [Error: ] + STR(loError.ERRORNO) + CHR(13) + ;
    [LineNo: ] + STR(loError.LINENO) + CHR(13) + ;
    [Message: ] + loError.MESSAGE + CHR(13) + ;
    [Procedure: ] + loError.PROCEDURE + CHR(13) + ;
    [Details: ] + loError.DETAILS + CHR(13) + ;
    [StackLevel: ] + STR(loError.STACKLEVEL) + CHR(13) + ;
    [LineContents: ] + loError.LINECONTENTS
FINALLY
  RELEASE oOutlook, oItem
  STORE .NULL. TO oOutlook, oItem
ENDTRY
ENDPROC