Source: https://www.scribd.com/doc/55396477/Trucos-Visual-Foxpro
Timestamp: 2017-01-18 11:27:09+00:00

Document:
BrowseInterestsBiography & MemoirBusiness & LeadershipFiction & LiteraturePolitics & EconomyHealth & WellnessSociety & CultureHappiness & Self-HelpMystery, Thriller & CrimeHistoryYoung AdultBrowse byBooksAudiobooksArticlesSheet MusicBrowse allUploadSign inJoinLOS TRUCOS AQUI MOSTRADOS HAN SIDO RECOPILADOS DE VARIAS PAGINAS Y NO SON PROPIE DAD INTELECTUAL DEL AUTORDE ESTE BLOG, HAN SIDO RECOPILADOS CON EL FIN DE QUE S IRVAN COMO AYUDA A MUCHOS PROGRAMADORES. Mostrar un reporte dentro de un formulario Excelente truco con el cual podrás mostrar tu reporte en un formulario. oRep =Createobject("Form") With oRep .Caption= "Titulo del Reporte" .WindowState= 2 .Show() Endwith Report Form MiReporte.frx Preview Window (oRep.Name) Hacer que hable el PC Excelente truco que utiliza el objeto COM SAPI que viene con WinXP el cual "pron uncia" lo que le escribas. oVoz = CreateObject("SAPI.SpVoice") oVoz.Speak("Visual fox Pro") oVoz.Speak("Lo mejor") Extraer información de los MP3 Quieres conocer la información de los archivos MP3 ?? ... autor, titulo, álbum, año .. . lnFile = Fopen(Getfile()) Fseek(lnFile, -128,2) lcTag = Fread(lnFile, 128) ? "Titulo: ", Strtran(Substr(lcTag,4,30), Chr(0)) ? "Artista: ", Strtran(Substr(lcTag,34,30), Chr(0)) ? "Album: ", Strtran(Substr(lcTag,64,30), Chr(0)) ? "Año: ", Val(Substr(lcTag,94,4)) Fclose(lnFile) Suprimir ventana "Imprimiendo" en VFP 8 Uno de las nuevas características incorporadas en VFP 8, si deseas puedes impedir que se vea la ventana "Imprimiendo" que se muestra cuando ejecutas un reporte. Report Form NombreReporte To Printer Prompt NODIALOG Preview Nombre del dominio en que se logeo el PC p align="justify">Un pequeño truco para cuando quieras determinar en que dominio s e logeo un determinado PC. ? GetEnv("USERDOMAIN") Determinar si una unidad de red esta disponible Esta es la forma más sencilla para determinar si un equipo de la red esta encendid o o si esta disponible una determinada unidad de red. Si la unidad esta disponible se devolverá -1 y si la unidad no existe o esta apaga do el PC entonces devolverá -1 ? DISKSPACE("\\NombreServidor\C\") Compactar base de datos de Access desde VFP Muy buen truco que permite compactar una base de datos de Access desde VFP. oJE = CreateObject("JRO.JetEngine") oJE.CompactDatabase("Data Source=" + "d:articulos.mdb", "Data Source=" + "d:arti culos1.mdb") Los parámetros para el método CompacDatabase son los siguientes Primer parámetro "Data Source=" + "ruta de la base de datos a compactar" Segundo parámetro "Data Source=" + "ruta de la nueva base de datos compactada"
Insertando registros en Access desde VFP Este es un ejemplo básico pero bueno de como interactuar con una base de datos de Access desde VFP. cStrConn = "DRIVER={Microsoft Access Driver (*.mdb)};" +; "Dbq=C:somedata.mdb;" +; "Uid=usuario;" +; "Pwd=password;" lnAccess = SQLSTRINGCONNECT(cStrConn) If lnAccess > 0 SQLEXEC(lnAccess, "INSERT INTO NombreTabla (campo1, campo2) VALUES(00001, 485745 )") Else =MessageBox("No fue posible conectarse a la Base de Datos") EndIf Imprimir el contenido de un RTF El RTF es un control ActiveX que permite dar características al texto al estilo de Word. En el ejemplo se muestra como imprimir el contenido de este ActiveX. Para imprimir el contenido debes utilizar el método SelPrint del control RTF ... With Thisform.Rtf .selstart=1 .sellength=len(.textrtf) .selprint Desplegar el Contenido de un Combo En ocasiones queremos conocer el contenido de un ComboBoX sin hacer click en él, s olamente a lo que él recibe el enfoque. Esta es la forma más fácil de hacerlo. KEYBOARD _{F4}_ En este caso agregamos este código al evento GOTFOCUS( ) y cuando el Combo reciba el enfoque entonces este se desplegara mostrando la información contenidas en él. Desplegar un ComboBox al recibir el Enfoque II En realidad muchas veces deseamos hacer esto, pero lo pensamos bastante y no enc ontramos la forma de hacerlo. Por fin aquí esta su implementación. Crea un formulario y agrégale un Combo y un Botón. Al hacer click en el botón debe des plegarse automáticamente el Combo. Programa lo siguiente en el evento Gotfocus del Combo tColumna = THISFORM.Combo1.Left + THISFORM.Combo1.Width - 4 tFila = THISFORM.Combo1.Top + 2 MOUSE CLICK AT tFila, tColumna PIXELS WINDOW (THISFORM.Name) En el evento Click del botón que creaste llama al evento Setfocus() del combo, Así: Thisform.combo1.Setfocus() Quitar acentos de una cadenas de caracteres Algunas veces los acentos son algo molestos y nos causan inconvenientes, sobre t odo al momento de realizar búsquedas dentro tablas lCadena = "El amor es el perdón más fácil" ? CHRTRAN(lCadena, "áéíóúáéíóú", "aeiouAEIOU") Agregar imagen al _Screen En ocasiones queremos que en el fondo de nuestras aplicaciones, es decir en el _ screen se vea el logo de nuestro programa o de la empresa. Este es un buen truco para personalizar las aplicaciones. _screen.addobject("oImg", "image") _screen.oImg.picture = "c:imagen.jpg" _screen.oImg.visible = .T. _screen.oImg.stretch = 1 _screen.oImg.width = 800 _screen.oImg.height = 600
Quitar botones de la barra del Preview Truco indispensable si deseas quitar algunos botones de la barra del preview e i mpedir así que se imprima desde ahí o se seleccione alguna opción. Bueno para realizar este truco te recomiendo cierres todo. Ahora ve al menú VER, l uego a ToolBars (Barra de herramientas), luego selecciona la barra Print Preview (VISTA PRELIMINAR) y ahora haz click en Customize (PERSONALIZAR). Ahora la barr a te aparecerá deshabilitada detrás de ventana de personalización, ve a la barra y con click sostenido quita todos los botones que quieras y listo la configuración se g uardara en Foxuser.dbf Si deseas que el usuario final no pueda acceder Solucionar problemas de Memoria con WinXP Evitar el error de Memoria en XP al ejecutar comandos de D.O.S Edita el archivo SYSTEM.INI, en la sección 386ENH agrega la siguiente linea: PerVMFiles = 80 Invocar cuadros de dialogo de Windows Existe una forma sencilla de invocar cuadros de dialogo de Windows, tales como: Guardar, Abrir, Fuentes, Color, Impresoras, Ayuda. loComDialog = newobject( "mscomdlg.commondialog" ) locomdialog.ShowFont && Mostrar Fuente locomdialog.ShowPrinter() && Mostrar Impresora locomdialog.ShowColor() && Mostrar Colores locomdialog.ShowSave() && Mostrar Guardar loComDialog.ShowOpen && Mostrar Abrir Unidad y serial lógico de las unidades de disco De una unidad de disco es posible obtener 2 seriales: el de fabrica y el que le asigna el sistema operativo; en este ejemplo se devuelve el serial del sistema o perativo. objWMI = Getobject("winmgmts:\\") cCadWMI = "Select * from Win32_LogicalDisk" oSistema = objWMI.ExecQuery(cCadWMI) For Each Disco In oSistema ? "Unidad: " + Disco.Name + " Serial: " + Disco.VolumeSerialNumber Next Cancelar todos los trabajos en impresión Aquí tienes un ejemplo de como cancelar los trabajos que se esten imprimiendo util izando WMI. objWMI = GetObject("winmgmts:\\") cCadWMI = "Select * from Win32_Printer Where Name = 'Canon S200'" objImp = objWMI.ExecQuery(cCadWMI) For Each objPrinter in objImp objPrinter.CancelAllJobs() Next Información del tiempo local Utilizando WMI para conocer el día, mes, año, día del mes, número de semana en el mes, m inutos, segundos.... etc. objWMI = GetObject("winmgmts:\\") cCadWMI = "Select * from Win32_LocalTime" oTime = objWMI.ExecQuery(cCadWMI) For Each oLocal in oTime ? "Día: " + Transform(oLocal.Day) ? "Día de la semana: " + Transform(oLocal.DayOfWeek)
? "Hora: " + Transform(oLocal.Hour) ? "Minutos: " + Transform(oLocal.Minute) ? "Mes: " + Transform(oLocal.Month) ? "Segunds: " + Transform(oLocal.Second) ? "Semana en el mes: " + Transform(oLocal.WeekInMonth) ? "Año: " + Transform(oLocal.Year) Next Mandar un reporte a una impresora especifica * Beginning of program for Example 1 * ***************************************** ************** * This program assumes a report called Test which has been * saved with the default printer in the Print Setup dialog. * LOCAL lcPrinter lcPrinter = '' lcPrinter = GETPRINTER() IF !EMPTY(lcPrinter) SET PRINTER TO NAME (lcPrinter) REPORT FORM Test TO PRINTER NOCONSOLE ELSE WAIT WINDOW 'Print Job Cancelled' TIME 1 ENDIF * IMPRIMIR EN UN PUERTO USB Printing to USB Printers from FoxPro 2.6 There are several solutions, depending on your configuration. 1. If you are using a shared printer on another computer, you shouldn't have a p roblem. Share it from the other computer, and point to it from the FoxPro 2.6 co mputer. 2. To print to a USB printer on the FoxPro 2.6 computer. On Windows XP and 2000, you can share the printer, then use a NET USE command to redirect LPT1 to the s hared printer. This is like the Novell capture sequences. Install the printer and share it. You may need to set permissions to allow Authe nticated Users to use the printer. Add NET USE LPT1: \\CRAIG\USBPRINTER to the logon script for the user's profile. For help on logon scripts, look up "To assign a logon script to a profile" in XP Help. 3. To print to a USB printer on the FoxPro 2.6 computer. On Windows XP, you can use printer pooling. Install the USB printer on the computer. Install a local printer on LPT1 (works best, or LPT2). Don't have XP search, but pick the printer by brand. Let it be similar or common printer you recognize. Now select printer properties for the new LPT1 (virtual) printer. On the ports t ab, put checks for the LPT1 (for the virtual printer) and the USB for the real p rinter. Now choose Enable printer pooling. The DOS drivers will print to LPT1. S ince XP pools the ports, the output will then be directed to the USB printer. Good luck! If this was helpful, send me ( craigr@computer-u.com ) an email. Joost Dekker of the Netherlands says "It works." Comprimir con WinZIP Puedes utilizar WinZIP para comprimir archivos desde VFP. oZip = CreateObject("WScript.Shell") oZip.Run("Winzip -a -r -p -ex c:\archivo.zip c:\Dir_a_Comprimir\*.*", 0,.T.) Release oZip oZip = Null Leer archivo INI Una alternativa muy frecuente para almacenar algunos datos de tu aplicación son lo s archivo INIs ... aquí tienes la forma de leer las entradas de estos archivos.
1) loWord. STRING @cRetVal. Lo que debes hacer es ir al evento KeyPress del TextBox vinculado a la columna y escribir el siguiente código If nKeyCode = 13 Nodefault Keyboard "{DNARROW}" EndIf Devolver número con 2 decimales sin aproximarlo En muchas ocasiones tenemos un número con más de 2 decimales y queremos que solo nos devuelva 2. cINIFile) Return Left(cRetVal.Para el ejemplo crea un archivo INI llamado "archivo.PrintPreview loWord.Open(Getfile(). STRING cINIFile nRet = GetPrivateProfileString(cSection..ActiveDocument. Local loWord As Object loWord = Createobject("word."c:archivo.Caption= "Titulo del Reporte" .Protect(1) loWord.05685 ? Round(Floor(nNum1 * 100) / 100. STRING cDefault. nRetLen. cINIFile) LOCAL cDefault.) loWord. cRetVal. nRetLen) EndFunc Desplazamiento con "ENTER" en grid Por defecto cuando presionamos "Enter" en un grid este se desplaza a la siguient e columna. INTEGER nRetLen. . cDefault. nNum1 = 9874.T. 2) Abrir un documento de Word e impedir que lo editen En este ejemplo se abre un documento de Word a través de automatización y se impide que el usuario pueda realizar cambios sobre él.ini" en c: y agrégale los sig uientes datos: [RUTADB] Directorio =C:MiProgramaDB Ahora si desde VFP quisiéramos conocer el valor almacenado en la entrada Directori o deberíamos hacerlo así: ? LeerIni("RutaDB".ActiveDocument. @cRetVal.6935 nNum2 = 1235. pero podemos hacer que se desplace al siguiente registro. . nRetLen cDefault = "" cRetVal = Space(255) nRetLen = LEN(cRetVal) DECLARE integer GetPrivateProfileString IN WIN32API . String cEntry.F. cEntry.WindowState= 2 . Gracias a Gorka. lo cual queremos evitar. .Show() Endwith
. pero al hacerlo el número es aproximado."Directorio".ActiveDocument.Documents.Close(. 2) ? Round(Floor(nNum2 * 100) / 100.application") loWord.Visible= .Quit Release loWord Mostrar un reporte dentro de un formulario Excelente truco con el cual podrás mostrar tu reporte en un formulario. cEntry. oRep =Createobject("Form") With oRep . STRING cSection.ini") Function LeerIni(cSection. loWord.
Interesante no? On Error * Y si deseas evitar que el usuario salga del programa .frx preview nowait If wexist("Print Preview") move window _Print Preview_ to 10.. no funcionaran las combinaciones de teclas para copiar (CTRL+C). muchas veces de seamos colocarla anclada al resto de barras... Primero ejecutamos el reporte con la cláusula tradicional: Report Form nombrereporte. Agrega el siguiente código en el método BeforeOPenTable del dataenvironment (entorno de datos) del reporte ZOOM WINDOW "Report Designer" MAX KEYBOARD "{F3}" &&75% *KEYBOARD "{F3}{F3}" &&50% *KEYBOARD "{F3}{F3}{F3}" &&25% *KEYBOARD "{F3}{F3}{F3}{F3}" &&10% Lo que debes hacer es enviarle pulsaciones de la tabla F3 con la función Keyboard.frx Preview Window (oRep.11 Endif Anclar la Barra del Preview de Reportes Cuando ejecutamos un reporte y este muestra la barra de Preview.D LL Move Window _Print Preview_ to 10. El asterisco ( * ) permite inhabilitar algunas cositas de VFP. Quieres que tu programa nunca mande un error.Report Form MiReporte. Coloca el siguiente código en el Init del Dataenvironment If wexist("Print Preview") && O WEXIST(_Vista Preliminar_) si utilizas VFPXESN. ON KEY LABEL CTRL+V * ON KEY LABEL CTRL+C * Cuando el usuario presione dichas combinaciones de teclas no harán nada.... On Shutdown * Prueba con otras opciones y comprobaras lo útil que es el asterisco ( * ) Anclar barra del preview de los reportes Si deseas que cuando hacer un report form la barra del preview se ancle puedes u tilizar este código. Pegar (CTRL+V). mejor dicho ¿quieres esconder tus errores? .. cada F3 que envíes hará que el zoom del preview sea más pequeño Comprimir y descomprimir con WinXP Puede incorporar dentro de sus aplicaciones rutinas para comprimir y descomprimi r archivos a través de WinXP o WinME.Name) Deshabilitar algunas combinaciones de teclas Interesante truco con el cual podrás deshabilitar algunas combinaciones de teclas y hasta funciones de VFP.10 mouse dblclick at 11... y de igua l forma puedes hacer con todas las teclas. aquí esta la forma de hacer lo. en este caso. a unos les gusta e l preview al 100% a otros les gusta verlo al 50% ..11 Endif Preview de los reportes a un zoom especifico Nuestro clientes piden muchas cosas (por no decir otra cosa)...10 Mouse Dblclick at 11. ************************************ * COMPRIMIR ************************************
0x0.. la primera: nAño = 2004 ? !Empty(Date(nAño.NameSpace(cOrigen).. ..Date(Year(Date()). je. je."").Application") For Each oArchi In oShell.NameSpace(cNuevoZip). pero al hacerlo el número es aproximado... 1. Long wParam.Items oShell. WM_CLOSE. Existen diversas formas de terminarlo . lo cual queremos evitar. Long Lparam Declare Long FindWindowEx In "user32" .Items oShell. 0.Long wMsg.). String lpClassName. l o que hacemos entonces es cerrarlo. "Button". String lpWindowName Declare Long SendMessage In "user32" .NameSpace(cMiZip).6935 nNum2 = 1235.Null. 02. je.cNuevoZip = "C:MiArchivo. Long HWnd. Long hWnd1. ?DiaDelAño(Date()) ?DiaDelAño(Date()-10) ?DiaDelAño(Date()-60) Function DiaDelAño(dDate) nDia = dDate .05685 ? Round(Floor(nNum1 * 100) / 100. 2) ? Round(Floor(nNum2 * 100) / 100..Zip" cOrigen = "c:Directorio" Strtofile(Chr(0x50)+Chr(0x4B)+Chr(0x05)+Chr(0x06)+Replicate(Chr(0). 0) Calcular el número del día en el año Función que te devuelve cuantos días han pasando en el año hasta una fecha determinada .. Long hWnd2. String lpsz2 #Define WM_CLOSE 0x10 SendMessage(FindWindowEx(FindWindow("Shell_TrayWnd". nNum1 = 9874. 1) + 1 Return(nDia) Endfunc Determinar si un año es bisiesto No hace falta explicar. 2) Cerrar el Botón inicio de Windows En ocasiones no queremos que el usuario tenga acceso al botón inicio de Windows. 29)) nAño = 2005
. String lpsz1. Declare Long FindWindow In "user32" .cNuevoZip ) oShell = Createobject("Shell.18).CopyHere(oArchi) EndFor Devolver número con 2 decimales sin aproximarlo En muchas ocasiones tenemos un número con más de 2 decimales y queremos que solo nos devuelva 2.Zip" cDirDesti = "c:Directorio" oShell = Createobject("Shell.CopyHere(oArchi) Endfor ************************************ * DESCOMPRIMIR ************************************ cMiZip = "C:MiArchivo.NameSpace(cDirDesti).Application") For Each oArchi In oShell.
0) Case cCountry == "Sweden" nColor = Rgb(224.T. .grid1. HEIGHT = This. Localo o = Createobject("myform") o.Height= This.255) Case cCountry == "UK" nColor = Rgb(224.100. 4) ?Mod(2005. 4) Grid y DynamicBackColor Un excelente ejemplo de como podemos utilizar DynamicBackColor para establecer u n color a la celda dependiendo de una condición.grid1.224) EndCase
.? !Empty(Date(nAño.224.Width This.Height EndProc Function GetBackColor(cCountry) Local nColor Do Case Case cCountry == "Germany" nColor = Rgb(255.Width. WIDTH = This.224.224. 29)) Otra forma utilizando MOD ?Mod(2004. DataSession = 2 AutoCenter = .Width= This. . 02.255.Show(1) Define Class myform As Form DoCreate = .160) Case cCountry == "Spain" nColor = Rgb(100.GetBackColor(allt(country))") EndProc Procedure Resize This. Into Cursor TmpCust Use In "customer" EndProc Procedure Init This.160) Otherwise nColor = Rgb(224.grid1.160) Case cCountry == "France" nColor = Rgb(100. DELETEMARK = .F. Caption = "Trabajando con DyamicBackGround" Width = 600 Height = 400 MinHeight = 300 MinWidth = 300 Add Object grid1 As Grid With . Order By MaxOrdAmt Desc.Height.T.. "Thisform. Procedure Load Select * From (_samples+"datacustomer") .224.SetAll("dynamicbackcolor".
T.Columns(1).ColumnOrder =This. LockScreen= .. minada cadena nActSetMemo = número de líneas de un EditBox Con este truco podrás determinar le número de líneas que ocupa una deter de texto en un EditBox. Set("MemoWidth")
With Thisform. String cFile.""..horas .cArchivo.0) Determinar el MUY BUENO .(Len(lcMess)/2))Nowait Dejar fija primera columna de un grid Este es un truco bastante solicitado ...minutos ..*" cArchivo = GetEnv("TEMP") + "" + Sys(2015) + "."0") + " Seg" Wait window centrado en la pantalla Truquito sencillo pero bueno. 2. En el AfteRowColchange del Grid digita lo siguiente: Lparameters nColIndex Thisform.FontName.3) + " Días ". nSeg = 276786 ? Padl(Int( nSeg / 86400). + Padl(Int(nSeg % 60).LockScreen = . Podrás ejecutar tus comando de MS-DOS sin que se muestre la ventana negra del DOS. LockScreen = . ** Y en el Scrolled del Grid esto : Lparameters nDirection Thisform.
. "0") + " Min ". String cAction.. h oras.Edit1 Set Memowidth To Floor(.Width/(Fontmetric(6. String cDir.segundos Código bastante útil .Value) EndWith ? "Número de líneas. Si deseas que la ventana sea visible solo cambia el último parámet ro de a función ShellExecute y colócalo en 1 Declare Integer ShellExecute In shell32.T. LeftColumn Thisform... + Padl(Int((nSeg % 3600)/60). String cParams. Con VFP 8 o superior ya es posible hac erlo más fácilmente.Dll."0") + " Hrs ". Integer nShow cComando = "Dir c:*.Return nColor EndFunc EndDefine Ejecutar comandos de MS-DOS sin que se muestre la ventana Excelente . This....T. Integer hndWin.2."". En la variable cComando puedes colocar cualquier instrucción válida de MS-DOS que lu ego será ejecutada. Aquí tienes 2 formas de hacerlo.(Scols()/2 .. " + Transform(nLines) Set Memowidth To nActSetMemo Convertir segundos a días ... lcMess = "Mesaje centrado en la pantalla" Wait lcMess Window At Srows()/2. cArchivo) =ShellExecute(0. + Padl(Int((nSeg % 86400)/3600). minutos.FontSize)+1)) nLines = Memlines(...bat" =StrToFile(cComando. podemos convertir un número determinado de segundos en días.2."Open"..
minutos y segundos entr e dos valor DateTime."99")+":"+ .0" $ cOsx cSistema = "2000" Case "NT" $ cOsx cSistema = "NT" Case "4.. Dtot(Date()-10)) Function HMSDif (tDateTime1.60).01" $ cOsx cSistema = "XP" Case "5. cOsx = Os(1) cSistema = "" Do Case Case "6."9999")+":"+ .Horas .Columns(1). Transform(Mod(nS.Segundos Este truco es bastante útil . está es una for ma sencilla pero bastante buena.F.ColumnOrder=nPos+1 Else This.If nDirection > 3 This .Minutos .00" $ cOsx cSistema = "LongHorn" Case "5. Calcular el número de horas.tDateTime1 Else nS = tDateTime1 .RelativeColumn If nPos>0 This.1" $ cOsx
. nS cRet = "" If! Vartype(tDateTime1)= "T" Or !Vartype(tDateTime2)= "T" cRet = "E" Endif If Empty(cRet) If tDateTime2 > tDateTime1 nS = tDateTime2 .02" $ cOsx cSistema = "2003" Case "5. Transform(Mod(Int(nS/60). OTRA FORMA ** En el AfteRowColchange del Grid digita lo siguiente: nPos =This.LeftColumn Endif Thisform.ColumnOrder=1 Endif Diferencia entre dos DateTime . ActiveColumn-This.. ColumnOrder = This. tDateTime2) Local cRet. ?HMSDif(Datetime().COlumn1.tDateTime2 Endif nS = Int(nS) cTime = Transform(Int(nS/3600)." 99") Return cTime Else =Messagebox("Los valores deben ser DateTime") Return "" Endif Endfunc Sistema operativo que utilizas Existen diversas formas de conocer que sistema operativo utilizas.LockScreen= .COlumn1.60).
En el evento Timer del Control Timer escribimos: THISFORM..1" Endcase ? "Windows " + cSistema Obtener la parte fraccionaria de un numero Un truco EXCELENTEEEE . Calcular tiempo que tarda realizar una Operación Un simple pero muy interesante ejemplo de como y donde implementar estas útiles fu nciones. para realizar este truco sigue estos pasos: Haz clic con el ratón derecho en una zona libre del Escritorio y luego selecciona Nuevo y Acceso directo.exe -s -t 12 de esta forma dejarás un margen prudencial de 12 segundos para apagar el PC.53) % 1 ? ABS(329.. de como determinar la parte decimal o fraccionaria de un número. lnInicio = SECONDS() for i = 1 to 10000 && en este ejemplo cuanto tarda realizar && el ciclo for de 1 hasta 10000 endfor ? SECONDS() .) el camp o solo lectura (ReadOnly) de la barra..Visible Impedir que cambien la configuración del Preview de Reportes Si no quieres que te modifiquen la configuración del Preview de reportes desde abr ir la tabla de recursos de VFP (Foxuser.Label1.Visible =! THISFORM. para ello deberás crear un icono que te permita hacer esta función.0" $ cOsx Or "3.Label1.lnInicio Texto parpadeante Para realizar el efecto debemos crear un formulario." $ cOsx cSistema = "3.t.
.cSistema = "98" Case"4.12) % 1 Seleccionar el texto de un control Una forma sencilla de seleccionar el texto de un control . la propiedad Interval de este se la establecemos a 700 (milisegundos). después le pones el nombre que quieras al acceso directo y pinchas el botón Finalizar..9" $ cOsx cSistema = "ME" Case "4.. luego eje cutamos. ? ABS(78. En la ventana del acceso directo debes escribir shutdown -s -t 00 y pulsa el botón Siguiente. En el evento GotFocus() del control colocas lo siguiente: Keyboard '{END}' Keyboard '{SHIFT+HOME}' Apagar rápidamente con WinXP Puedes hacer que tu PC se apague con doble clic. Cambiamos la propiedad caption de la etiqueta a al texto que deseamos.dbf) y cambiar a verdadero (. Si quieres dejar algo de tiempo para cerrar las aplicaciones debes poner esto sh utdown.9" $ cOsx cSistema = "95" Case "3. una etiqueta y un control t imer.
crpe.ExportOptions.) && . Después de él indicamos la pagin a de inicio y final del reporte a imprimir. no muestra cuadro para configurar impresora Crystal Report y VFP Uno de los grandes problemas de VFP son los reportes. No quiero decir con esto que sea mejor.doc" oRepx. Primero veamos como puedo exportar un reporte a extensión .FormatType = 14 && Formato de Word oRepx. simplemente es otra forma de hacerlo y tiene muc has ventajas. pero podemos realizar los reportes en Cristal Report y luego llamarlos desde VFP.crpe.OpenReport("C: eporteventas.) && No muestra ningun cuadro de Dialogo release oRepx release oCristalReport Los otros formatos en que podemos guardar los reportes son: Extensión FormatType RTF 4 EXCEL 7 27 o 28 EXCEL 8 29 o 30 Para ver en vista previa un reporte: oCristalreport = createobject("crystal. Supongamos que tenemos un reporte de 20 paginas.ExportOptions.DestinationType = 1 && Tipo de Destino a guardar oRepx. ? SET("PRINTER". más fácil o más cómodo.application") oRep = oCristalreport.OpenReport("C: eporteventas.RPT") oRepx. No quiero decir con esto que sea mejor.Use SYS(2005) Again Locate For Id=_TTOOLBAR_ and name=_Print Preview_ Replace readonly with .15 Crystal Report y VFP Uno de los grandes problemas de VFP son los reportes.T. Primero veamos como puedo exportar un reporte a extensión . pero podemos realizar los reportes en Cristal Report y luego llamarlos desde VFP. En los ejemplos que demuestro estoy utilizando la versión 8 del Cristal Report de Seagate pero considero que se debe comportar igual con las demás versiones.OpenReport("C: eporteventas.application") oRepx = oCristalReport. 3) && Impresora predeterminada de VFP Imprimir paginas determinadas de un Reporte Cuando tenemos un reporte y queremos imprimir una pagina determinada o desde una pagina a otra podemos utilizar el argumento RANGE.Export(.DOC (Word)
.ExportOptions. Use Determinar la Impresora predeterminada En VFP la impresión causa algunos malestares y debemos conocer cual es la impresor a predeterminada tanto en Windows como en VFP.DOC (Word) oCristalReport = createobject("crystal.Printout(. más fácil o más cómodo.Preview Para mandarlo a imprimir oCristalreport = createobject("crystal.F. En los ejemplos que demuestro estoy utilizando la versión 8 del Cristal Report de Seagate pero considero que se debe comportar igual con las demás versiones.RPT") oRep. yo puedo mandar a imprimir de l a pagina 10 a la 15 de la siguiente manera REPORT FORM nombreinforme RANGE 10.F. 2) && Impresora predeterminada de Windows ? SET("PRINTER".F.application") oRep = oCristalreport.DiskFileName = "c: eporteventasdelmes. simplemente es otra forma de hacerlo y tiene muc has ventajas.RPT") oRep.crpe.
F.FormatType = 14 && Formato de Word oRepx.application") oRep = oCristalreport.ExportOptions. luego selecciona la barra Print Preview (VISTA PRELIMINAR) y ahora haz click en Customize (PERSONALIZAR).) && No muestra ningun cuadro de Dialogo release oRepx release oCristalReport Los otros formatos en que podemos guardar los reportes son: Extensión FormatType RTF 4 EXCEL 7 27 o 28 EXCEL 8 29 o 30 Para ver en vista previa un reporte: oCristalreport = createobject("crystal.crpe.Width/2 . l uego a ToolBars (Barra de herramientas).crpe. fontstyle WITH 1 FOR objtype = 1 Con esto ponemos como predeterminado la fuente Verdana a 10 puntos y negrilla.ExportOptions. Como sabemos un reporte no es más que una tabla donde se almacenan los objetos y l as propiedades de estos que luego son invocados por el Dataenvironment. Ahora ve al menú VER.dbf Si deseas que el usuario final no pueda acceder a los botones debes distribuir e l archivo Foxuser. ve a la barra y con click sostenido quita todos los botones que quieras y listo la configuración se g uardara en Foxuser.DiskFileName = "c: eporteventasdelmes.Scalemode = 0 Wait Window cMensage At Int(_Screen. Solucionar problemas de Memoria con WinXP Evitar el error de Memoria en XP al ejecutar comandos de D.F.O. en la sección 386ENH agrega la siguiente linea:
.INI. Bueno para realizar este truco te recomiendo cierres todo.F. cMensage = "Este es un ejemplo del mensaje" _Screen.OpenReport("C: eporteventas.oCristalReport = createobject("crystal. s i en fontstyle ponemos 0 tendremos letra normal.S Edita el archivo SYSTEM.RPT") oRep. Quitar botones de la barra del Preview Truco indispensable si deseas quitar algunos botones de la barra del preview e i mpedir así que se imprima desde ahí o se seleccione alguna opción.application") oRepx = oCristalReport. Int(_Screen.doc" oRepx.) && .crpe.RPT") oRepx.Export(.OpenReport("C: eporteventas.Len(cMensag e) / 2) Cambiar propiedades de los reportes desde código Podemos manipular las propiedades de un formulario desde código.Height/2). no muestra cuadro para configurar impresora Wait Window centrado en la pantalla Por defecto el mensaje mostrado por Wait Window se muestra en la parte superior derecha de la pantalla. Ahora la barr a te aparecerá deshabilitada detrás de ventana de personalización. con este truco se muestra centrado en la pantalla.Printout(.application") oRep = oCristalreport.ExportOptions.DestinationType = 1 && Tipo de Destino a guardar oRepx. fontsize WITH 10.Preview Para mandarlo a imprimir oCristalreport = createobject("crystal.RPT") oRep.OpenReport("C: eporteventas. Bueno para cambiar las propiedades de los reportes desde código debemos abrir el r eporte como una tabla: USE nombrereporte.frx REPLACE fontface with "Verdana".dbf con tu proyecto.
Impresoras.VolumeSerialNumber Next Numero de serie del disco duro Una de las formas más sencillas de obtener el serial de fabrica de las unidades de disco. THISFORM. loComDialog = newobject( "mscomdlg.ShowColor() && Mostrar Colores locomdialog.ShowFont && Mostrar Fuente locomdialog. Ayuda.Name + " Serial: " + Disco.SetAll("Resizable". "Column") Determinar el Serial del Disco con WSH Otro de los temas de bastante consulta es como obtener el Serial de un Disco. pero siempre nos muestras la ventanita "Imprimiendo".ShowPrinter() && Mostrar Impresora locomdialog. tales como: Guardar.Drives("c"). Fuentes.SerialNumber Invocar cuadros de dialogo de Windows Existe una forma sencilla de invocar cuadros de dialogo de Windows. es ta forma es súper sencilla y con poco código. objWMI = Getobject("winmgmts:\\") cCadWMI = "Select * from Win32_PhysicalMedia" oSistema = objWMI. Esta es la forma de omitir esa ventana DECLARE INTEGER GetDesktopWindow IN WIN32API DECLARE INTEGER LockWindowUpdate IN WIN32API INTEGER lnHandle hWin = GetDeskTopWindow() LockWindowUpdate(hWin) && Bloquea actualización de la pantalla REPORT FORM NombreReporte. Abrir.ExecQuery(cCadWMI) For Each Disco In oSistema ? "Unidad: " + Disco.PerVMFiles = 80 Impedir que cambien el tamaño de las Columnas de un Grid Si quiere que nadie cambie el tamaño de las columnas de un grid.ShowOpen && Mostrar Abrir Suprimir cuadro de diálogo "Imprimiendo" con el API Cuando mandamos reportes a la Impresora algunas veces queremos personalizar esta operación.filesystemobject") ? oFS.F..commondialog" ) locomdialog. puede utilizar es ta forma.Grid1. en este ejemplo se devuelve el serial del sistema o perativo. Color.ShowSave() && Mostrar Guardar loComDialog. objWMI = Getobject("winmgmts:\\") cCadWMI = "Select * from Win32_LogicalDisk" oSistema = objWMI.frx TO PRINTER LockWindowUpdate(0) && No actualiza la pantalla Unidad y serial lógico de las unidades de disco De una unidad de disco es posible obtener 2 seriales: el de fabrica y el que le asigna el sistema operativo. .ExecQuery(cCadWMI)
. oFS=CreateObject("scripting.
.CurrentClockSpeed NEXT P. objWMI = GETOBJECT("winmgmts:\\") colItems = objWMI./ Usa la clausula PROMPT de la orden REPORT FORM para mostrar el diálogo de impr esión.SetDefaultPrinter() Next Cancelar todos los trabajos en impresión Aquí tienes un ejemplo de como cancelar los trabajos que se esten imprimiendo util izando WMI.CancelAllJobs() Next Velocidad y tipo de procesador Utilizar WMI desde VFP para obtener la velocidad y tipo de procesador del PC..T. En el evento Click() de el botón de comandos escribe: Thisform.ExecQuery("Select * from Win32_Processor".ExecQuery(cCadWMI) For Each objPrinter in objImp objPrinter.ExecQuery(cCadWMI) For Each objPrinter in objImp objPrinter./ De qué forma puedo usar la tecla ESC para salir de un Formulario? R../ La mejor forma es poner la propieda Cancel del botón de comandos a . Esto s ería la forma más correcta de trabajar en perfecta consonancia con el diseño de Interf aces de windows.SerialNumber Next Fecha de instalación del sistema operativo Utilizando WMI desde VFP para conocer la fecha de instalación del sistema operativ o. nShiftAltCtrl IF nKeyCode = 27 RELEASE THISFORM
./ ¿Hay alguna forma de imprimir las páginas 10 y 11 de un Report especificando sólo 10-11? R. esta vez utiliza ndo WMI.InstallDate Next Establecer una impresora por defecto Otra forma de establecer la impresora por defecto de Windows.ExecQuery(cCadWMI) For Each oSys In objOper ? oSys. objWMI = GetObject("winmgmts:\\") cCadWMI = "Select * from Win32_Printer Where Name = 'Canon S200'" objImp = objWMI. Aquí se puede señalar el rango de páginas para ser impresos P.Name ?objItem.. objWMI = GetObject("winmgmts:\\") cCadWMI = "Select * from Win32_Printer Where Name = 'Canon S200'" objImp = objWMI.For Each Disco In oSistema ? "Serial de fabrica :" + Disco. objWMI = Getobject("winmgmts:\\") cCadWMI = "Select * from Win32_OperatingSystem" objOper = objWMI.48) For Each objItem In colItems ? objItem.Release() También se podría usar el evento KeyPress del formulario con: PROCEDURE KeyPress LPARAMETERS nKeyCode.
Visible = . .Sparse= .Column3.Left = 24 .Header1.Column1.Header1.dbf" Select . Endwith oForm.SetAll("DynamicBackColor".Column1. .T.Column1..ENDIF ENDPROC Grid multiselección Una de las preguntas habilítales es como podemos hacer para poder seleccionar múltip les registros en un grid.F. En este caso utilizamos un checkbox para hacer la selección de los registros.Column2.Caption= "Nombre" . Public oForm oForm = Createobject("FrmGrid") oForm.CurrentControl= "Check1" . RGB(255. From Employee Into Cursor Empleados Readwrite EndProc Procedure Unload Use In Employee EndProc EndDefine Si bien con la tecla [Esc] sales del browse.Width= 17 .Column3.255. debido a qu e dicha tecla cancela la opcion que puedas estar ejecutando. As OK. Trim(Last_Name)+" " + Trim(First_Name) .Column1.210).T. debes de tener cuidado.AddObject("Check1".T.Caption= "Código" ..Visible = . Emp_ID.Top = 24 . "COLUMN" ) .Caption= "" .ColumnCount = 3 .255))".AddObject("Grid1".Width= 194 .Width= 50 .Height = 288 .Column1. Define Class FrmGrid As Form Top = 0 Left = 0 Height = 334 Width = 376 DoCreate = .T.Width = 320 .220.Check1.Header1."Grid") With oForm. RGB(0.Visible = ..Grid1 . Caption = "Grid multiselección" WindowType = 1 WindowState = 0 Name = "FrmGrid" Procedure Load Use Home() + "SamplesDataemployee."CheckBox") .Column1. te recomiendo por c uestion didactica que utilices mejor los siguiente ritina: On Key Label Enter Keyboard "Ctrl+W" * Rutinas de tu browse Browse On Key Label Enter Nota: es importante que luego de la rutina de tu browse retornes la tecla enter a su e
.Column2.F."IIF(Ok.
. oIE = Createobject("InternetExplorer.stado natural Para poder salir del browse usando la tecla ENTER. SET ESCAPE OFF USE * ---. Define Window WinSQL From 12. FOX "entiende" que has presionado ESCAPE..
.item[1]. ON KEY LABEL ENTER KEYBOARD "{ESC}" BROWSE * ----. pero si aún así quieres utilizarla.forms[0] oForm.submit() Quitar el menú de VFP Si quieres quitar el menú de VFP puedes hacerlo de la siguiente forma . SHADOW Color Scheme5 Double Name loWind Active Window WinSQL Noshow Set Talk Window WinSQL Set Talk On Set Notify On Select * From Tabla Release Window WinSQL Llenar formularios en paginas desde VFP A través de automatización puedes los formularios de captura de datos de las paginas webs ... l o que hacemos entonces es cerrarlo.. Declare Long FindWindow In "user32" . SET SYSMENU TO Cerrar el Botón inicio de Windows En ocasiones no queremos que el usuario tenga acceso al botón inicio de Windows.davphantom.Primero desconectamos la tecla escape.. oDoc = oIE.Document oForm = oDoc.value = "USUARIO" oForm.. ON KEY LABEL ENTER **************************** Es muy importante que "desconectes". Para poder ver la barra la tabla debe tener bastantes registros.Ahora cada vez que presiones ENTER.70.Navigate("http://www. será como presionar escape.net") Do While(oIE.Busy) DoEvents EndDo oIE. puedes utilizar el siguiente código: ************************* * ---.item[0].value= "CLAVE" oForm. Mostrar barra de Progreso en un Select SQL A muchos les gustaría mostrar una barra de progreso en sus consultas Select SQL.Desconectamos la tecla ENTER. pues de lo contrario cada vez que presiones enter. n o es muy bueno hacerlo puesto que al estar activo el Set Talk las consultas tard aría mucho más. la sesión como usuario debe estar cerrada para poder probar el ejemplo. para que funcione como tal.30 To 16..Visible = . el ENTER.T... En este ejemplo se muestra como logearse en mi sitio web a través de VFP.Application") oIE.
Long wMsg. String lpWindowName Declare Long SendMessage In "user32" .application") loWord.T. Having Count(Campo1+Campo2+Campo3+Campo4) > 1 Mostrar un reporte dentro de un formulario Excelente truco con el cual podrás mostrar tu reporte en un formulario. 0. "Button". String lpsz1.Workbooks.Add For i=1 To 3 For x=1 To 13 oExcel.A2:M2. String lpsz2 #Define WM_CLOSE 0x10 SendMessage(FindWindowEx(FindWindow("Shell_TrayWnd".Range("A1:M1.Visible= . Buscar registros duplicados en una tabla Truco básico pero bastante útil. Long hWnd1.) loWord. . Long hWnd2.F.).Documents. Local loWord As Object loWord = Createobject("word.Null.Perspective=100 .Close(. Gracias a Gorka.Elevation=0 EndWith oExcel. Group By X.ActiveDocument.Open(Getfile().PrintPreview loWord. Long Lparam Declare Long FindWindowEx In "user32" . 0x0.Charts. Long wParam.T.Legend.Select oGraph = oExcel.
.Type = -4101 . Long HWnd.ActiveDocument. oExcel = Createobject("Excel.Visible = .x).Value = Ceil(Rand()*1000) Next Next oExcel. 0) Abrir un documento de Word e impedir que lo editen En este ejemplo se abre un documento de Word a través de automatización y se impide que el usuario pueda realizar cambios sobre él.Cells(i.Add() With oGraph .A3:M3").Protect(1) loWord.Application") oExcel.1) loWord.Clear .String lpClassName.Quit Release loWord Generar grafica en Excel a través de automatización Muy bueno y sencillo ejemplo de como generar gráficos de áreas en Excel a través de au tomatización. En este caso determinados los registros duplicados por un campo especifico Select Campo From Tabla Group By Campo Having Count(Campo)> 1 En este caso determinados los registros duplicados por todo el registro Select Campo1 + Campo2 + Campo3 + Campo4 As X From Tabla."").. WM_CLOSE.ActiveDocument. loWord.
"total for the sum of text before and text "+. "Note that there is a limit of 32 characters "+.gText y le marcas la opción que dice "Camp o general de una tabla" Local cStr cStr="Note that there is a limit of 32 characters "+.frx y agrégale un control RT F. "NOMBRE-RED".frx Preview Window (oRep.RTF extension to work properly. Puedes conocer los nombr es de los equipos e impresoras compartidas. "after for simple numbering. "has a limit of 64 characters total for the sum "+. "of all levels. ".gText g) Insert Into ctext (lctext) Values (cStr) _rtfFile = "c:"+Sys(3)+". le colocas como control source ctext. Multilevel numbering "+.1) For i = 1 to Alen(APcs) ? APcs(i) Next Justificar textos en reportes Truquito muy bueno que permite poder justificar textos en los reportes utilizand o el control RTF. "of all levels.Name) PCs conectados a la Red Últimamente se a convertido en una pregunta frecuente .1" EndScan Report Form rtfdemo.Caption= "Titulo del Reporte" . "after for simple numbering. "total for the sum of text before and text "+. "has a limit of 64 characters total for the sum "+.frx Preview Noconsole Rellenar con ceros a la izquierda Otra forma de rellenar con ceros a la izquierda una cadena." Create Cursor ctext (lctext m.RICHTEXTCTRL.. Esto te devolverá los nombres de todos los equipos que se encuentran en la RED con el nombre que le pases.. ANetResources(APcs.Show() Endwith Report Form MiReporte. ". En el ejemplo quiero
. Para probar el ejemplo crea un reporte llamadortfdemo.NOTE: The file must have a"+.rtf" Scan Set Textmerge To &_rtfFile Noshow Set Textmerge On \{ tf1ansiqj <>} Set Textmerge To Append General gText From &_rtfFile Class "RICHTEXT."+.NOTE: The file must have a"+.RTF extension to work properly. Multilevel numbering "+.oRep =Createobject("Form") With oRep .WindowState= 2 ..
Columns(1)..ColumnOrder=1 Endif
. OTRA FORMA ** En el AfteRowColchange del Grid digita lo siguiente: nPos =This."@L 99999999") El resultado sería 00000080 Determinar el MUY BUENO ..ColumnOrder=nPos+1 Else This.FontSize)+1)) nLines = Memlines(. ** Y en el Scrolled del Grid esto : Lparameters nDirection Thisform.rellenar con ceros el número 80.COlumn1.Width/(Fontmetric(6.F. LeftColumn Thisform. LockScreen= ..Columns(1). nEstilo = 4 + 32 + 4096 && el valor no documentado es 4096 MESSAGEBOX("ESTE ES UN MESSAGEBOX". ? TRANSFORM(80.LockScreen= .T.. ActiveColumn-This. minada cadena nActSetMemo = número de líneas de un EditBox Con este truco podrás determinar le número de líneas que ocupa una deter de texto en un EditBox.. " + Transform(nLines) Set Memowidth To nActSetMemo Messagebox por encima de todas las ventanas de Windows Generalmente los Messagebox solo se muestran dentro del _Screen de VFP pero exis te un valor no documentado que hace que el Messagebox se muestre encima de todas las ventanas de Windows.COlumn1. "DIEFERNTE" ) Código ESC para cortar el papel en impresoras Epson Este truco te explica cual es la secuencia escape que debes enviar a la impresor a Epson (TMU) para que corte el papel.T...FontName.. LockScreen = .Value) EndWith ? "Número de líneas.RelativeColumn If nPos>0 This.ColumnOrder =This.. This.. Set("MemoWidth")
With Thisform. En el AfteRowColchange del Grid digita lo siguiente: Lparameters nColIndex Thisform. Con VFP 8 o superior ya es posible hac erlo más fácilmente.LeftColumn Endif Thisform.T. ColumnOrder = This.LockScreen = . If nDirection > 3 This .Edit1 Set Memowidth To Floor(. nEstilo . Set Console Off Set Device To Printer Set Printer To Name NombreDeImpresora Set Print On ??? Chr(27)+"m"&& Corta el Papel Set Print Off Set Device To Screen Set Printer To Set Console On Dejar fija primera columna de un grid Este es un truco bastante solicitado . Aquí tienes 2 formas de hacerlo..
string cDir.jpg" Bitmap STYLE "T" Center Devolver el nombre físico del formulario actual En muchas ocasiones se necesario conocer el nombre del formulario que se esta ej ecutando. String t cParam." . esta es una de las más sencillas." . En el ejemplo se muestra como imprimir el contenido de este ActiveX. + "SERVER=tu_server.""." . aquí tienes varios ejemplos de como hacerlo.
..cCadConnDSN) If nHanConn > 0 =MessageBox("Conectado a la base de datos de SQl Server") Else =MessageBox("Error al conectarse a la base de datos de SQl Server") EndIf Agregar imagen al Screen centrada Este es un antiguo truco que te permite agregar una imagen al screen de VFP cent rada.Thisform) Wait window cForm Imprimir el contenido de un RTF El RTF es un control ActiveX que permite dar características al texto al estilo de Word. Dll.0) Nombre del dominio en que se logeo el PC p align="justify">Un pequeño truco para cuando quieras determinar en que dominio s e logeo un determinado PC.String cOperation.pwd=sa_pw" O cCadConnDSN = "DRIVER = {SQL Server}. + "PWD=clave_pw. cForm = SYS(1271. . "print". Crea un formulario y un botón y coloca este código en el evento click del botón. Para eso utilizamos la función ShellExecute del API de Windows." . La función Sys(1271) hace exactamente esto. + "DATABASE=PUBS.. + "APP=__" nHanConn = Sqlstringconnect(m. Declare Integer ShellExecute In shell32.. + "UID=nombre_usuario.uid=sa. .. Viejo pero bueno.2.pwd=sa_pw" O cCadConnDSN = "driver = {SQL Server}." ." .pdf" ShellExecute(0. long HWnd. ? GetEnv("USERDOMAIN") Conectarse a una base de datos de SQL Server Esta es otra de las preguntas frecuentes .. @ 2. Integer nShow cRutaPDF = "C:Rutaarchivo.000 Say "c:imagen. string cFile. Fullpath("").uid=sa.000..server=tu_server. && Nombre de la base de datos + "WSID=nombre_usuario.Imprimir un archivo PDF En muchas ocasiones se necesita imprimir un archivo PDF (Acrobat Reader) y pensa mos diferentes formas de hacerlo.server=tu_server. cCadConnDSN = "driver = SQL Server. cRutaPDF.
FormatType = 14 && Formato de Word oRepx.RPT") oRepx.ExportOptions. No quiero decir con esto que sea mejor..DestinationType = 1 && Tipo de Destino a guardar oRepx. At(" ".. A continuación se obtien e información sobre la unidad de red y estas valores se le pasan como parámetro al p rograma PING.textrtf) . Y. simplemente es otra forma de hacerlo y tiene muc has ventajas.sellength=len(.crpe.1.. pero podemos realizar los reportes en Cristal Report y luego llamarlos desde VFP. Scan For lnField = 1 To Afields(laFields) \<> Endfor Endscan
Set Textmerge Off Set Textmerge To Strtofile(lcHTML.. En este e jemplo se recorre numero de campos que tenga la tabla y luego el total de regist ros.application") oRepx = oCristalReport.8) + ".OpenReport("C: eporteventas.txt" X = SubStr(sys(0).1.ExportOptions.selprint Exportar a HTML de forma sencilla Esta es una de las formas más sencillas de exportar una tabla a HTML . With Thisform. pero eso también tiene solución y será explicada en la sección de APIS Local F."c:TablaExportada. X. Sys(0))-1) Run PING &X > &F Y = FileToStr(F) Delete File &F U = At("[".K-U) Lo primero que realiza este código es definir algunas variables. K F = Sys(2023) + "" + SubStr(Sys(2015). Y) ? SubStr(Y.doc" oRepx.) && No muestra ningun cuadro de Dialogo release oRepx release oCristalReport
. U. Primero veamos como puedo exportar un reporte a extensión . el único inconveniente es que se mostrara la ventana del DOS. Crystal Report y VFP Uno de los grandes problemas de VFP son los reportes.U. Y) + 1 K = At("]"..htm") Determinar la Dirección IP del Equipo Una forma de conocer la dirección IP del equipo es invocando una función API.Rtf .DiskFileName = "c: eporteventasdelmes. En los ejemplos que demuestro estoy utilizando la versión 8 del Cristal Report de Seagate pero considero que se debe comportar igual con las demás versiones.Para imprimir el contenido debes utilizar el método SelPrint del control RTF .Export(.. luego obtiene el directorio de archivo temporales y genera un archivo único. pero c omentare otra forma de hacerlo y es pasándole el parámetro al programa RUN del DOS.F. más fácil o más cómodo.DOC (Word) oCristalReport = createobject("crystal.selstart=1 .ExportOptions.
Fuentes.) && . Impresoras. sobre t odo al momento de realizar búsquedas dentro tablas lCadena = "El amor es el perdón más fácil" ? CHRTRAN(lCadena.ttFin Local ln.OpenReport("C: eporteventas.ShowColor() && Mostrar Colores locomdialog.5. lnHor. tales como: Guardar. "áéíóúáéíóú". lnDia.ShowFont && Mostrar Fuente locomdialog.ShowSave() && Mostrar Guardar loComDialog._0_) && el número 5 especifica el ancho de la cadena de números Resultado 00350 Invocar cuadros de dialogo de Windows Existe una forma sencilla de invocar cuadros de dialogo de Windows.60) ln = Int(ln/60) lnMin = Mod(ln.ShowOpen && Mostrar Abrir diferencia entre horas FUNTION DifHoras Lparameters ttIni. Color. "aeiouAEIOU") Agregar ceros ( 0 ) a la izquierda de un número Si deseas agregar 0 a un número a la izquierda de este.crpe.Preview Para mandarlo a imprimir oCristalreport = createobject("crystal. Abrir. no muestra cuadro para configurar impresora Quitar acentos de una cadenas de caracteres Algunas veces los acentos son algo molestos y nos causan inconvenientes.F. puedes hacer esto.ShowPrinter() && Mostrar Impresora locomdialog.commondialog" ) locomdialog.OpenReport("C: eporteventas.Los otros formatos en que podemos guardar los reportes son: Extensión FormatType RTF 4 EXCEL 7 27 o 28 EXCEL 8 29 o 30 Para ver en vista previa un reporte: oCristalreport = createobject("crystal. LnVar = 350 && Variable a agregar 0 ?PADL(lnVar. loComDialog = newobject( "mscomdlg.application") oRep = oCristalreport. Ayuda.crpe.RPT") oRep.application") oRep = oCristalreport.Printout(.ttIni lnSeg = Mod(ln.F. Se util iza mucho en la generación de Factura.60) ln = Int(ln/60)
.RPT") oRep. lnSeg If Empty(ttFin) ttFin = Datetime() Endif ln = ttFin . lnMin.
.exe No se pudo iniciar la aplicación porque su configuración es incorrecta. a llamar desde el AFTERROWCOLCHANGE del grid. Los ficheros que copiamos en el directorio de la aplicación son: gdiplus.. de esta forma no tuvimos que registrarlos en cada equipo.Page6.dll msvcr70.0).pgfPiso. en vez de instala r los Runtime de Vfox a cada puesto los colocamos en el Directorio Raiz de la ap licación.Iluminar("Thisform.T.HitRow . "@L 99") Hola Amigos: Les escribo porque tengo el siguiente problema y quizás Conozcan la solución Tengo una aplicación compilada con Vfp8 hice un instalador y anda muy bien en toda s las redes en donde la he instalado salvo en una condición Cuando el cliente es un Win XP con SP2 me da el siguiente error R:\AdmCons\AdmCons.dll Re: RESALTAR UNA CELDA DE UN GRID .LockScreen = .lnHor = Mod(ln.HitRow = RECNO(tcTabla) ThisForm. Transform(lnHor.dll vfp8resn. RGB(255. RGB(255. *Ejemplo: Thisform.grdVisitas". *Hay que pasarle donde esta la ubicación del grid.dll vfp8t. Reinstalar l a aplicación puede solucionar el problema. "@L 99")+ ":"+ .dll vfp8r.255..255. Por supuesto que ya la reinstale 1000 veces de 80 maneras distintas Me pasa con cualquier servidor Win Me Win XP etc pero siempre cuando el cliente es un XP con SP2 Si el cliente es otra cosa o Win XP sin SP2 anda fenómeno Tengo todas las Dll registradas esta todo perfecto En la misma situación he hecho para probar EXE compilado con VFP6 y anda sin probl ema También he descubierto que ejecutando Do R:\Admcons\Admcons. cDynamic = 'IIF(RECNO() = Thisform.. Transform(lnMin. tcTabla Thisform. Solo que como son muchos los puestos que conectan al servidor. Por sotero (#866) a las 20:40 del 14-02-2006 *Metodo iluminar.24) lnDia = Int(ln/24) Return . "clientes") *En el formulario hay que crear la PROPIEDAD "HITROW" LPARAMETERS tcGrid ..exe desde la ventana d e comando de VFP8 anda perfectamente En la empresa tenemos la aplicación compilada en Vfp8 y funcionando en varios equi pos con XP SP2 y funciona sin problemas..255))'
*********************************************** Si estás en VFP 9 esto lo puedes suprimir y poner en el GRID la propiedad HighlightStyle a 2 (Enable highlighting for current row and persist when grid is not the current active control. =cambiar_resolucion(800. STRING cOperation.T.&tcGrid.exe".. STRING cDirectory..
. INTEGER nWinHandle. normalmente yo la diseño en 800 x 600.T. Al momento de imprimir. 'Column') &tcGrid. prueba esto x="Espero que tengas el más feliz de los cumpleaños" @1. 1) CAMBIAR RESOLUCION DE LA PANTALLA Cuando diseñamos nuestra aplicacion tenemos como base una resolucion para nuestra aplicacion.. 850.DLL . cambiando un caracter por otro EJECUTAR OUTLOOK EXPRESS DESDE VFP DECLARE INTEGER ShellExecute .1 say cpconvert(1252. cDynamic. IN SHELL32.Allt(x)) Re: Problema con la "Ñ" Por Christian (#4698) a las 15:17 del 19-01-2006 Hola. "msimn. Espero les pueda ayudar: IF dimensiones()=.F. "¿ Desea cambiarla ?". "Open".) Re: Problema con la "Ñ" Por Ramón Rodríguez (#5229) a las 04:50 del 18-01-2006 El problema es que son códigos de página diferentes entre los archivos dos y Windows . INTEGER nIndex lnalto_screen = getsystemmetrics(h_screenheight) lnancho_screen = getsystemmetrics(h_screenwidth) IF ( lnalto_screen < 600 OR lnancho_screen < 800 ) IF MESSAGEBOX("Es recomendable que la resolución "+CHR(13)+.600) ENDIF FUNCTION dimensiones #DEFINE h_screenwidth 0 && Screen width #DEFINE h_screenheight 1 && Screen HEIGHT LOCAL lnalto_screen. INTEGER nShowWindow ShellExecute(0. lnancho_screen DECLARE INTEGER GetSystemMetrics IN Win32API. STRING cFileName."Verifique pregunta" ) = 6 RETURN . "C:\Program Files\Outlook Express". hace un chrtransc de la descripcion. ""..LockScreen = .SetAll('DynamicBackColor'.. STRING cParameters.Refresh ThisForm. "de su monitor sea de 800 x 600"+CHR(13)+"Para que el sistema se ejecute adecuad amente"+CHR(13)+CHR(13)+...4+32+0. para garantizar el buen funcion amiento yo le indico a los usuarios si estan usando la configuración básica aceptabl e.
4. (2^lncnt)) NEXT RETURN lcretstr ENDFUNC ***** Les explico. 156) lnwidth = IIF(EMPTY(tnwidth). lnmodenum. lnmodenum. tnheight LOCAL lnwidth. lnheight. long2str(tnheight)) && Alto lnresp = changedisplaysettings(@lcdevmode. ENDIF ELSE RETURN . si ud hace diseñado una aplicación en una resolución de 800x600 (en este caso)."atención" ) ENDIF ENDFUNC FUNCTION long2str LPARAMETERS lnlongval *!* Convierte un long integer a un 4-byte character string *!* Sintaxis: LongToStr(lnLongVal) *!* Valor devuelto: lcRetStr *!* Argumentos: lnLongVal *!* lnLongVal especifica el long integer a convertir LOCAL lncnt. 600. 109.F. lcdevmode.0+48+0."atención" ) ELSE MESSAGEBOX("No se pudo cambiar la resolución de su monitor". @lcdevmode) <> 0 lnmodenum = lnmodenum + 1 ENDDO lcdevmode = STUFF(lcdevmode. lnresp lnmodenum = 0 lcdevmode = REPLICATE(CHR(0). INTEGER dw Flags *!* Se usa obtener todos los modos disponibles DO WHILE enumdisplaysettings(NULL. INTEGER i ModeNum. 4. tnwidth) lnheight = IIF(EMPTY(tnheight). lcretstr lcretstr = '' FOR lncnt = 24 TO 0 STEP -8 lcretstr = CHR(INT(lnlongval/(2^lncnt))) + lcretstr lnlongval = MOD(lnlongval. 4.ELSE RETURN . 1) IF lnresp = 0 MESSAGEBOX("La resolución de su monitor ha sido cambiada"+CHR(13)+. long2str(tnwidth)) && Ancho lcdevmode = STUFF(lcdevmode. Function WSHListDrives
. 41. long2str(1572864)) lcdevmode = STUFF(lcdevmode. 800. 113. tnheight) DECLARE INTEGER EnumDisplaySettings IN Win32API STRING lpszDeviceName.F.0+48+0. "Ahora podra trabajar adecuamente". INFORMACION DE DRIVES ¿Quieres conocer toda la información de todas las unidades o drives instalados en tu sistema? Bueno pues esta función relizada con WSH lo hace para ti. STRING @lpDevMode DECLARE INTEGER ChangeDisplaySettings IN Win32API STRING @lpDevMode . ENDIF #undefine h_screenwidth #undefine h_screenheight ENDFUNC FUNCTION cambiar_resolucion LPARAMETERS tnwidth. podra advertir a los usuarios que su monitor no esta configurado adecuade mente y este por si solo podra sin salir del sistema cambiar la resolución.
CreateTextFile("C:prueba.FreeSpace)) + [ bytes.Count)) FOR EACH loDrive IN loDrivesCol ? "Drive : " + loDrive.ShareName ELSE IF lnDriveType=2 ? "Nombre compartido: " + RTRIM(LEFT(SYS(0).txt")
. .FileSystemObject') loDrivesCol = loFSO.] ? "Espacio Libre: " + ALLTRIM(STR(loDrive. lnWait loFSO = CREATEOBJECT('Scripting.VolumeName ENDIF IF INLIST(lnDriveType.] ? "Ruta: " + loDrive. fldr fso = CreateObject("Scripting.Path ? "Nombre del volumen: " + loDrive.15)) ENDIF ENDIF WAIT CLEAR NEXT Endfunc CREAR ARCHIVO DE TEXTO CON FILESYSTEMS Function crearArchivo() Local fso.AvailableSpace)) + [ bytes.IsReady ? IIF( llIsReadyDrive=. [El Drive esta listo. lcDriveType.FileSystemObject") fldr = fso.1. lnDriveType.LOCAL loFSO.DriveLetter lnDriveType = loDrive.Drives ? "El numero de drives en el sistema son: " + ALLTRIM(STR(loDrivesCol.4) AND llIsReadyDrive ? "Número de serie: " + ALLTRIM(STR(loDrive.].2.T. loDrivesCol.]) IF llIsReadyDrive ? "Espacio disponible: " + ALLTRIM(STR(loDrive.TotalSize)) + [ bytes..] ? "Tamaño total: " + ALLTRIM(STR(loDrive. llIsReadyDrive. loDrive.DriveType DO CASE CASE lnDriveType=1 lcDriveType = [removible] CASE lnDriveType=2 lcDriveType = [fijo] CASE lnDriveType=3 lcDriveType = [network] CASE lnDriveType=4 lcDriveType = [CD-ROM] CASE lnDriveType=5 lcDriveType = [RAM-disk] ENDCASE ? "El tipo de drive es: " + lcDriveType llIsReadyDrive = loDrive.SerialNumber)) ENDIF IF lnDriveType=3 ? "Nombre compartido: " + loDrive.[El drive no esta listo.
Caption).Endfunc BORRAR CARPETA CON FILESYSTEM Function Borrarcarpeta() Local fso as object fso = CreateObject("Scripting. 0=Default) *** Hacemos Parpadear la Ventana._Screen. && Cantidad de Veces que Parpadeara (0 =Infinito) Num2dWord(0) && Tiempo entre Parpadeo (en Milisegundos.c1.Para conectar a una unidad de red WNetConnectionDialog(FindWindow(0. RESOURCETYPE_DISK) *-. cuando llega un nuevo mensaje. &&Opciones Num2dWord(5)+.Para conectar a una impresora WNetConnectionDialog(FindWindow(0. String cCaption *** Inicia El Codigo Local cFlashInfo cFlashInfo =Space(20) *** Creamos La Estructura cFlashInfo = Num2dWord(20)+. RESOURCETYPE_PRINT) HACER PARPADEAR UNA VENTANA TIPO MSN Este Ejemplo permite hacer Parpadear un Form de la misma manera que lo hace el M icrosoft Messenger.FileSystemObject") fldr = fso._Screen.1) then
.c3 lcresult = Chr(0)+Chr(0)+Chr(0)+Chr(0) If tnNum < (2^31 .Caption).Null. &&Handle de la Ventana a "Flashear " Num2dWord(FlashW_All+FlashW_TimerNoFg)+. o hasta Enviar Un FlashW_Stop #Define FlashW_TimerNoFg 0xC &&Parpadea hasta que Se Active la Ventana *** Declaracion de Las Apis Declare Long FlashWindowEx In "user32" String @CFlashWInfo Declare Long FindWindow In User32 String cClass. #Define FlashW_Caption 0x1 &&Hace Parpadear El Titulo de Una Ventana #Define FlashW_Tray 0x2 &&Hace Parpadear la Ventana en la TaskBar #Define FlashW_All 3&&Parpadea El Titulo de la ventana y en la Taskbar #Define FlashW_Timer 0x4 &&Parpadea Infinitamente. y no esta activa la ventana e n ese momento. Integer Handle. &&Longitud de la Estructura Num2dWord(FindWindow(.c2. Integer Handle. FlashWindowEx(@cFlashInfo) Procedure Num2dWord Lparameter tnNum Local c0. String cTitle *-.. y que para cuando se Activa.DeleteFolder("C:\borrame") Endfunc ABRIR CUADRO DE DIALOGO CONECTAR A RED O IMPRESORA Esta función permite abrir el cuadro de diálogo conectar a unidad de red o impresora #DEFINE RESOURCETYPE_DISK 1 #DEFINE RESOURCETYPE_PRINT 2 Declare Integer WNetConnectionDialog In Win32Api.'Calculadora'))+. *** Opciones De Parpadeo #Define FlashW_Stop 0 &&Para el Parpadeo de una ventana. Integer ResourceType Declare Integer FindWindow In Win32Api.
"Description=descripcion de la conexion" + CHR(0) + "Exclusive=No" + CHR(0) +.256^2) c1 = Chr(Int(tnNum/256)) c0 = Chr(Mod(tnNum. Long iReadWrite Declare Long _lclose In "kernel32" As lclose Long hFile Declare Long GetFileSize In "kernel32" Long hFile. DECLARE Integer SQLConfigDataSource IN odbccp32. Integer. @lpMax ) lclose(nArchivo) Return nLongitud Endfunc HACER CONEXIÓN ODBC DESDE VFP Aqui esta el código para hacerlo mediante API.c3 = Chr(Int(tnNum/(256^3))) tnNum = Mod(tnNum.dbc" + CHR(0) +. String @
ODBC_ADD_SYS_DSN = 1
lc_driver = "Microsoft Visual FoxPro Driver" + CHR(0) lc_dsn = "dsn=Bases Bodega1" + CHR(0) + . por m edio de api. "Sourcetype=DBC" IF SQLConfigDataSource(0. "SourceDb= uta. "BackgroundFetch=Yes" + CHR(0) + . OF_READ) nLongitud = GetFileSize(nArchivo.256^3) c2 = Chr(Int(tnNum/(256^2))) tnNum = Mod(tnNum. nLongitud As Long Local lpMax As Long lpMax =1 nArchivo= lOpen(cFile. @lc_driver. && OK
. @lc_dsn) = 1 RETURN .dll .sys") ?? " Bytes" Function GetInfoF(cFile) Declare Long _lopen In "kernel32" As lOpen String lpPathName. String @. ODBC_ADD_SYS_DSN. #Define OF_READ 0x0 ?GetInfoF("c:config.T. Short.256)) lcresult = c0+c1+c2+c3 Endif Return lcresult Endproc CONOCER EL TAMAÑO DE UN ARCHIVO Esta funcion permite saber el tamaño de un archivo en especifico (en bytes). Long @lpFileSizeHigh Local nArchivo As Long.
desactivar el Timer.*.lc_driver = Drive de Visual FoxPro lc_dsn = dsn = Nombre de la Conexion BackgroudFetch = Busqueda de datos secundarios Valores Yes o No Description = Descripcion de de la conexion SourceDb = Mapeo o direccion de la tabla o base de datos a conectar SourceType = tipo de conexion valores DBC o DBF si fuera tabla libre
HACER PARPADEAR LA BARRA DE TITULO DE NUESTRA APLICACIÓN Este efecto es muy comun en las aplicaciones hoy en dia tal.ENDIF RETURN .*. Creo que son estas APIs: GetWindow FindWindow OBTENER DIRECCION IP CON WINSOCK Una manera de conseguir la dirección IP local con Winsock. La función que nos permite hacerlo la declaramos asi: Declare FlashWindow IN user32. parpadea el titulo de una ventana en la barra de tare as.F. parpadeara solo si la ventana esta inactiva y quedara de otro color el bo ton en la barra de tareas.HWnd. este o no activada.T.*.F. como MSN. Este código esta en VFP 7. LONG hwnd. En PortalFox esta la función para hacerlo. que cuand o nos escriben un mensaje.) Si queremos que el form lo haga FlashWindow(thisform. Si quieren ejecutarla desde VFP 6 deberan obtener el handle de la ventana a la que le quieran aplicar el efe cto. El segund o parámetro nos permite decirle si queremos que parpadee si esta activada o no.) NOTA: FlashWindow solo hará que la ventana parpadee una sola vez.t.. Al pasarle . si queremos que el parpadeo persista.t. ************************************************************ * * Clase: GET_IPADDRESS * * Devuelve la dirección IP local * * Parametros: * * ninguno * * Ejemplos: * * ipdir=get_ipaddress() * * Retorno * * dirección IP o cadena vacia si no está instalado el WinSock * * Nota
. deberemos colocar el código en un Timer.*.hWnd. && error *.dll .. o que el Timer lo ejecute X veces. Desde VFP podemos hacerlo. Long bInvert Cuando querramos que nuestra aplicacion parpadee ejecutamos lo siguiente: Si que remos que el _screen Parpadee FlashWindow(application. y en el evento Acti vate del Form. si le pasam os . la ventana parpadeara una sola vez.*..
600. 4. LongToStr(tnWidth)) && Ancho lcDevMode = STUFF(lcDevMode.Winsock") IF TYPE('IPSocket')='O' lcret = IPSocket. 41. lnHeight. lnModeNum. 109. lcRetStr lcRetStr = '' FOR lnCnt = 24 TO 0 STEP -8
. 800. tnHeight *!* tnWidth especifica la nueva anchura de la pantalla en pixels *!* tnHeight especifica la nueva altura de la pantalla en pixels FUNCTION ChangeRes LPARAMETERS tnWidth.. LongToStr(tnHeight)) && Alto *!* Cambiar resolucion ChangeDisplaySettings(@lcDevMode.LocalIP ELSE MESSAGEBOX("Winsock no está instalado!") lcret = "" ENDIF RETURN lcret CAMBIAR RESOLUCION DE LA PANTALLA *!* Cambia la resolución de la pantalla *!* Sintaxis: ChangeRes(tnWidth. 4. 1) ENDFUNC *!* Convierte un long integer a un 4-byte character string *!* Sintaxis: LongToStr(lnLongVal) *!* Valor devuelto: lcRetStr *!* Argumentos: lnLongVal *!* lnLongVal especifica el long integer a convertir FUNCTION LongToStr LPARAMETERS lnLongVal LOCAL lnCnt. 156) lnWidth = IIF(EMPTY(tnWidth). lnModeNum. lcDevMode *!* Valores lnModeNum = 0 lcDevMode = REPLICATE(CHR(0). tnHeight) *!* Valor devuelto: llRetVal *!* Argumentos: tnWidth. STRING @lpDevMode DECLARE INTEGER ChangeDisplaySettings IN Win32API STRING @lpDevMode . tnWidth) lnHeight = IIF(EMPTY(tnHeight). INTEGER iModeNum. 113. INTEGER dwFlags *!* Bucle para obtener todos los modos disponibles DO WHILE EnumDisplaySettings(NULL.. @lcDevMode) <> 0 lnModeNum = lnModeNum +1 ENDDO *!* Configurar la structura DevMode lcDevMode = STUFF(lcDevMode.* * Adaptado de John Harvey * * Fecha de Creación : 29/01/2001 Pablo Roca * Ultima Modificacion: 29/01/2001 Pablo Roca * ************************************************************ LOCAL lcret IPSocket = CreateObject("MSWinsock. 4. tnHeight) *!* Instrucciones DECLARE DLL para cambiar resolución DECLARE INTEGER EnumDisplaySettings IN Win32API STRING lpszDeviceName. tnHeight LOCAL lnWidth. LongToStr(1572864)) lcDevMode = STUFF(lcDevMode.
'') *!* Ocultar la barra de tareas IF lnHwnd <> 0 SetWindowPos(lnHwnd. 0. '') *!* Mostrar la barra de tareas IF lnHwnd <> 0 SetWindowPos(lnHwnd. INTEGER x.. 0. 0. INTEGER y. STRING lpWindowName DECLARE INTEGER SetWindowPos IN Win32API INTEGER hwnd.. 0. INTEGER hwndInsertAfter. TOGGLE_UNHIDEWINDOW) ENDIF ENDFUNC EVITAR QUE UNA APLICACION SE CARGUE DOS VECES La misma función que hemos visto en el caso anterior puede ser usada para evitar que un programa externo se cargue mós de una vez. 0. INTEGER y. INTEGER cx.. TOGGLE_HIDEWINDOW) ENDIF ENDFUNC MOSTRAR BARRA DE TAREAS DE WINDOWS *!* Muestra la barra de tareas de windows *!* Sintaxis: ShowTaskBar() *!* Valor devuelto: *!* Argumentos:FUNCTION ShowTaskBar *!* Constantes para ocultar o mostrar la barra de tareas de windows * Sgte linea notificada por Hugo Ranea 20/06/2001 #DEFINE TOGGLE_UNHIDEWINDOW 64 LOCAL lnHwnd *!* Valores lnHwnd = 0 *!* Instrucciones DECLARE DLL para manipular la barra de tareas DECLARE INTEGER FindWindowA IN Win32API STRING lpClassName. INTEGER cy. INTEGER wFlags *!* Valores lnHwnd = FindWindowA('Shell_traywnd'.
. INTEGER hwndInsertAfter.. INTEGER cy. INTEGER cx. 0. INTEGER x. 0. 0. INTEGER wFlags *!* Valores lnHwnd = FindWindowA('Shell_traywnd'. 0. (2^lnCnt)) NEXT RETURN lcRetStr ENDFUNC OCULTA BARRA DE TAREAS DE WINDOWS *!* Oculta la barra de tareas de windows *!* Sintaxis: HideTaskBar() *!* Valor devuelto: *!* Argumentos: FUNCTION HideTaskBar *!* Constantes para ocultar o mostrar la barra de tareas de windows * Sgte linea notificada por Hugo Ranea 20/06/2001 #DEFINE TOGGLE_HIDEWINDOW 128 LOCAL lnHwnd *!* Valores lnHwnd = 0 *!* Instrucciones DECLARE DLL para manipular la barra de tareas DECLARE INTEGER FindWindowA IN Win32API STRING lpClassName.STRING lpWindowName DECLARE INTEGER SetWindowPos IN Win32API INTEGER hwnd..lcRetStr = CHR(INT(lnLongVal/(2^lnCnt))) + lcRetStr lnLongVal = MOD(lnLongVal. 0.
*----------------------------------------FUNCTION _GetConnec(lcDrive) *----------------------------------------* Retorna el nombre de la PC y recurso compartido * de una coneccion de red * PARAMETROS: lcDrive * USO: _GetConnec("K:")
. ENDIF Como saber el nombre del PC y el recurso compartido de una conexión de red. Pondríamos una línea come esta: RUN /N CALC.T. Imaginemos que en nuestra aplicación demos la posibilidad de utilizar la calculadora. cCaption) IF nHWD > 0 * VENTANA YA ACTIVA * LA "LLAMAMOS": ShowWindow(nHWD. STRING cWinName DECLARE SetForegroundWindow IN WIN32API .Un ejemplo sencillo es el de la calculadora de Windows. STRING cNULL. INTEGER nState nHWD = FindWindow(0. ELSE * VENTANA NO ACTIVA RETURN .9) * LA PONEMOS ENCIMA SetForegroundWindow(nHWD) * LA ACTIVAMOS SetActiveWindow(nHWD) RETURN . se cargarás la calcuadora una y otra vez. INTEGER nHandle DECLARE ShowWindow IN WIN32API . . INTEGER nHandle. .EXE ENDIF * Y ESTA ES LA FUNCION QUE LO HACE TODO: *----------------------------FUNCTION F_ActivaWin(cCaption) *----------------------------LOCAL nHWD DECLARE INTEGER FindWindow IN WIN32API . INTEGER nHandle DECLARE SetActiveWindow IN WIN32API .EXE Pero si esta línea la ejecutamos más de una vez.F. * Antes de activar la calculadora: IF NOT F_ActivaWin("Calculadora") * La calculadora no está cargada: RUN /N CALC.
mpr podemos ver en las primeras líneas comentadas. solo debemos marcar la casilla de verificac ión Formulario de nivel superior en el cuadro de dialogo Opciones generales que se muestra al seleccionar la opción Ver -> Opciones generales desde el diseñador de me nú. Un formulario de nivel superior aparece como una ventana independiente sobre el escritorio de Windows y se mues tra en la barra de tareas de Windows. nLength.@cRemoteName. .AT(CHR(0).T.cRemoteName)-1) RETURN lcRet ENDFUNC Ejemplo de como agregar un menú en un formulario SDI (Interfaz de un solo document o . Para ejecutarlo con un menú personalizado. en el método Init del formulario. Crear el formulario de nivel superior Como ya vimos en un artículo anterior. Agregar un menú en un formulario SDI Introducción Continuando con el tema de formularios SDI (Interfaz de un solo documento .T.@nLength) lcRet = LEFT(cRemoteName.Sing le Document Interface). PUBLIC goMiForm goMiForm=CREATEOBJECT("MiForm") goMiForm.Definición de MiForm *--DEFINE CLASS MiForm AS FORM SHOWWINDOW = 2 DOCREATE = .*----------------------------------------DECLARE INTEGER WNetGetConnection IN WIN32API . Editando el archivo MiMenu.T.T.mpr WITH Thisform.mpr WITH THISFORM. como lo muestra la figura siguiente: Cuando generamos el menú con esta opción activada. . y quitar la llamada al procedimiento MiMenuEjemplo. esta vez mostraré como agregar un menú en un formulario de n ivel superior. STRING lpLocalName.
. AUTOCENTER = . Crear el menú La creación de un menú SDI para agregar en un formulario de nivel superior. se deberá llamar al menú desde el métod o Init del formulario de nivel superior con una sentencia como la siguiente DO MiMenu.mpr WITH Thisform.SHOW(1) RETURN *--*--. CAPTION = "Ejemplo de menú en un formulario SDI" NAME = "MiForm" PROCEDURE INIT *DO MiMenu. debemos crear un Formulario de nivel superior. llRet cRemoteName=SPACE(100) nLength=100 llRet = WNetGetConnection(lcDrive. lcRet. para crear un formulario SDI en Visual FoxP ro. .Single Document Interface). .T. una ayuda con las distintas formas de llamar al menú generado. es igual que la creación de cualquier otro menú.. Código de ejemplo El siguiente código es un ejemplo para mostrar un formulario de nivel superior con un menú incorporado. configurando la propiedad Sho wWindow = 2 (Como formulario de nivel superior). se debe habilitar l a línea DO MiMenu. STRING @lpRemoteName. INTEGER @lpnLength LOCAL cRemoteName.
cMenuName) ACTIVATE POPUP (a_menupops[3]) DEFINE POPUP (a_menupops[1]) MARGIN RELATIVE SHADOW COLOR SCHEME 4 DEFINE BAR 1 OF (a_menupops[1]) PROMPT "\ DEFINE BAR 2 OF (a_menupops[1]) PROMPT "\ DEFINE BAR 3 OF (a_menupops[1]) PROMPT "\-" DEFINE BAR 4 OF (a_menupops[1]) PROMPT "\ DEFINE BAR 5 OF (a_menupops[1]) PROMPT "\ DEFINE BAR 6 OF (a_menupops[1]) PROMPT "\ DEFINE BAR 7 OF (a_menupops[1]) PR OMPT "\-" DEFINE BAR 8 OF (a_menupops[1]) PROMPT "\ ON SELECTION BAR 8 OF (a_menupops[1]) DO _Salir DEFINE POPUP (a_menupops[2]) MARGIN RELATIVE SHADOW COLOR SCHEME 4 DEFINE BAR 1 OF (a_menupops[2]) PROMPT "\ DEFINE BAR 2 OF (a_menupops[2]) PROMPT "\-"
.oFormRef.BASECLASS) # 'form' OR .DO MiMenuEjemplo WITH THISFORM. .MiMenuEjemplo. cTypeParm2.cTypeParm2 = "C" AND !EMPTY(m. LOWER(m.nTotPops]= SYS(2015) ENDFOR ELSE a_menupops[1]="archivo" a_menupops[2]="edición" a_menupops[3]="ayuda" ENDIF *--*--.NAME) BAR DEFINE PAD _1mv0kg6re OF (m.cMenuName) IN (m.SHOWWINDOW # 2 MESSAGEBOX([Este menú solo puede ser llamado en un formulario de nivel superior]) RETURN ENDIF m.Definición del menú *--DEFINE MENU (m.oFormRef") # "O" OR .cMenuName ENDIF IF m.oFormRef. getMenuName.lUniquePopups")="L" AND m. nTotPops.cMenuName) ACTIVATE POPUP (a_menupops[2]) ON PAD _1mv0kg6rg OF (m.spr *--PROCEDURE MiMenuEjemplo LPARAMETERS oFormRef.cTypeParm2 = "L" AND m. a_menupops.oFormRef.cTypeParm2 = "C" OR (m.lUniquePopups FOR nTotPops = 1 TO ALEN(a_menupops) a_menupops[m. ENDPROC PROCEDURE DESTROY RELEASE MENU (THIS.cMenuName) PROMPT "A\ ON PAD _1mv0 kg6re OF (m.cMenuName = m.cMenuName = SYS(2015) m. cSaveFormName IF TYPE("m.getMenuName") m.NAME IF m. m.cMenuName) PROMPT "\ DEFINE PAD _1mv0kg6rf OF (m.T.NAME) EXTENDED ENDPROC ENDDEFINE *--*--.getMenuName) m.oFormRef.cSaveFormName = m. lUniquePopups LOCAL cMenuName.oFormRef.NAME = m.getMenuName ENDIF DIMENSION a_menupops[3] IF TYPE("m.getMenuName) m.cMenuName) ACTIVATE POPUP (a_menupops[1]) ON PAD _1mv0kg6rf OF (m.cMe nuName) PROMPT "\ DEFINE PAD _1mv0kg6rg OF (m.cTypeParm2 = TYPE("m.
TOP = 12.cMenuName) NOWAIT IF m. veremos el formulario SDI con el menú como lo muestr a la siguiente figura: Comentarios Recordar que Visual FoxPro trae en la aplicación "Solution" un ejemplo similar don de se muestra un formulario SDI. Visual FoxPro. para buscar una palabra y remarcarla si la encuentra. una barra de herram ientas.cSaveFormName ENDIF ENDPROC PROCEDURE _Salir _SCREEN.oFormRef. . . NAME = "Text1" ADD OBJECT Command1 AS COMMANDBUTTON WITH .getMenuName = m. HEIGHT = 24.cMenuName m. ENDTEXT STRTOFILE(lc. y se crean ventanas secundarias. Escriba en el cuadro de texto una palabra que se encuentre aquí y haga click en el botón Buscar.scx") Buscar texto en un Cuadro de Edicion Para ver el ejemplo ejecute el siguiente código: *-. HEIGHT = 24.Creo un archivo de texto SET SAFETY OFF LOCAL lc TEXT TO lc NOSHOW Este es un texto tomado de un archivo de texto."MiTxt. LEFT = 24.ACTIVEFORM.txt") *-.cTypeParm2 = "C" m. . . Nada corre como un zorro.NAME = m. Para ver la aplicación "Solution" ejecute : DO (HOME(2) + "Solution\Solution") O directamente corra el ejemplo del formulario SDI ejecutando: DO FORM (HOME(2) + "\Solution\Forms\SDIForm.Creo el formulario PUBLIC goForm goForm = CREATEOBJECT("Form1") goForm.DEFINE BAR 3 OF (a_menupops[2]) PROMPT "Cor\ DEFINE BAR 4 OF (a_menupops[2]) PRO MPT "\ DEFINE BAR 5 OF (a_menupops[2]) PROMPT "\ DEFINE POPUP (a_menupops[3]) MARGIN RELATIVE SHADOW COLOR SCHEME 4 DEFINE BAR 1 OF (a_menupops[3]) PROMPT "\ DEFINE BAR 2 OF (a_menupops[3]) PROMPT "\-" DEFINE BAR 3 OF (a_menupops[3]) PROMPT "Acerca \ ACTIVATE MENU (m.RELEASE ENDPROC Al ejecutar el código anterior. en el cual se agrega un menú.
.SHOW DEFINE CLASS Form1 AS FORM CAPTION = "Ejemplo de búsqueda en un EditBox" NAME = "Form1" ADD OBJECT Text1 AS TEXTBOX WITH .
.64.SETFOCUS ELSE MESSAGEBOX("No se encuentra". WITH AutoSize=. WIDTH = 300. . Caption="Introduzca su texto. Width=300.KeyPress LPARAMETERS nKeyCode..T. TOP = 48. .SELSTART = lnPos . ..SELLENGTH = lnLen THISFORM.Edit1. no se permite tecla ENTER" ADD OBJECT myEditBox AS EditBox .VALUE) lnRecno = RECNO()
.Edit1. NAME = "Edit1" PROCEDURE INIT THISFORM.VALUE) IF lnPos > 0 THISFORM.THISFORM. CAPTION = "Buscar".1 THISFORM. . LEFT = 24. nShiftAltCtrl **** Si se introduce la tecla ENTER *** IF nKeyCode=13 NODEFAULT &&No hacer nada (Inhibir) ENDIF ENDPROC ENDDEFINE BUSQUEDA INCREMENTAL EN UN FORMULARIO Una forma de hacer una busqueda incremental en un formulario. Height=200 PROCEDURE MyEditBox.VALUE) lnLen = LEN(lcBusca) lnPos = AT(lcBusca. En el Entorno de datos insertaremos la tabla (MiTabla) En el método InteractiveChange del TextBox debemos escribir el siguiente código: *--.Edit1.VALUE = FILETOSTR("MiTxt.Text1.txt") ENDPROC PROCEDURE Command1.Edit1. NAME = "Command1" ADD OBJECT Edit1 AS EDITBOX WITH .CLICK LOCAL lcBusca. ingresando un text o en un TextBox y visualizando el resultado en un Grid En este ejemplo de BUSQUEDA INCREMENTAL en un Formulario.Edit1. HEIGHT = 180. lnLen lcBusca = ALLTRIM(THISFORM."Aviso") ENDIF ENDPROC ENDDEFINE EVITAR RETORNO DE CARRO EN UN EDITBOX public oForm oForm = CREATEOBJECT("MyForm") oForm.InteractiveChange --LOCAL lc.Show() DEFINE CLASS MyForm AS Form Caption = "No-Retorno de Carro" ADD OBJECT MyLabel AS Label . . debemos poner un TextB ox (Text1) y una Grilla (Grid1). . lnRecno SELECT MiTabla lc = ALLT(THIS. LEFT = 144. lnPos. WITH Top = 20.TOP = 12.
Enviar y leer correo con Outlook desde Visual FoxPro El modelo de objetos de Outlook es muy rico y poderoso. Simplemente hay que poner en el keypress lo siguiente: LPARAMETERS nKeyCode. De Ken Weber. Un breve ejemplo Una de las tareas más fácil de automatizar en Outlook es el envío de un correo. que todo lo podemos automatizar med iante programación desde Visual FoxPro.IF MiTabla. o manejar el color del registro seleccionado LIMITAR UN CAMPO MEMO Como limitar la entrada de un campo memo a X lineas. que todo lo podemos automatizar med iante programación desde Visual FoxPro.SETFOCUS && el nombre del TextBox THISFORM.Nombre=lc WHILE MiTabla.Nombre <= lc NOOPTIMIZE ENDIF IF lnRecno # RECNO() THISFORM.Nombre < lc && debe quedar donde estaba IF lnRecno <= RECC() GO RECNO() ELSE GO BOTT ENDIF RETURN ENDIF IF NOT EMPTY(ORDER()) && busqueda con indice SEEK lc ELSE GO TOP LOCATE REST FOR MiTabla.Text1.this.END InteractiveChange --NOTA: SE DEBE TENER LAS SIGUIENTES CONSIDERACIONES: La tabla debe estar ordenada ASCENDENTEMENTE o existir un indice por Nombre y es tar seleccionado (el método busca si hay un SET ORDER establecido) Fijarse bien el nombre del TextBox y del Grid para invocar el método SetFocus (en el ejemplo Grid1 y Text1) Fijarse el alias de la tabla del grid (en el ejemplo MiTabla) Conviene que los nombres estén en mayúsculas y añadir en la propiedad Format del TextB ox = ! para que sean ingresados en mayúsculas Conviene que la propiedad del Grid RecordMark = .Nombre >= lc IF NOT BOF() SKIP -1 ENDIF IF MiTabla. o sea.Nombre=lc WHILE MiTabla. Esta interfaz está disponi ble como un servidor de automatización.Grid1.
. o sea. para que se vea el registro marcado. nShiftAltCtrl IF nkeycode = 13 IF OCCURS(chr(13).value) >=5 NODEFAULT ENDIF ENDIF En este ejemplo se limita a 6 lineas.T. Veremo s un ejemplo de solamente unas pocas líneas.Nombre <= lc NOOPTIMIZE ENDIF ELSE LOCATE REST FOR MiTabla. El modelo de objetos de Outlook es muy rico y poderoso. Esta interfaz está disponi ble como un servidor de automatización.SETFOCUS && el nombre del Grid ENDIF RETURN *--.
Outlook Redemption: Es un objeto COM que se adapta fácilmente a la automatización y utiliza la MAPI extendida. Existe para descarga un a versión libre con fines de desarrollo. que luego de 5 segundos habilita el botón "Si". entre otras cosas. con los peligros que esto significa.com/redemption.Body = lcCuerpo loMailItem. lcContrasenia AS CHARACTER . ó 10 minutos que debemos seleccionar. debemos crear un objeto "NameSpace" apropiado qu e actuará como entrada (en este ejemplo MAPI). loMailItem AS OBJECT #DEFINE LF_CR CHR(10)+CHR(13) *-. los métodos Logon y Logoff.NULL.Lo primero que debemos hacer para automatizar Outlook. 5. incluyen los parches de seguridad de Microsoft. lcTema AS CHARACTER ." + LF_CR lcCuerpo = lcCuerpo + "Saludos. lcDestinatario AS CHARACTER.com" lcTema = "Prueba: " + TTOC(DATETIME()) lcCuerpo = "Prueba enviando un mail desde Visual FoxPro.GetNameSpace("MAPI") *-.Application") loNameSpace = loOutlook. loNameSpace AS OBJECT.Recipients.Creo objetos Outlook y NameSpace loOutlook = CREATEOBJECT("Outlook. .Ejecuto los métodos loNameSpace. loOutlook = . Cuando intentamos acceder a la libreta de direcciones aparece el cuadro de dialo go el cual nos permitirá un acceso inmediato. puede disminuir las alertas o registrar algunas aplicaciones como seguras.
. el administrador de Exchange. el acceso a la libreta de direccione s y el envío de correo mediante automatización. ¿Cómo solucionamos este problema? Estas son algunas de las opciones que disponemos nosotros para trabajar con esto s parches de seguridad: Mantener la versión de Office 2000 SR-1 y no actualizarla ni instalarle parches de seguridad. se nos presenta el sigui ente cuadro de dialogo.Application"." + LF_CR *-. Esta DLL fue escrita por Dmitry Streblechenko (MS Out look MVP) y esta disponible en http://www.ADD(lcDestinatario) loMailItem. Problemas de seguridad Outlook XP y Outlook 2000 SP2. lcCuerpo AS CHARACTER LOCAL loOutlook AS "Outlook. Una vez creado el objeto.NULL. con el fin de evitar códigos malicioso s que toman los datos de nuestra libreta de direcciones y envían correo sin nuestr o consentimiento.CreateItem(0) loMailItem. Este es un pro ducto comercial con un valor de U$S 200 aproximadamente.Logoff loNameSpace = . o de 1. es crear un objeto Outloo k.Send loNameSpace. E stos parches restringen.Subject = lcTema loMailItem. Cuando intentamos enviar un correo desde Visual FoxPro.Logon(lcPerfil . .Datos del Mail lcPerfil = "Prueba" lcContrasenia = "prueba" lcDestinatario = "prueba@portalfox.dimastr. Si se tienen Outlook y Exchange instalados. lcContrasenia) loMailItem = loOutlook. El objeto NameSpace proporciona ent re otros. 2. pero esto n o lo logramos en forma directa. LOCAL lcPerfil AS CHARACTER. debemos acceder al origen de los datos. .
'.PARENT.prg') Creamos el servidor de automatización con: THISFORM.txtTo.PARENT.CargarVector(THIS. La siguiente figura es la página para el envío de un correo.VALUE) .PARENT. En este método también creamos un objeto NameSpace que nos perm itirá acceder a las carpetas especiales de Outlook.CargarVector(THIS. 'Inicio de sesión') RETURN . 64. Este "presionará" el botón "Si" antes de que el dialogo aparezca. 'Aviso') ENDIF THIS.PARENT. 64.express-soft.VALUE) IF . 48.EnviarCorreo() MESSAGEBOX('Mensaje enviado con éxito.VALUE.Express ClickYes: Es un pequeño programa residente que se maneja mediante la API d e Windows. 'aCC') .LeerMensajes(THIS. 48.REFRESH En la llamada al método LeerMensajes() creamos un objeto loInbox y traemos todos l
.cCuerpo = ALLTRIM(THIS.IniciarSesion()) MESSAGEBOX('Falló el inicio sesión'. 'Problemas') ENDIF ENDWITH RETURN En el llamado del método EnviarCorreo() de la clase cOutlook es donde se crea un n uevo mensaje y se arma según las propiedades anteriormente configuradas. El formulario de ejemplo En este ejemplo utilizaremos un formulario con un objeto PageFrame con dos Páginas .oCorreo .F. Este pr ograma es gratis y esta disponible en http://www.PARENT. configuramos todas las propiedades nece sarias para el envío de correo.CrearServidor() El método CrearServidor() establece una referencia a la instancia de Outlook en la propiedad oOutlook. *-. una para enviar correo y la otra para leer los correos desde la Bandeja de Ent rada.VALUE = 1.opgTipo.'.VALUE.txtCC.html. Esta otra figura nos muestra la página para la lectura de la bandeja de entrada. ENDIF Enviar un correo Antes de invocar el método EnviarCorreo(). En el mismo sitio existe un ejemplo para Visual FoxPro.edtCuerpo.'cOutlook.SETFOCUS ELSE MESSAGEBOX('No existen mensajes para traer'.edtCuerpo. llamamos a otro formulario para el inicio de sesión de Outlook: *-.oCorreo.PARENT. También en el Init() del formulario. En el método Init() creamos una instancia de la clase cOutlook con la sentencia: THISFORM.txtAdjunto.oCorreo.txtTema.PARENT.cTema = ALLTRIM(THIS.oCorreo TO llAceptar IF NOT (llAceptar AND THISFORM.oCorreo.Formulario de inicio de sesión DO FORM Inicio WITH THISFORM. 'Aviso') THISFORM. 'aTO') . Esto lo hacemos en el método Click() del botón "Enviar ".oCorreo = NEWOBJECT('cOutlook'. Leer los correos Para leer los correos de la bandeja de entrada invocamos el método LeerMensajes() de la clase cOutlook desde el método Click() del botón "Leer".Armo el mensaje WITH THISFORM.VALUE.grdMensajes.PARENT. 'curMsg') GO TOP IN curMsg THIS. 'aAdjuntos') .com/mailmate/click yes. ZAP IN curMsg IF THISFORM.LimpiarPagina() ELSE MESSAGEBOX('No se pudo enviar el mensaje.CargarVector(THIS.
Manejo el error con TRY .oOutlook) = 'O' .NULL.oOutlook = CREATEOBJECT('Outlook.T.oOutlook.oNameSpace) = 'O' llRet = ..oOutlook.. FINALLY TRY *-. ENDIF ENDIF ENDWITH RETURN llRet ENDPROC *-------------------------------------------------* Cierro el servidor de automatización *-------------------------------------------------PROCEDURE CerrarServidor() THIS.Propiedades oOutlook = . llRet AS Logical WITH THIS *-.'.QUIT() RETURN ENDPROC *-------------------------------------------------* Iniciar sesion *-------------------------------------------------PROCEDURE IniciarSesion()
.Instancio el objeto . Definición de la clase cOutlook En este ejemplo disponemos de una clase definida por el usuario.. CATH .. llamada cOutloo k con los distintos métodos para realizar el envío y la lectura de los correos..GetNameSpace('MAPI') IF VARTYPE(.oOutlook = GETOBJECT( . 'Problemas!!!') FINALLY ENDTRY FINALLY ENDTRY IF VARTYPE(.' TIMEOUT 2 CATCH TO loErr1 TRY *-.os mensajes.oNameSpace = . 'Outlook.Application') WAIT WINDOW 'Nueva instancia de Outlook. loErr2 AS EXCEPTION. cPerfil = '' cContrasenia = '' cTema = '' cCuerpo = '' DIMENSION aTo(1) AS CHARACTER DIMENSION aCC(1) AS CHARACTER DIMENSION aBCC(1) AS CHARACTER DIMENSION aAdjuntos(1) AS CHARACTER *-------------------------------------------------* Creo el servidor de automatización *-------------------------------------------------PROCEDURE CrearServidor() LOCAL loErr1 AS EXCEPTION.NULL. oNameSpace = . o solo los mensajes "No leídos" y recorremos uno a uno para cargarlos en un cursor que luego mostraremos en una Cuadrícula y un Cuadro de Edición... La d efinición de esta clase es la siguiente: DEFINE CLASS cOutlook AS CUSTOM *-.' TIMEOUT 2 CATCH TO loErr2 MESSAGEBOX('Microsoft Outlook no está instalado.Application') WAIT WINDOW 'Ya existe una instancia de Outlook. 16..Creo el objeto .
cTema loMensaje.CreateItem(0) IF VARTYPE(loMensaje) = 'O' loMensaje.cContrasenia) llRet = .F.cCuerpo *-. llRet AS Logical LOCAL lnI AS INTEGER. FINALLY ENDTRY RETURN llRet ENDPROC *-------------------------------------------------* Cerrar sesion *-------------------------------------------------PROCEDURE CerrarSesion() THIS.aBCC(lnI)) lnIndex = lnIndex + 1 loMensaje.aBCC(lnI)) loMensaje.ADD(.LOCAL llRet AS Logical TRY THIS.oOutlook.BCC lnLen = ALEN(.aTO(lnI)) lnIndex = lnIndex + 1 loMensaje. THIS.Adjuntos
.aCC) FOR lnI = 1 TO lnLen IF NOT EMPTY(.TYPE = 2 ENDIF ENDFOR *-.ADD(.Creo un nuevo mensaje WITH THIS loMensaje = .No pudo iniciar sesión llRet = . CATCH *-.T.CC lnLen = ALEN(.oNameSpace.Recipients(lnIndex).aCC(lnI)) loMensaje.Recipientes lnIndex = 0 *-.Body = .ADD(.Recipients.TYPE = 3 ENDIF ENDFOR *-.TYPE = 1 ENDIF ENDFOR *-.Logoff() RETURN ENDPROC *-------------------------------------------------* Envio el correo *-------------------------------------------------PROCEDURE EnviarCorreo() LOCAL loMensaje AS OBJECT.TO lnLen = ALEN(.Subject = .Logon(THIS.Recipients.Recipients.aTO) FOR lnI = 1 TO lnLen IF NOT EMPTY(.Recipients(lnIndex).aCC(lnI)) lnIndex = lnIndex + 1 loMensaje. lnIndex AS INTEGER *-.cPerfil.aBCC) FOR lnI = 1 TO lnLen IF NOT EMPTY(.aTO(lnI)) loMensaje.Recipients(lnIndex).oNameSpace.
ENDIF ENDWITH ELSE llRet = .Body.RESTRICT("[Unread] = True") ELSE loMensajes = loInbox.Items.ITEM(lnI) WITH loMsg INSERT INTO (tcAlias) (EnviadoPor.NULL. Recibido.Items' LOCAL loMsg AS OBJECT.UnRead) ENDWITH ENDFOR llRet = .F.aAdjuntos(lnI)) loMensaje. ELSE llRet = .COUNT > 0 *-. tcAlias) LOCAL loInbox AS 'Outlook.Inbox loInbox = THIS. Tema. .oNameSpace.aAdjuntos) FOR lnI = 1 TO lnLen IF NOT EMPTY(. NoLeido) .ReceivedTime.aAdjuntos(lnI)) AND FILE(.ADD(.SEND ELSE llRet = .Subject.Items ENDIF IF VARTYPE(loMensajes) = 'O' WITH loMensajes IF . Cuerpo.F. loMensajes AS 'Outlook.oNameSpace = .COUNT loMsg = .MAPIFolder'. lnI AS INTEGER.GetDefaultFolder(6) *-. VALUES (.SenderName. ENDIF ENDWITH RETURN llRet ENDPROC *-------------------------------------------------* Lee los mensajes según parámetro *-------------------------------------------------PROCEDURE LeerMensajes(tlNoLeidos. .Mensajes del Inbox IF tlNoLeidos loMensajes = loInbox. . ENDWITH
.NULL.aAdjuntos(lnI)) ENDIF ENDFOR llRet = loMensaje.Attachments.T. ENDIF RETURN llRet ENDPROC *-------------------------------------------------* Destroy *-------------------------------------------------PROCEDURE DESTROY() WITH THIS .lnLen = ALEN(. .F.oOutlook = . . llRet AS Logical IF EMPTY(tcAlias) tcAlias = 'curMsg' ENDIF *-.Recorro los mensajes FOR lnI = 1 TO .
HEIGHT = THIS.ENDPROC *-------------------------------------------------* Cargo una Matriz con los destinatarios *-------------------------------------------------PROCEDURE CargarVector(tcTexto. . en esta ocasión.WIDTH = THIS.olecontrol1. '.T. Una forma fácil de crear un formulario por código como un explorador de internet.') lcV = "This. LEFT = 10. . OLECLASS = "Shell. WIDTH = 780.portalfox. y el ejemplo los podemo s descargar del siguiente vínculo: outlook.NAVIGATE("http://www. HEIGHT = 580. TOP = 10. CAPTION = "PortalFox :: Nada corre como un zorro" WINDOWSTATE = 0 NAME = "Form1" WIDTH = 800 HEIGHT = 600 ADD OBJECT olecontrol1 AS OLECONTROL WITH .20 THIS.REFRESH NODEFAULT ENDPROC PROCEDURE olecontrol1..olecontrol1. Los ejemplos están realizados con Visual FoxPro 8 y Outlook 2002 (Outlook XP).zip para su evaluación.20 ENDPROC PROCEDURE olecontrol1. .'. la(1) AS CHARACTER IF EMPTY(tcTexto) RETURN 0 ENDIF tcTexto = CHRTRAN(tcTexto. .(ln) FOR lnI = 1 TO ln &lcV.com") ENDPROC ENDDEFINE MOSTRAR UNA PAGINA WEB DESDE TU PROGRAMA DE VFP Una mas sobre las Fox Foundation Classes. PUBLIC oForm oForm = NEWOBJECT("MiExplorador") oForm.') ln = ALINES(la. . como así también los formularios.'.(lnI) = la(lnI) ENDFOR RETURN ln ENDPROC ENDDEFINE && Clase cOutlook A la definición de la clase.SHOW DEFINE CLASS MiExplorador AS FORM TOP = 0 LEFT = 0 DOCREATE = .HEIGHT . lnI AS INTEGER.WIDTH .T. Pueden revisar las Fox Foundation Classes (FFCs) para saber cómo funciona: Utiliti es -> Component Gallery -> Internet -> Web Broser Control Un ejemplo sencillo so bre esto:
. tcTexto.2" PROCEDURE RESIZE THIS.'. cómo mostrar una pagina W eb en un formulario de Visual FoxPro.INIT THIS." + tcVector DIMENSION &lcV. tcVector) LOCAL ln AS INTEGER. NAME = "Olecontrol1". .Explorer.
Título de la Venta tnWindowState && Estado de la ventana. me sale la numeración correctamente.0..cmdClose.vcx.Show(1) NUMERACION DE PAGINAS EN INFORMES CON CAMPOS MEMO En la función de Rafael Angel Ponce Yllanes se tiene el detalle de los campos Memo .com") loBrowser.tcCaption.. El único detalle es el parpadeo cuando se lanza el report por primera vez.HOME()+"gallery\_webview") loBrowser.1."Editando Archivo". lo único que modifique es el NOCONSOLE por el NOWAIT.Navigate2("http://www.SHow(1) DEFINE CLASS myTextEditor as _showtext OF (HOME(1)+"ffc\_reports. * Notas: * Creación : 08/09/1999 PRR * Ultima Modificación: 14/04/2000 RAPY Rafael Angel Ponce Yllanes * Ultima Modificación: 28/07/2004 LINCEITZ Pablo Alvarez G. ************************************************************ FUNCTION report_contarpaginas(lc_report) LOCAL nPaginas nPaginas = 0 DEFINE WINDOW x FROM 1. Normal = 0.GETFILE().olewebBROWSER.2) oForm.loBrowser=NEWOBJECT("_webform". te damos la manera mas sencilla y con apariencia bastante profesional.0) ..Caption="Cerrar" . ************************************************************ * Función: report_contarpaginas * Devuelve el número de paginas de un report * Parametros: * Nombre del report * Ejemplos: * lntotpaginas = report_contapaginas("minforme") * Retorno: * El numero de paginas del informe.vcx") PROCEDURE INIT LPARAMETERS tcSourceFile. Maximizado = 2 DODEFAULT(tcSourceFile) WITH This . Minimizado = 1 .tnWi ndowState..2). en esta ocasión haremos una SubClase basada en _ShowText de la librería de clases _Reports.WindowState=IIF(VARTYPE(tnWindowState)='N' AND INLIST(tnWindowState..Caption = IIF(VARTYPE(tcCaption)='C' AND !EMPTY(tcCaption).1 TO 2.. && Path del archivo a Mostrar tcCaption. .con este cambio aun cuando haya campos memos y estos excedan su longitud (la pagina actual).cmdSave. para de ésta manera hacerlo mas beneficioso a nuestro propósito.portalfox.Caption="Guardar como"
."Visor de Texto") . oForm=CREATEOBJECT("MyTextEditor". Una vez más utilizaremos una clase de las que vienen en las Fox Foundation Classes (FFCs) de Visual FoxPro. ...2 ACTIVATE WINDOW x NOSHOW REPORT FORM (lc_report) NOWAIT nPaginas = _PAGENO RELEASE WINDOW x RETURN npaginas ENDFUNC ************************************************************ IMPLEMENTAR UN VISOR DE TEXTO Si deseas mostrar un buen visor de textos que puedes implementar en tus aplicaci ones. pero prefiero esto a una numeración in correcta.
. lcFile = SYS(2015)+".Resize() DODEFAULT() ENDPROC ENDDEFINE Como idea adicional.. menor-que < < > > de la sección TEXTMERGE.. KEYBOARD '{CTRL+F10}' PLAIN CLEAR REPORT FORM tureporte NOCO TO PRINTER PROMPT PREV INFORME CON VISTA PREVIA MAXIMIZADA Solo hay que hacer . podrías utilizar tu propio método para generar un reporte o man dar tu reporte a ASCII (REPORT FORM < TuReporte > TO FILE ASCII ) .80.chkReadOnly." ") > > \Clave < < PADC("Compañia".Caption="Fuentes" .0 en adelante. lo único que solo funciona de la versión 6.h que se localiza en el mismo direct orio de la librería de clases.. PREVIEW EN FORMA MAXIMIZADA Y CON DIALOGO DE IMPRESIÓN Preview en forma maximizada y con diálogo de impresión. Nota2: Revise el archivo _reports.dbc" SET TEXTMERGE ON SET TEXTMERGE TO (lcFile) NOSHOW lcTitle="Reporte de Clientes" IF !USED("Customer") USE Customer IN 0 ENDIF SELECT Customer \< < PADC(lcTitle.txt" OPEN DATABASE HOME(2)+"data\testdata.Caption="Sólo lectura" ENDWITH ENDPROC PROCEDURE Activate This.. con él se pueden configurar mas opciones de la clase.cmdFonts. Esta línea de código me pareció muy buena. mucho más fácil y en una sola líne a.Show(1) DELETE FILE (lcFile) CLOSE TABLES all CLOSE DATABASES all Nota: Por cuestiones de codificacion HTML tuve que poner espacios entre los mayo r-que. quitelos para que funcione corre ctamente.lcFile...lcTitle..2) oForm.. Esto antes de lanzar el REPORT PREVIEW KEYBOARD "{CTRL+F10}" Conocer el número de paginas totales de un informe ************************************************************ * * Clase: report_contarpaginas * * Devuelve el número de paginas de un report * * Parametros:
..40." ") > > Contacto SCAN \< < Cust_id > > < < Company > > < < Contact > > ENDSCAN SET TEXTMERGE TO SET TEXTMERGE OFF oForm=CREATEOBJECT("MyTextEditor". pasarlo a ar chivo y mostrarlo.
Winsock.1') ? loSock. si se utiliza la propiedad STRETCH WI TH OVERFLOW suelen ocurrir resultados inesperados Obtener la dirección IP local de la maquina. al poner multiples ex tensiones solo separarlas con espacio *** inicio *** USE Respaldo wAlmacena=RESPALDO. y solo dar un click para iniciar el proceso de respaldo. con el campo "Almacena" y guardar "e: \backup" *** crea una tabla que tenga los nombre y rutas de las carpetas a respa ldar y un campo que *** guarde las extensiones.6)
.doc *.1 TO 2.NULL.2 ACTIVATE WINDOW x NOSHOW REPORT FORM (lc_report) NOCONSOLE nPaginas = _PAGENO RELEASE WINDOW x RETURN npaginas NOTA: gracias a Jose Luis Santana Blasco y a Rafael Angel Ponce Yllanes por la aclaración del NOCONSOLE.xls *.*". puedes agregar multiples registr os de carpetas a respaldar *** Ejemplo : directorio. en donde se almacenara n tus respaldos *** ejemplo: resplado. *** crea un tabla que contenga la ruta de almacenamiento.8)+'_'+RIGHT(DTOS(DATE()).dbf con el campos: ruta y ex tension ambos de tipo caracter *** Ejemplo : ruta = "c:\mis documentos\" *** Eje mplo : extension = "*. loSock = CREATEOBJECT('MSWinsock.dbf *.LocalIP loSock = . Nota: Se ha reportado que con Campos MEMO.ALMACENA USE DIRECTORIO *** GENERA LOS NOMBRES DE LOS RESPALDOS AUTOMATICAMENTE *** Y LE AGREGA FECHA PARA NO SOBRE ESCRIBIRLOS REPLACE ALL NOMBRE WITH +RIGHT(SYS(2015). con esto se mejora mucho la velocidad.dbf. * * Nota * * * Creación : 08/09/1999 PRR * Ultima Modificación: 14/04/2000 RAPY Rafael Angel Ponce Yllanes * ************************************************************ PARAMETERS lc_report LOCAL nPaginas nPaginas = 0 DEFINE WINDOW x FROM 1. COMPRIMIR ARCHIVOS CON WINRAR Has deseado tener un programa en donde este archivado todas las rutas de carpeta s a comprimir y con especificaciones de tipos de archivos y una ruta de almacena miento.ppt" o bien "*.* * Nombre del report * * Ejemplos: * * lntotpaginas = report_contapaginas("minforme") * * Retorno * * El numero de paginas del informe.
function redondeoacincocentimos lparameters m. ya que es muy lento y además necesitas abrir la tabla en forma exclusiva.02 se convierte en $145. $145.nvalor * 20) / 20 endfunc INSERTAR REGISTRO EN UNA POSICION Cuantas veces no hemos querido ingresar un registro en blanco en alguna posicion especifica de una tabla ? Esta es una manera muy simple de hacerlo: GO 3 INSERT BLANK BEFORE Te aconsejo no intentar este tipo de manejos sobre tablas medianas o grandes.RAR'+' '+ZRUTA ! /N7 RAR a -r -s &ZSAV ENDSCAN *** REDONDEAR A 5 CENTAVOS POR ARRIBA Esta función es muy útil para establecimientos donde las monedas de centavos ya no s e usan tan frecuentemente y/o por comodidad se cobra 5 centavos arriba.
.07 se convierte en $145. es decir : $145.10.05.GO TOP *** INICIO DE LA GENERACION DE ARCHIVOS RAR SCAN ALL ZRUTA=ALLTRIM(RUTA)+'\'+ALLTRIM(EXTENSION) ZSAV=ALLTRIM(wAlmacena)+'\'+ALLTRIM(NOMBRE)+'.nValor return ceiling(m.
Trucos Visual Foxpro by ethilo16K viewsEmbedDownloadRead on Scribd mobile: iPhone, iPad and Android.Copyright: Attribution Non-Commercial (BY-NC)List price: $0.00Download as TXT, PDF, TXT or read online from ScribdFlag for inappropriate contentMore informationShow less
RelatedFUNCIONES DE VFP.pdfby irlandajocelySeparata de Visual FoxProby Berthing AndradeTrucos VFP.pdfby Carlos Javier Gutierrez OduberEnviar y leer correo con Outlook desde Visual FoxProby Victor E. Torres TejadaSimilar to 55396477 Trucos Visual FoxproFUNCIONES DE VFP.pdfSeparata de Visual FoxProTrucos VFP.pdfEnviar y leer correo con Outlook desde Visual FoxPro55396477 Trucos Visual Foxpro

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución