Foxpro

19. You don't need to use SYSMENU to enable cut-and-paste. Just: define popup dummy define bar _MED_CUT of dummy prompt "dummy1" define bar _MED_PASTE of dummy prompt "dummy2" SET SYSMENU TO _medit PUSH MENU _msysmenu FOR i = 1 TO cntpad("_msysmenu") RELEASE PAD (getpad("_msysmenu", 1)) of _msysmenu ENDFOR 20. to stop a control from being instantiated in a form, return .f. in the control's init() method. 21. beware of the commandbuttongroup.default properties. It could turn a simple ENTER into a CTRL+W when you exit a control in the form. 22. there is a new property textbox.passwordchar for inputing passwords. Set it to "*" will do. 23. if the printer definition for a report form was changed, clear field XXX.TAG and XXX.TAG2 by opening the FRX as a DBF. 138396 HOWTO: Use the Default Windows Printer in Visual FoxPro http://support.microsoft.com/?id=138396 24. SET PRINTER ON in visual foxpro could trigger a print job take them out of possible. 25. if you are to translate CLOSE DATABASE into something more precise, you must be aware of the side-effect that the command will SELECT A after closing all tables. Some programs may make use of this side effect. 27. to highlight the current row in a grid with color, and keeping it highlighted even after the grid loses focus add custom property: thisform.currec, thisform.gridback, thisform.leavegrid grid.init(): DODEFAULT() thisform.currec = RECNO() thisform.gridback = this.backcolor WITH THIS .SetAll("DynamicBackColor",gridcolor(),"COLUMN") * a nicer back color is RGB(255,255,192) ENDWITH grid.afterrowcolchange(): LPARAMETERS nColIndex dodefault() thisform.currec=recno(this.recordsource) * This.Columns(This.ActiveColumn).Text1.BackColor = RGB(255,0,0) * This.Columns(This.ActiveColumn).Text1.Forecolor = RGB(0,0,0) thisform.lockscreen=.f. if this.lLeavingGrid=.t. this.Refresh() endi grid.BeforeRowColChange(): thisform.lockscreen=!this.leavegrid grid.when(): thisform.leavegrid=.f. grid.valid(): thisform.leavegrid=.t. function gridcolor parameter m.special local m.color m.color="iif(recno(This.RecordSource)=thisform.currec,"+; "RGB(192,255,255)," if empty(m.special) m.color=m.color+"thisform.gridback" else m.color=m.color+m.special endif return m.color+")" 28. DBSETPROP is used with CREATE SQL VIEW (gendbc.prg and view designer) CURSORSETPROP is used when the view is opened. dbname=sys(3) create database (dbname) create sql view T_VIEW remote connect foxpro shared ; as select * from INVENTRY select 0 use T_VIEW shared ? CURSORSETPROP("BUFFERING", 5, "T_VIEW") ? CURSORSETPROP("UPDATABLEFIELDLIST", "MEMOTEXT,DSTN,QTYD", "T_VIEW") ? CURSORSETPROP("SENDUPDATE", .t., "T_VIEW") ? CURSORSETPROP("KEYFIELD", "IMRD", "T_VIEW") on error ? "ERROR", error(), message(), lineno() ? time() m.time=time() ? m.time BEGIN TRANSACTION update T_VIEW ; set DSTN=m.time, QTYD=QTYD-1 ; where IMRD=5 update T_VIEW ; set DSTN=m.time, QTYD=QTYD-1 ; where IMRD=6 =inkey(0) if tableupdate(.t.) END TRANSACTION ? "transaction completed" else =aerror(errarray) for nn=1 to 7 ? errarray[nn] endfor ROLLBACK errarray=.f. ? "reverted =", tablerevert(.t.) endif 29. In general standard maintenance on Fox2x tables in VFP won't cause any table type changes. Using ALTER TABLE, COPY TO, and other commands that create "new" tables, will change the type, but you can of course change them back with the COPY TO ... TYPE FOX2X. 30. The following would open and close exactly one database. If CLOSE DATABASE was called without any active DBC, it would work like the old FoxPro. OPEN DATABASE test CLOSE DATABASE to switch databases, SET DATABASE TO database to open a table from a particular database: select 0 use database!table select table 31. To bring the active row in a grid to be displayed at the top of the grid. This.init() if !empty(This.RecordSource) and reccount(This.RecordSource) > 0 This.OldActiveRow = recno(This.RecordSource) else This.OldActiveRow = 0 endif This.AfterRowColChange: if !empty(This.RecordSource) and reccount(This.RecordSource) > 0 if This.OldActiveRow <> recno(This.RecordSource) This.GridRowChange() THISFORM.Refresh() endif endif This.GridRowChange() // custom method DO WHILE THIS.RelativeRow > 1 THIS.DoScroll(1) ENDDO If I understand you, what you are trying to avoid is the grid seeming to sort of "jump around" as it's refreshed? You want it to appear to nicely scroll as the new records come in - with the most recently added record always on the last displayed row of the grid? This is actually pretty easy (once you get the hang of programmatically scrolling the grid). Check out the DoScroll method, the ActiveRow property and the RelativeRow property on the grid. Then do something like this: llOldLock = ThisForm.Lockscreen ThisForm.Lockscreen = .T. SELECT theGridTable GO BOTTOM ThisForm.myGrid.SetFocus() ** scroll until the grid looks like you want ** this is left as an exercise for the 'student' :^) ThisForm.Lockscreen = llOldLock 32. To refresh the table under the grip, read these articles Take a look at the techniques in these articles: 140653 PRB: Cursor-Based Grid Goes Blank If SQL SELECT Resets Cursor http://support.microsoft.com/?id=140653 131836 PRB: Grid Not Refreshing Displaying a Cursor From Query http://support.microsoft.com/?id=131836 33. Use the thisform.QueryUnload() method to thsiform.release(). if thisform.cmdSave.enabled * waiting for click on Save or Cancel buttons but user * clicked the Close button if !messagebox("Discard changes?",36,"Warning")==6 NODEFAULT return endif endif dodefault() thisform.visible=.f. 34. to close a form price.scx with form.name="pricecrn" from a procedure external to the form, release window pricecrn or price.release 35. then make the portion of the image white that should be transparent . . (vfp handles white as transparent .. but only in bmp images) make a copy of the bitmap and in this copy replace all white pixels that should be displayed white (not transparent) with black ones .. now name this file the same as your original picture but with the file extension ".msk" .. (eg. upArrow.bmp -> upArrow.msk) add these files also to your project .. now VFP should display the portions that are black in the "mask picture" as white and not transparent .. 36. read these to access registry from visual foxpro HOWTO: Write a REG_EXPAND_SZ to the Registry http://support.microsoft.com/?id=271733 265331 HOWTO: Read a REG_EXPAND_SZ Value From the Registry http://support.microsoft.com/?id=265331 258559 HOWTO: Write a REG_SZ Value to the Registry http://support.microsoft.com/?id=258559 258556 HOWTO: Read a REG_SZ Value From the Registry http://support.microsoft.com/?id=258556 258545 HOWTO: Write a REG_MULTI_SZ Value to the Registry http://support.microsoft.com/?id=258545 258528 HOWTO: Read a REG_MULTI_SZ From the Registry http://support.microsoft.com/?id=258528 258262 HOWTO: Write a DWORD to the Registry http://support.microsoft.com/?id=258262 258161 HOWTO: Read a DWORD From the Registry http://support.microsoft.com/?id=258161 191638 HOWTO: Programmatically Access the Registry in Visual FoxPro http://support.microsoft.com/?id=191638 244675 HOWTO: Use the Windows Script Host to Read, Write, and Delete Registry http://support.microsoft.com/?id=244675 37. the grid's delete mark can be used. Use the grid.deleted() event. Pop up your messagebox, and if the answer is 'No,' issue NODEFAULT to block the deletion. 38. to print to a specific printer 162798 HOWTO: Use SET PRINTER TO NAME to Specify Report Destination http://support.microsoft.com/?id=162798 39. report printing: PUSH MENU _MSYSMENU REPORT FORM myreport.frx TO PRINTER PROMPT PREVIEW NOCONSOLE POP MENU _MSYSMENU You can control the number of copies programmatically in a report. See this article for more information: 251236 HOWTO: Programmatically Set the Number of Copies for a Report http://support.microsoft.com/?id=251236 133163 HOWTO: Control Printer Attributes for a Report at Run Time http://support.microsoft.com/?id=133163 188403 HOWTO: Modify Report Fields Programmatically http://support.microsoft.com/?id=188403 This article on modifying the report at runtime may be useful also: 133163 HOWTO: Control Printer Attributes for a Report at Run Time http://support.microsoft.com/?id=133163 e.g. check out www.news2news.com and look at functions: SetPrinter GetPrinter EnumPrinterData 40. to print an image on a report: It is usually better not to use general fields. You can store binary data like JPG's in a binary memo field using FILETOSTR(). Use STRTOFILE() to store the memo field contents in a new file. Here's a basic sample on how to print images stored in a binary memo field: http://www.foxite.com/uploads/_2215n38q.zip 41. barcode font Find a Code39 font with helper functions. Here is one at http://www.morovia.com/font/ 42. What method are you using to print the HTML or XML file? If you use StrToFile() to print do you see the same behavior? 190769 HOWTO: Use STRTOFILE() to Send Output to a Printer http://support.microsoft.com/?id=190769 43. 156551 HOWTO: Use SYS(3054) to Optimize a Query http://support.microsoft.com/?id=156551 248608 INFO: SQL SELECT Optimization Levels and Performance http://support.microsoft.com/?id=248608 176483 PRB: Large Amounts of RAM Seem to Process Data Slowly http://support.microsoft.com/?id=176483 44. 137124 HOWTO: Create a PageFrame Parameterized View http://support.microsoft.com/?id=137124 45. wait for an external file is ready: declare Sleep in Win32api integer local fd, FileName FileName = 'Whatever' do while .T. fd = fopen(FileName, 12) do case case (fd < 0) =sleep(1000) otherwise =fclose(fd) exit endcase endwhile 46. visual studio sp4 dated aug 14 2000 47. pulling data from clipboard populated with data from excel: If you use _CLIPTEXT, like Christian suggests, you have the excel-data as simple text. You have to parse the text into a cursor to populate it in a grid. It could look like this (tested with Excel 97, Win XP) <Snip> LOCAL lcTmpFile AS String LOCAL lnFieldCnt AS Integer LOCAL lnCnt AS Integer LOCAL aStructure[1,4] AS Array lcTmpFile= ForceExt( Sys(2015), "TMP" ) StrToFile( _CLIPTEXT, lcTmpFile ) lnFieldCnt= Occurs( Chr(9), MLine( _CLIPTEXT, 1 ) ) && Fields are delimited with TAB DIMENSION aStructure[ lnFieldCnt, 4 ] FOR lnCnt= 1 TO lnFieldCnt aStructure[ lnCnt, 1]= "Field_"+Transform( lnCnt ) aStructure[ lnCnt, 2]= "C" aStructure[ lnCnt, 3]= 100 aStructure[ lnCnt, 4]= 0 ENDFOR CREATE CURSOR curExcel FROM ARRAY aStructure APPEND FROM (lctmpFile) TYPE DELIMITED WITH TAB BROWSE <Snip> There may be other, easier ways to accomplish this. Here are 2: 1. Simple import into a cursor (the traditional way). IMPORT FROM "myExcelFile.XLS" TYPE XL5 2. Automation (the fancy way <s>) loExcel= GetObject( "myExcelFile.XLS" ) loSheet= loExcel.Sheets(1) ? loSheet.Cells(1,1).Value ? loSheet.Cells(2,1).Value 48. Here is an article that may help you recreate the indexes on your tables: 202520 FILE: Use CDX(),TAG(), and SYS(14) Function to Create an Index Utility http://support.microsoft.com/?id=202520 49. If you still have the FPT file, then you can buy a third party tool that repairs memo fields. Here are a few articles that list software companies that supply this software: 87688 PRB: "Not a Database File" Error Using a Database File http://support.microsoft.com/?id=87688 189458 INFO: Third Party Utility Repairs FoxPro Record and Memo Data http://support.microsoft.com/?id=189458 If the FPT file is truly missing and you have no backup, then you can make a table with memo field (call the table junk). Then rename the Junk.fpt to <tablename>.fpt. You should then be able to open your table; however, all the data that was in the memo field will be lost. Clearly, this method is used as a last resort. 50. Is "out of memory" the exact syntax of the message? Have you tried adding a SYS(3050) function to the code? You might want to first try a very low number. For example, SYS(3050,1,256). If this does not help, I would try 5000000 (no commas) as the last parameter and work your way up 5000000 bytes at a time. I don't know what your code is doing, but I have seen the usage of SYS(1104) helpful when VFP is not releasing memory. For example, if you had a loop to import or export data, you might want to add a SYS(1104) before entering the loop or after exiting the loop. Since I don't know what your code is doing, I am just offering this since it has helped others in the past. Here are two articles that offer more information on these functions: Along with all the other suggestions you have received, you might want to use the SYS(3050) function to ensure the VFP is using internal memory buffers efficiently 176483 PRB: Large Amounts of RAM Seem to Process Data Slowly http://support.microsoft.com/?id=176483 Also, this article might be helpful regarding the suggestions involving anti virus software: 321550 HOWTO: Optimize Visual FoxPro Applications While Using Norton AntiVirus http://support.microsoft.com/?id=321550 I have two suggestions: First, add a SYS(3050) function to the SELECT-SQL command. For example: SELECT ID,NAME,DESC, SYS(3050,15000000) as junk FROM <TABLE> WHERE DESC LIKE 'WINTER%' You might try values higher and lower than 15000000 in the last parameter. You can go as low as 256. Here is some more information on the SYS(3050) function: 176483 PRB: Large Amounts of RAM Seem to Process Data Slowly http://support.microsoft.com/?id=176483 Second, you might try using an ATC() function in the SELECT-SQL command: Fixing the memory leak is obviously the best route, but this might help http://support.microsoft.com/?kbid=234562 51. SET ANSI OFF SELECT * FROM Table WHERE sst LIKE '001' SELECT * FROM Table WHERE sst == '001' SET ANSI ON SELECT * FROM x WHERE sst = '001' (SET EXACT ON or OFF makes no difference in SQL queries) 52. If you are trying to print a Word .DOC file from Visual FoxPro, you need to use OLE automation. You are controlling Word from within VFP using code causing Word to print the document and return back to VFP. Here are some articles that should help get you started: 138205 HOWTO: Use OLE Automation with Microsoft Word http://support.microsoft.com/?id=138205 176069 HOWTO: Print a Range of Pages in Word Using OLE Automation http://support.microsoft.com/?id=176069 170393 HOWTO: Prevent Word Printing Error with OLE Automation http://support.microsoft.com/?id=170393 194306 HOWTO: Make Word Print Duplex Using OLE Automation http://support.microsoft.com/?id=194306 222101 HOWTO: Find and Use Office Object Model Documentation http://support.microsoft.com/?id=222101 241942 HOWTO: Prevent Word Printing Error with BackgroundPrintingStatus Property http://support.microsoft.com/?id=241942 Another options is to embed or link the Word document into a general field of a table. You can then use the Picture/ActiveX Bound control to print the general field that contains the Word document. 52. You can use the MSCOMM32 actice x control to connect VFP to a serial interface. Here's some general information about VFP and COM ports. HOWTO: Receive from the Serial Port by Using MScomm32.ocx. http://support.microsoft.com/default.aspx?scid=140525 Also useful may be HOWTO: Send to the Serial Port by Using Mscomm32.ocx. http://support.microsoft.com/default.aspx?scid=139526 And of course, HOWTO: Transmit and Receive Binary Data using MSCOMM32. http://support.microsoft.com/default.aspx?scid=154741 53. automatic log display Add a timer control to the form and set these properties: Enabled=.f. Interval=3000 Timer: SKIP thisform.Refresh ** You need to check for EOF() but you get the idea. In the command button toggle the timer control on and off: IF thisform.timer1.enabled=.t. thisform.timer1.enabled=.f. ELSE thisform.timer1.enabled=.t. endif If you have a text boxes with a ControlSource attached to a table, you will see each record be displayed every three seconds. 54. 174524 HOWTO: Retrieve and Insert HTML Into Memo Field http://support.microsoft.com/?id=174524 >Automatic Application Updates over the Web with Visual FoxPro 7.0 >http://www.west-wind.com/presentations/wwCodeUpdate/codeupdate.asp 55. If you want a form window outside the screen for you application the forms ShowWindow property should be set to 2 Top-level form. The screen can the be hidden by including a Config.fpw file in the project with the line SCREEN=OFF Other forms launched from this main form can be ShowWindow=2 or ShowWindow=1, combined with Desktop=.T. or .F. and WindowType=0 Modeless, or WindowType=1 Modal. A Top-level form can't be Modal too. 156088 HOWTO: Hide Desktop in Run-Time (.exe) VFP5 Application http://support.microsoft.com/?id=156088 190350 HOWTO: Create Top-Level Splash Screen with No TaskBar Icon http://support.microsoft.com/?id=190350 56. on pad iv_window of iv_menu activate popup _mwindow 57. Set your Column.InputMask to your picture, not the Text1 control. thisform.oGrid.ColumnX.InputMask = "999,999.99" 58. Hmm...if I add thisform.draw() after 'additem()' it works...go figure I'm using my listbox as a display device for a given process and I'm trying to display it's progress and I'd like to select the latest action. My problem is that the newest 'action item' isn't displayed right away...somtimes 'starting' and 'processing' appear at the same time when in fact there is a delay of a few minutes. Here's what I got: method1: thisform.addmsg("starting") thisform.startprg() thisform.addmsg("processing") thisform.continue() .... addmsg: lparameters tmsg thisform.lst1.additem(tmsg) 59. for a good list of icons: http://www.coolarchive.com/ http://dir.yahoo.com/Arts/Design_Arts/Graphic_Design/Web_Page_Design_and_Layaout/Graphics/Icons/ 60. playing sound You can also use the MessageBeep API to play a WAV file: 193223 HOWTO: Use the MessageBeep API to Play System .WAV Files http://support.microsoft.com/?id=193223 Here are two options: DECLARE INTEGER sndPlaySound IN "winmm.dll" STRING lpszSoundName, INTEGER uFlags #DEFINE SND_NOWAIT 0x2000 #DEFINE SND_ASYNC 0x1 #DEFINE SND_SYNC 0x0 sndPlaySound("yourwavefile.wav", SND_NOWAIT + SND_ASYNC) You can also use the native VFP SET BELL TO command: SET BELL TO "yourwavefile.wav" ?? CHR(7) 61. 156788 FIX: Report Print Preview Illegible Under Windows NT http://support.microsoft.com/?id=156788 62. and here is info on how to hide the program from the task bar .. http://support.microsoft.com/?id=175909 > > > If your application has only one form, here is another way to hide the > > > application: > > > > > > From your main program call your form like this: > > > > > > _VFP.VISIBLE = .F. > > > DO FORM MyFormName NOSHOW > > > READ EVENTS > > > > > > Then from the Systray click or doubleclick you can show your form In my case it is a simple form, here the code for the Resize: IF THISFORM.WINDOWSTATE = 1 && Minimized THISFORM.HIDE() ENDIF The API code was only used to hide or show the taskbar icon, and for that I used the ShowWindow API call: Declare Integer ShowWindow in Win32API Integer hWnd, Integer nCmdShow ShowWindow(_VFP.Hwnd, 0 ) ShowWindow(_VFP.Hwnd, 5 ) It hides the window (which is already minimized anyhow) but more importantly, it also hides the taskbar icon, which is what I want. I put the code in _screen.resize, and it simply checks _screen.WindowState to see if we are minimized or not. If we are minimized, we hide the taskbar icon. If not, we unhide and set AlwaysOnTop to .T. and then to .F. so that the VFP windows is made visible. There is an API call that makes it the foreground app, but I haven't had the time to find out which that is, so AlwaysOnTop is good enough for now. Before it goes into production I'll find tune it to do things like checking to see if the window is already visible before setting it visible, checking to see if the window is on top before setting it on top, etc. Hiding the VFP window by setting _Screen.Visible to .F. also hides the systray icon, so that was not an option. 63. For registry read/writes, I use Windows Shell Scripting, which works quite well and neatly hides any API calls, e.g. oSh = CreateObject("WScript.Shell") cKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon\" cValue = "DefaultUserName" cData = "John" oSh.RegWrite(cKey + cValue, cData) ? oSh.RegRead(cKey + cValue) 64. As for printer driver memory leaks, have you tried using _fpreset() before and after any printer/report-related commands ... Declare _fpreset in msvcrt.dll && in your main.prg Then, before and after any printer or report commands, issue _fpreset(). For more info, check out KB article Q183522. 65. DECLARE integer MessageBox IN User32 as MBox; integer hwnd, string lpText, string lpCaption, integer uType ?mbox(_screen.HWnd,"Hi There","Testing",0) 66. http://www.utmag.com/March2002/ see article: "VFP and Winsock: Desmystifying" Directly communication via that TCP/IP address might be another options. See this white paper: http://www.west-wind.com/presentations/internetenabling/InternetEnabling.htm MSMQ is another viable option http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msmq/msmq_overview_4ilh.asp 67. While I don't have a help file to send you, I did find some code on www.universalthread.com. Go to UT, click on the Download icon and choose VFP as the product. Search for the following: I have just download a freeware DynaZipAX from >http://www.jassing.com/vfp.htm which is a zip program 68. you've identified the cmdSave.Click on one of your forms as being one of the processes that is too slow. This method contains hundreds of lines of code, and calls other methods and user-defined functions. 69. you've identified the cmdSave.Click on one of your forms as being one of the processes that is too slow. This method contains hundreds of lines of code, and calls other methods and user-defined functions. You add the statement: set coverage to save.log at the top of the cmdSave.Click, and set coverage to just before any exit points (return statements). 1) create table profiler free ; (elapesed N(11,3), dummy c(1), procname c(30), ; linenum N(5,0), filename c(30)) 2) Import the log file using this: append from save.log delimited 3) Browse the profiler table to see that everything was imported correctly (not a necessary step, obviously) 69. foxpro event firing sequence: dataenvironment.beforeopentables form.load dataenvironment.init object.init && from innermost to outermost form.init form.activate && form+objects displayed object.when && follow tab order form.gotfocus object.gotfocus object.valid object.lostfocus form.queryunload && form closed by "x" form.destroy object.destroy && from outermost to innermost form.unload dataenvironment.afterclosetables dataenvironment.destroy 70. 254478 Use the ActiveX Progress Bar OCX Control http://support.microsoft.com/?id=254478 259296 HOWTO: Display a Progress Bar in a Status Bar http://support.microsoft.com/?id=259296 167192 HOWTO: Create a Progress Indicator Using Threed Panel Control http://support.microsoft.com/?id=167192 Check out the thermometer foundation class located in your foxpro directory. The file is ...\Samples\Solution\Ffc\therm.scx, this is probably what you're looking for 71. You might want to check out Mark McCasland's CursorAdaptor class at http://www.mctweedle.com . He has a whole set of samples for it's use. 72. I was able to insert a page break with this VFP code: oExcel = CREATEOBJECT("Excel.Application") oExcel.Visible = .T. && For testing oBook = oExcel.Workbooks.Add() oBook.Sheets(1).Cells(4, 4).Select() oExcel.ActiveWorkbook.ActiveSheet.HPageBreaks.Add(oBook.Sheets(1).Cells(5, 5)) 73. 138107 PRB: Standard Toolbar Visible in .Exe http://support.microsoft.com/?id=138107 74. LOCAL lcExecutable, lcShortLNK, lcDesktopFolder LOCAL Array laShortCutInfo[2,2] laShortcutInfo[1,1] = "MyFirstExe.exe" laShortcutInfo[1,2] = "MyFirstExe.lnk" laShortcutInfo[2,1] = "MySecondExe.exe" laShortcutInfo[2,2] = "MySecondExe.lnk" oShell = create("wscript.shell") if type('oShell') = "O" and not isnull(oShell) lcDesktopFolder= addbs(oShell.SpecialFolders("desktop")) for lnI = 1 to alen( laShortcutInfo,1) lcExecutable = laShortcutInfo[lnI,1] lcShortLNK = laShortcutInfo[lnI,2] if file( (lcExecutable) ) oShortCut = oShell.CreateShortcut( addbs(lcDesktopfolder)+lcShortLNK) With oShortcut .Targetpath= addbs(fullpath( curdir()))+lcExecutable .WorkingDirectory= addbs(fullpath( curdir())) .WindowStyle = 2 .save() endwith endif endfor messagebox("Shortcut(s) created on your desktop"+chr(13)+"maybe you will have to adjust some settings"+chr(13)+"Check manual Chapter: 'INSTALLATION'",48+16, "At your Service") else messagebox("Creating shortcut(s) failed"+chr(13)+"You will have to do this yourself"+chr(13)+"See manual for Installation",48+16, "At your Service") endif 75. CREATE CONNECTION CONFRIENDS ; DATASOURCE "Friends" ; USERID "Eldor" ; PASSWORD "guess" **** =DBSetProp('CONFRIENDS', 'Connection', 'Asynchronous', .T.) =DBSetProp('CONFRIENDS', 'Connection', 'BatchMode', .T.) =DBSetProp('CONFRIENDS', 'Connection', 'Comment', '') =DBSetProp('CONFRIENDS', 'Connection', 'DispLogin', 1) =DBSetProp('CONFRIENDS', 'Connection', 'ConnectTimeOut', 15) =DBSetProp('CONFRIENDS', 'Connection', 'DispWarnings', .F.) =DBSetProp('CONFRIENDS', 'Connection', 'IdleTimeOut', 0) =DBSetProp('CONFRIENDS', 'Connection', 'QueryTimeOut', 0) =DBSetProp('CONFRIENDS', 'Connection', 'Transactions', 1) =DBSetProp('CONFRIENDS', 'Connection', 'Database', '') 76. REATE SQL VIEW "RV_CARDS" ; REMOTE CONNECT "conFriends" ; AS SELECT * FROM dbo.tblCards Tblcards DBSetProp('RV_CARDS', 'View', 'UpdateType', 1) DBSetProp('RV_CARDS', 'View', 'WhereType', 3) DBSetProp('RV_CARDS', 'View', 'FetchMemo', .T.) DBSetProp('RV_CARDS', 'View', 'SendUpdates', .T.) DBSetProp('RV_CARDS', 'View', 'UseMemoSize', 255) DBSetProp('RV_CARDS', 'View', 'FetchSize', 100) DBSetProp('RV_CARDS', 'View', 'MaxRecords', -1) DBSetProp('RV_CARDS', 'View', 'Tables', 'dbo.tblCards') DBSetProp('RV_CARDS', 'View', 'Prepared', .F.) DBSetProp('RV_CARDS', 'View', 'CompareMemo', .T.) DBSetProp('RV_CARDS', 'View', 'FetchAsNeeded', .F.) DBSetProp('RV_CARDS', 'View', 'FetchSize', 100) DBSetProp('RV_CARDS', 'View', 'Comment', "") DBSetProp('RV_CARDS', 'View', 'BatchUpdateCount', 1) DBSetProp('RV_CARDS', 'View', 'ShareConnection', .F.) *!* Field Level Properties for RV_CARDS * Props for the RV_CARDS.card_id field. DBSetProp('RV_CARDS.card_id', 'Field', 'KeyField', .T.) DBSetProp('RV_CARDS.card_id', 'Field', 'Updatable', .F.) DBSetProp('RV_CARDS.card_id', 'Field', 'UpdateName', 'dbo.tblCards.Card_id') DBSetProp('RV_CARDS.card_id', 'Field', 'DataType', "I") * Props for the RV_CARDS.friend_id field. DBSetProp('RV_CARDS.friend_id', 'Field', 'KeyField', .F.) DBSetProp('RV_CARDS.friend_id', 'Field', 'Updatable', .T.) DBSetProp('RV_CARDS.friend_id', 'Field', 'UpdateName', 'dbo.tblCards.Friend_id') DBSetProp('RV_CARDS.friend_id', 'Field', 'DataType', "I") * Props for the RV_CARDS.occasion field. DBSetProp('RV_CARDS.occasion', 'Field', 'KeyField', .F.) DBSetProp('RV_CARDS.occasion', 'Field', 'Updatable', .T.) DBSetProp('RV_CARDS.occasion', 'Field', 'UpdateName', 'dbo.tblCards.occasion') 77. parameter passing and return values from form add custom propery retval to myform. form.init() lparameters arg1, arg2 form.unload() return thsiform.retval do form myform to retval 78. * Start one/single occurence/instance of this program. Test this using Win32API DECLARE long FindWindow IN Win32API integer, string DECLARE long ShowWindow in Win32API long, long DECLARE long SetForegroundWindow in Win32API long #DEFINE TITLE "<Your application title>" #DEFINE SW_RESTORE 9 && Show application maximized LOCAL lnHandle lnHandle = FindWindow(0, TITLE) && Check if window exist IF lnHandle > 0 * Application is running. Show the running one and quit this one ShowWindow(lnHandle, SW_RESTORE) SetForegroundWindow(lnHandle) RETURN ENDIF 79. programmatically create form: oForm = CREATEOBJECT("Form") oForm.AddObject("Header1","NameHeader") oForm.Header1.Left = 1 oForm.Caption = "Listbox Headers Work Great!" FOR EACH oControl IN oForm.Controls oControl.Visible = .T. ENDFOR oForm.Show(1) CLEAR ALL *** end of main program DEFINE CLASS TestForm as Form custom_property = "" ADD OBJECT Edit1 as Editbox ; WITH Left = 5, Top = 5 PROCEDURE Init THIS.AddProperty("aItems[1,3]") ENDPROC PROCEDURE custom_method THIS.custom_property = "init" ENDPROC ENDWITH ENDDEFINE DEFINE CLASS ColorHeader AS HeaderButton Caption = "Color" PROCEDURE Click THIS.PARENT.List1.SortOrder = "TheColor" THIS.PARENT.List1.Direction = THIS.LastDirection DODEFAULT() ENDPROC ENDDEFINE 80. Convert SCX into PRG, view form code: DO (_BROWSER) WITH "yourform.scx" and then use the "View Class Code" button. Yes! Open the form in the Class Browser and click on the 4th icon (Show classcode) and the Form with all methods and properties will be displayed at once. 81. passing array as parameter oArrayPar=CREATEOBJECT("custom") oArrayPar.AddProperty("myArray[1]") do form myInputform with oArrayPar *************************** *Init method of myInputForm *************************** lparameter toArrayPar if Type("toArrayPar")="O" thisform.oParameter=toArrayPar endif In the Release-Method of myInputform you should copy the Array to the Parameterobject =acopy(myProcessedArray,thisform.oParameter) &&copies the Array to the caller object thisform.oParameter=.null. && releases the reference of the caller object because we don't like hanging references 82. to browse a sql server table go next: select xx.pk, xx.amount, count(*), sum(yy.amount) as recno from tx xx, tx yy where xx.pk >= yy.pk and yy.pk > @curpk group by xx.pk, xx.amount order by xx.pk pk amount recno balance ---- ------------ ----------- ---------- A 10.00 1 10.00 B 20.00 2 30.00 C 30.00 3 60.00 go previous: select xx.pk, xx.amount, count(*), sum(yy.amount) as recno from tx xx, tx yy where xx.pk <= yy.pk and yy.pk < @curpk group by xx.pk, xx.amount order by xx.pk desc pk amount recno balance ---- ------------ ----------- ---------- DD 50.00 1 50.00 D 40.00 2 90.00 C 30.00 3 120.00 83. to call a stored procedure using OLEDB: **FORM LOAD #Include adovfp.h *#DEFINE ADCMDSTOREDPROC &H0004 WITH Thisform .oCn = CREATEOBJECT("ADODB.Connection") .oRS = CREATEOBJECT("ADODB.RecordSet") .oCmd = CREATEOBJECT("ADODB.Command") IF VARTYPE(.oCn)="O" AND VARTYPE(.oRS) = "O" .oCn.ConnectionString = "Provider=SQLOLEDB;User ID=user;Password=pass;Initial Catalog=Cap;Data Source=192.168.3.2" .oCn.Open() IF .oCn.State = 1 WITH .oCmd .CommandText = 'usp_AT_Test2' .Activeconnection = Thisform.ocn .CommandType = 4 &&adCmdStoredProc ENDWITH *SET STEP ON .oCmd.Parameters("@custno").Value = 'PA9035' .oRS = Thisform.oCmd.Execute SET STEP ON *!* WITH .oRS *!* .ActiveConnection = Thisform.oCn *!* .CursorType = 3 *!* .Open("SELECT * FROM AT_Comments") *!* ENDWITH ENDIF ENDIF ENDWITH *********************************************************************** **FORM INIT WITH ThisForm .oledtcATComments.Object.RecordSet = .oRS .oledtcATComments.Object.Refresh() .oleGrdATComments.Object.DataSource = .oledtcATComments.Object .oleGrdATComments.Object.Refresh() ENDWITH 84. FUNCTION tbsave * * save the settings * PUBLIC ARRAY gaTBSets[11, 2] * LOCAL lnCntr * *-- Fill an array with toolbar names. * gaTBSets[ 1, 1] = "Color Palette" gaTBSets[ 2, 1] = "Database Designer" gaTBSets[ 3, 1] = "Form Controls" gaTBSets[ 4, 1] = "Form designer" gaTBSets[ 5, 1] = "Layout" gaTBSets[ 6, 1] = "Print Preview" gaTBSets[ 7, 1] = "Query Designer" gaTBSets[ 8, 1] = "Report Controls" gaTBSets[ 9, 1] = "Report Designer" gaTBSets[10, 1] = "Standard" gaTBSets[11, 1] = "View Designer" * *-- Check toolbars for their visibility *-- If so, store that setting in the 2nd column. *-- and hide the toolbar * _SCREEN.LOCKSCREEN = .T. * FOR lnCntr = 1 TO ALEN(gaTBSets,1) IF WEXIST( gaTBSets[lnCntr,1] ) gaTBSets[ lnCntr,2 ] = .T. HIDE WINDOW (gaTBSets[lnCntr,1]) ELSE gaTBSets[ lnCntr,2 ] = .F. ENDIF ENDFOR _SCREEN.LOCKSCREEN = .F. * ENDFUNC *********** FUNCTION TBRest * *-- Make the toolbars visible that are stored as previously visible in the gaTBSets array * LOCAL lnCntr * _SCREEN.LOCKSCREEN = .T. * FOR lnCntr = 1 TO ALEN( gaTBSets ,1 ) IF gaTBSets[ lnCntr, 2 ] SHOW WINDOW ( gaTBSets[ lnCntr, 1 ] ) ENDIF ENDFOR _SCREEN.LOCKSCREEN = .F. ENDFUNC 85. > thisform.olecontrol2.reportfilename = xReportName > thisform.olecontrol2.datafiles(0) = fnd > thisform.olecontrol2.connect = 'DSN=TEMP' > thisform.olecontrol2.destination = 0 > thisform.olecontrol2.printreport if not 'FOXTOOLS'$set('LIBRARY') set libr to sys(2004)+"FoxTools" endi foxwind=mainhwnd() getactive=regfn('GetActiveWindow','','I') do whil .t. if foxwind=callfn(getactive) exit endi endd 86. Automating the built-in fax server lcMyServer="\\W2K" && your PC name lcDokument=GetFile() loF=CreateObject("FaxServer.FaxServer") lnHandle=loF.Connect(lcMyServer) loD=loF.CreateDocument(FullPath(lcDokument)) loD.FaxNumber="+420499320708" loD.Send() loF.Disconnect() 87. PROCEDURE newguid LOCAL lcPK,lcBuffer,i,lnHex,lnUpper,lnLower DECLARE INTEGER CoCreateGuid IN OLE32.DLL STRING @lcBuffer lcBuffer=SPACE(17) lcPK=SPACE(0) IF CoCreateGuid(@lcBuffer) = 0 FOR i=1 TO 16 lnHex=ASC(SUBSTR(lcBuffer,i,1)) lnUpper=INT(lnHex/16) lnLower=lnHex-(lnUpper*16) lcPK=lcPK+SUBSTR('0123456789ABCDEF',lnUpper+1,1)+; SUBSTR('0123456789ABCDEF',lnLower+1,1) ENDFOR ENDIF RETURN lcPK ENDPROC 88. To auto-refresh an image control inside a grid.column: grid.init(): this.setall("DynamicFontBold","this.updatepic()","column") grid.updatepic(): with thisform.grid.column1 .image1.refresh() endwith return .f. 89. Only one instance allowed At the beginning of the program: *-- Turn off DDE error messages. =dddesetoption( "SAFETY", .f.) *-- Check to see if DDE service was already started. achan = ddeinitiate( "pkf1", "System" ) IF achan # -1 *-- You'll probably want a more informative message. WAIT WINDOW "Program already running." QUIT ENDIF *-- If we got here, the service was not started, so start it. =ddesetservice( "pkf1", "DEFINE" ) ( ... main body of code goes here ... ) *-- At the end of the program, turn off the service, so we can get in *-- next time. =ddesetservice( "pkf1", "RELEASE" ) 90. To allow the classbrowser to operate from a network directory, patch classbrowser.scx, in the init() event: IF NOT EMPTY(this.cBrowserTable) lcBrowserDBF=this.cBrowserTable ELSE lcBrowserDBF=this.cProgramName ENDIF * added by chang local m.xx, m.ff m.xx=fullpath(curdir()) m.ff=m.xx+sys(2015)+".txt" m.hdl=fcreate(m.ff) if m.hdl < 0 wait window "Unable to write to browser.dbf at "+m.xx return .f. endif fclose(m.hdl) delete file (m.ff) lcBrowserDBF=m.xx+"browser.dbf" lcBrowserDBF=FORCEEXT(lcBrowserDBF,"dbf") lcBrowserFPT=FORCEEXT(lcBrowserDBF,"fpt") this.cBrowserTable=lcBrowserDBF 91. XML ADAPTER TEST #1 oo=CREATEOBJECT("XmlAdapter") XML = CREATEOBJECT("MSXML2.ServerXMLHTTP") xml.open("GET","http://www.nhc.noaa.gov/nhc_at1.xml",.f.) xml.send xms=xml.responsexml oo.LoadXML(xms.xml,.f.,.t.) CREATE CURSOR CHANNEL (tITLE M,LINK M,DESCRIPTION M,COPYRIGHT M, LANGUAGE M,image M,lastBuildDate M,Item M) CREATE CURSOR item(title m, link m, description m) && content of item collection OO.ADDTABLESCHEMA("channel") && RSS Root oo.AddTableSchema("item") && Item detail record t1=oo.Tables.Item(1) t1.tocursor(.t.,"channel") && append to channel cursor (header record) SELECT (t1.alias) BROWSE T2=OO.TABLES.ITEM(2) T2.TOCURSOR(.T.,"item") && append to item cursor (many records) SELECT (t2.alias) BROWSE FIELDS cTitle=PADR(Title,45), cLink=PADR(LINK,70), cDesc = PADR(Description,45) 92.