!short: ^BNew features and bug corrections for FiveWin !short:ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ !short: FiveWin 1.7 d  FiveWin 1.7 d ============= * Enhancement: FiveWin TRtfFile Class -for creating Windows help files!- has been enhanced to accept characters with ascii over 127 ! This was producing errors when trying to create a .HLP file from the FiveWin IDE. Try those extended characters now. It is ok! Thanks to Angel Enrique Iglesias! * New: Function PrinterSetup() that shows the Windows standard dialog box to setup the printer. It has also been added as TPrinter:Setup() method. * Sorry! The debugger was not working (a very little error ) in 1.7 c. Fixed! Sorry for the new download. Thanks, * The FiveWin Norton Guide is now over 1.1 Mega size (ufff, FiveWin is really big!). There is a lot of new documentation and more is coming soon. Thanks to all of you that have been waiting for it. We promised you we are going to offer the best documentation, and be sure we will do it! * Enhancement: TCheckBox class has been modified to default initialize associated logical variable when it is nil. Our wish is that in no circunstance FiveWin may generate an error even if it is not been used properly! * ODBC: Has been greatly enhanced! We are in contact with some companies that are working really hard to help us fine tunning FiveWin ODBC. There are very nice new tricks that really speed up a lot ODBC processes (like automatically generating DBFs from ODBC SQL queries). Thanks a lot to Jesus Iniesta from Caja Madrid! See the new SAMPLE\ODBC01.prg developed by Jesus Iniesta. And much more is coming soon! * Enhancement: GETs with password detection. TGet class has a new DATA ::lPassword. You may set it to .t. or just specify PASSWORD style from inside your resource editor. Thanks to our dear Ignacio Ortiz de Zu¤iga. * New functions MsgRun() and MsgWait(): MsgRun() executes a codeblock and waits for its return before continuing. MsgRun( , , ) MsgWait() is a modification on the above, and is specifically for showing waiting messages. MsgWait( , , ) See SAMPLES\TestMsg.prg for a working sample. * FiveWin VBX support has been enhanced, and now it is not needed to especify VBX clause when defining a DialogBox that it is going to use VBX controls. See SAMPLES\TestVbx4.prg. !short: FiveWin 1.7 c  FiveWin 1.7 c ============= * Feature missing: Dialogs were not processing WM_TIMER events. Now it is ok! * Feature missing: Controls were not processing WM_RESIZE events. Now it is ok! * TBitmap Class has been enhanced. Now it supports ZOOM IN and OUT effects. See SAMPLES\TestBmp1.prg. Many thanks to Jesus Iniesta for his help. * TFile Class: Now working with empty files is Ok! A new Method ::AppendLn() added. See SAMPLES\TestFile.prg for a working sample. * Enhancement: Now FiveWin works also as a DDE Server. Some work is still missing to support all features. Also, DDEML support is coming soon! See SAMPLES\DdeClien.prg and SAMPLES\DdeServe.prg. Run them together! * Modification: TWBrowse:lEditCol() has been modified. Latest revisions inhabilited the capability of using the same variable edited as part of the VALID clause. It works ok now! * New feature: Clause READONLY has been implemented also in standard GETs. See SAMPLES\TestKey.prg. * Little bug: TMdiClient:Select() was not working with value 1. It was a >= instead of >. It is ok now. * Enhancement: TBitmaps objects were not recognizing doble click with the mouse. We have modified TWindow:Register() so now all classes process the mouse doble click event. Remember that there is a CodeBlock bLDblClick that gets executed -if defined- when processing this event. bLDblClick receives three parameters: nRow, nCol, nFlags which are the row, col where the mouse was clicked and keyboard special keys flags -situation of the keyboard when doble clicking-. See SAMPLES\TestBmp.prg for an easy sample of doble clicking on a bitmap. * New: TWBrowse:Report() METHOD !!! Now, you can automatically generate a report from a Browse, with exactly the same information as the browse. Generating a report from a browse is as easy as doing oBrw:Report(). :Report( , [] ) By default is the title of the container window of the browse and lPreview is .t.. In just seconds you can generate all the printouts of your browses. Simply great!!! Thanks to Ignacio Ortiz for its superb help! * Enhancements: METHODs KeyDown() and KeyChar() in Classes TGet and TMultiGet have been enhanced to have a higher coherent behavior with SetKey() features and READONLY features (both normal TGet and TMultiGet accept now READONLY clause). * New: Function Bin2D() converts a string which holds a double into a number. It is usefull for working with ODBC when retrieving numbers. Bin2D( ) --> nDouble * Bug fixed: Due some late modifications, WHEN were not working properly. Now it is ok! We have modified TControl:GetDlgCode() and a new TWBrowse: GetDlgCode(). Thanks to Jose Gabriel Escobedo. * Enhancement: ComboBox objects now also manage numeric values. You may do things like: REDEFINE COMBOBOX nVar ITEMS ... or REDEFINE COMBOBOX cVar ITEMS ... !short: FiveWin 1.7 b  FiveWin 1.7 b ============= * Bug fixed: Due to the higher execution speed, DDE was not working properly. It has been fixed, and now works ok! * Bug fixed: Thanks God we found the icon erase background bug! Many, many thanks to Jes£s Melgar. Try IDE.EXE, maximize it and iconize it later and see the icon, the background of the icon is ok! Many thanks! * Bug fixed: Due to the much higher execution speed in 1.7, there was a strange behavior when closing NonModal DialogBoxes. It has been fixed. FiveWin 1.7 is extremelly fast! * New: Labels in FiveWin! Our friend Ignacio Ortiz de Zu¤iga has developed a really nice and ellegant (and small!) sample for creating labels in FiveWin using the FiveWin report engine. Thanks again Ignacio! See SAMPLES\Label.prg * New function: MsgRetryCancel( [,] ) --> lRetry. See SAMPLES\TestMsg.prg for a working sample. !short: FiveWin 1.7  FiveWin 1.7 =========== * Bug fixed: TWorkArea FieldGet() and FieldPut() incorrect behaviors. Thanks to Harry Van Tassel. * Enhancements: OClone(). OClone() is an internal Objects.LIB engine function to generate duplicated objects. * Build.bat: We have increased the number of segments linking specifications for using Microsoft LINK. Remember: If you get a too many segments, just increase the /SE: parameter, or use a Clipper.EXE .CLP file to reduce the number of segments. * New: MDI Childs may have now their own PullDown Menus which will be automatically used by the main window frame when the child is selected. Original implementation: Derk from Netherlands. Thanks Derk! * Debugger: In previous release IV there was a bug a the source code was not visible from the debugger. Now it is Ok! * New: Insert key toggles insert cursor on a GET. Now, when the user press insert key over a GET, the cursor changes to a blinking block. Pressing TAB to go to next GET does not keep this feature active (but we plan to support it ASAP!) * Enhancements: Some WHEN and VALID clauses were missing in some controls. They have been added to all controls (well, those where it has sense to have them ). !short: FiveWin 1.7 - PreRelease IV  FiveWin 1.7 - PreRelease IV ============================= * New!!!: We have already added support for Windows MAPI : Mail Services. See TestMail.prg for a sample. Now you may take advantage of NetWork mail system in Windows which it is really powerfull. * VBXs support!!! Yes, we already manage Visual Basic VBXs files. See TestVbx_.prg for several samples. Probably this is the most important enhancement we have done lately to FiveWin! See documentation for a full explanation and use guides. * There was a missing METHOD in TMultiGet Class: METHOD HScroll( nWParam, nLParam ) VIRTUAL So, MultiLine Gets were not working properly when using an horizontal scrollbar. Now it is ok! See TestMemo.prg for a full working sample, * New Methods for TPrinter Class: TPrinter:SetLandscape() TPrinter:SetPortrait() TPrinter:SetCopies( nCopies ) // number of copies to generate to automatically select printer orientation from source code, without showing the DialogBox. See SAMPLES\TestPrn1.prg for a working sample. * Bug fixed: The new resources control system implemented in FiveWin had a problem that only was activated when generating a lot of Dialog Boxes (several hundreds). It has been fixed and now it works perfect! * Enhancement: We have adapted FiveWin ListBox controls to work also with numeric values. This means that now you may also do: local nValue := 2 REDEFINE LISTBOX nValue ITEMS { "One", "Two", "Three", "Four" } ; ID ... OF oDlg ... And nValue will keep the ListBox selected position. Remember: ListBoxes now are usefull for managing string and numeric variables. We plan to do this also to ComboBoxes. * Enhancements: Ignacio Ortiz has been working improving Report Engine speed (it was already fast, but now it is... incredible!). Also he has done very nice improvements on drawing lines, focus control, and more things... Thanks Ignacio! Simply fantastic! * Enhancements: Error.log information has been increased. Now we tell you all the other active tasks and their names! We keep looking for a way to detect if double space is working -please let us know if you discover it!- We want to offer a really powerfull error.log info. * Enhancements: MDIChild windows now accept all kind of user defined styles. You may have MDIChilds with no maximize button, no border, etc... See TestMDI5.prg for a working sample. * New: Background process management! Now FiveWin offers you the possibility of controlling idle periods. Don't confuse idle actions with timers. Idle actions get processed when _there_is_nothing_ else to process. Modal dialog boxes don't produce Idle periods. See TestIdle.prg for a working sample. * Error.log information has been enhanced: Now we include all the parameters and local variables available to all active procedures and functions. You will find this very helpfull when trying to detect an error. * ButtonBar has been enhanced. Now you can specify TOP, LEFT, RIGHT or BOTTOM and the ButtonBar will show at that side. Also, if you click the right button of the mouse on it, it will appear a popup to manually select the new position. !short: FiveWin 1.7 - PreRelease III  FiveWin 1.7 - PreRelease III ============================ * New function MsgAbout(): This function calls automatically the undocumented Windows function ShellAbout(). MsgAbout( cMsg, cTitle ) --> nil * Bug fixed: pressing "," in a Get caused an error. It was a missing parentesis in the source code. Now it is ok. Thanks to Miguel Escarra. * Missing feature: Method TWBrowse::LButtonDown was not calling the default TWindow:LButtonDown which evals the bLClicked codeblock. It has been corrected, so now it is possible to define actions for bLClicked. * New clause READONLY or NOMODIFY for GET ... MEMO controls. Now it is possible to show a MEMO without letting the user modify its contents. Using the :Disable() method is not a proper way because it also disable the scrollbar, so there is no way to review all the memo contents. This READONLY clause stop the user for writting on it, but the entire memo can be reviewed with normal navigation keys and using the scrollbar. * Enhancement: COLORS.CH. We have replaced the calls to RGB() for their equivalents numeric constant values. This increase the initialization speed in Dialog Boxes when using user colors. Thanks to Jose Gabriel! * Enhancement: Radio buttons where not properly initializing when placing them over windows -instead of Dialog boxes-. We have also added the clause SIZE nWidth, nHeight for properly controlling sizes when placing RADIOs over windows -without using resources-. Thanks John Stolte! * New: Error.log file automatically created when an application error occurrs. This will help the programmer to detect users runtime errors. Feel free to enhance your error.log reported information. See source\function\errsysw.prg. * Missing: PIXEL clause added to GROUP controls. Thanks to Hans M. Polsterer. * New function: Report( [ oLbx ] ). It generates an automatic and elegant paged report from the current workarea, or from the oLbx:cAlias specified as parameter. Sample: USE Clients or @ ... LISTBOX oLbx ... FIELDS ... or Report() REDEFINE LISTBOX oLbx ... FIELDS... Report( oLbx ) A complete and professional report generated in just few seconds !!! See browse.prg for source code. ( Thanks Ignacio Ortiz, you are great! ) * Bug corrected: TWindow::UpdateCoors() was not working properly. Now it is ok! See source\winapi\rects.c : GETCOORS() to check how we calculate it now. * Bug corrected: TWindow::GetFont() was not correctly creating a TFont object, now it is ok! We properly get its nHeigth, nWidth and lBold. Thanks to Manuel Pino !!! * Enhancement: ButtonBars were not showing the 'white border' when a button pressed. It has been corrected! * Bug corrected: TRadMenu:End() was calling Super:End() (and there was no super!) It is Ok now. Thanks to Miguel Oliveira. * Enhancements: Under very extreme low memory conditions, sometimes we were producing an error "Not defined method :HandleEvent". It has been corrected. Now it is ok! It was related to SetProp() and GetProp() Windows API behavior. Also we have added also RemoveProp() calls. Thanks to Javier Alcazar! * Enhancements: new clause ON CHANGE for GETs controls. Now it is possible to execute a codeblock everytime a key is pressed over a GET and you may perform any action and also you can avoid to further process that key: ... GET ... ON CHANGE lMyFunc( nKey, nFlags, Self ) lMyFunc() receives three parameters: nKey, nFlags, Self. And it has to return .t. if you want that key to be processed or .f. if you want to ignore it. Thanks to Javier Alcazar! * New: PEN commands support: DEFINE PEN ; [ STYLE ] ; [ WIDTH ] ; [ COLOR ] To destroy a Pen, do: oPen:End() or oPen:Release() * New function: GetWinDir() returns the Windows directory in the computer. * Browse enhancements: - Standard FiveWin browse.prg function has been enhanced to allow doble click in-cell editing. Review this sources to learn how to do easy in-cell editing in your applications. - New TBrowse:nAtCol() method. It returns the browse column correspon- ding to a pixel-column position. See Browse.prg how to use it to easily doing in-cell editing. - Enhacement: Now TBrowse-columns mouse resizing works even if the browse has been already scrolled to the right or left. Also the mouse cursor changes in those circunstances. * New Report capabilities: - Automatic PREVIEW capability: Now you may review ALL your report on screen before sending it to the printer. You may go forward and backwards, and print only the pages that you want. - TO FILE ... output generation. Which produces an ascii output of the report. Many thanks to Ignacio Ortiz who is doing an excelent job enhancing FiveWin. Thanks Ignacio. * DDE: Has been enhanced. New clause VALID. See DDE.ch. The VALID clause is executed when the connection is ending. * New: CA-Ret DDE management: See SAMPLES\CARET.PRG. * Bug: REDEFINE GET ... MEMO ... UPDATE was not working properly. Now it is ok. * clause ON CHANGE on Browses: You may NOT use SysRefresh() inside clauses ON CHANGE or it will produce an incorrect behavior when clicking on its scrollbars. We don't know why ? But it happens. Remember: Don't use SysRefresh() on Browse ON CHANGE. * Modification: We have eliminated the ::aButtons DATA of the ButtonBar Class. Now we are using standard aControls DATA. * VERY IMPORTANT: We have done a major modification in order to get better coherency and design simplicity, and because in previous versions of FiveWin there was confusion about :End(), :Release(), and RELEASE: Now there is just one RELEASE command, which gets translated to: RELEASE => :End(); := nil You may RELEASE several same class objects at the same time: RELEASE , , ... The End() METHOD is a general purpouse ending system. :End() will check VALID clause if defined and in some circunstances :End() will generate a :Destroy() call, which will do the necessary resources cleaning, handles cleaning, etc... Windows generates for some objects the WM_DESTROY message, and now we call :Destroy() there automatically. Change all your :Release() calls to :End() calls. We apologize for the inconveniences and possible bugs you may get cause this, but we are convince this way will be much better and easy to understand from now on. Now, we may use :End() for ending any kind of object in FiveWin. * Modifications and enhancements: TGet class has been modified to automatically update ::nPos DATA. Also, :SetPos() method has been modified. * Incremental searches in browses: There is a demo of building incremental searches. See SAMPLES\BUSSINES\Customer.prg * New printing capabilities: Beta-Testers of version 1.7 liked so much FW reports that they requested that power for any print-out, and it is done! Use: PRINT ... PREVIEW ... ENDPRINT This means that you want to preview that printing job! Remember to include Preview.dll to access the resources used there. Try it! It is cool! From inside the preview you may step pages forward and backwards and you may print just any page you want. It is necessary that the SET TEMP= directory has been declared in autoexec.bat to send there the temporary files. * Enhancement: Error.log. When a error ocurrs we automatically generate Error.log, as this will be very helpfull to track your users run-time mistakes and problems. We have enhanced the information we produce there, and we will like very much if you report us what kind of extra information you will like to find there. * Modifications and enhancement: Main TWindow:HandleEvent() has been redesign to only call METHODs from inside it, this has two main direct benefits: HandleEvent() is really now Object Oriented, so you may easily inherit and redefine it and, also, this will let us in short to port it to C language. As HandleEvent() is one of the METHODs more often called, this will increase execution speed very much. We want FiveWin to be extremelly fast and small !!! * SOMETHING REALLY GREAT !!! We have coded Window:HandleEvent() all in C code. We were sure we were going to have better speed but... this is quite incredible !!! Try your applications again now! Uhhhhhh! What a really nice speed ! FiveWin is now extremelly fast !!! And we are working to make it faster and faster! Still we have to do the same in TDialog and TControl... so we are going to be much faster !!! * Going for more speed: We have written a 286 version of Objects.LIB and now has been placed inside FiveWin !!! Much better! We are preparing a new 386 version which will be added soon! * Bug: Class TWorkArea:ReCall() has been corrected. Now it is ok! Thanks very much to Harry Vantassell who is really helping us sending many comments and enhancements. Thanks a lot Harry! * Once more we really want to thank all our friends who are really helping us to go ahead. Five project is for all of us! Thanks so much, Thanks to our excelent distributors who are taking care of us like ours big brothers and excelent friends. Really thanks to: * John Stolte - Hey, John, you are really good! * Miguel Oliveira - our big friend against 'coyotes' * Max Bressel - An excelent expert and friend! * Benito Martinez - A superb manager to make Five a reality! * Gerassimus - Our Greece great friend * Franco Scannapieco - A great friend in Italy * Julio, Ariel, and many, many others... And more and more people who are taking the Five Project with the same illusion as we do. All of you are the energy that fills our engines! Thanks! * Enhancement: We have developed a new function ASend() which speed up very much the process of sending the same message to an array of objects -now we use it in TDialog:Init()- It avoids evaluating a code block and it is really fast! We want to speed up the Dialog Boxes now as much as possible, specially those that uses many, many controls (remember Windows API has a limit of 255 controls by Dialog Box! ) * Ok, we did it: Now TWindow, TDialog and TControl :HandleEvent() METHODs are written in C language. Execution speed has been increased very much. Now you have a very good reason to keep your loved 386! And as the whole system is getting more and more stable we plan to keep porting big parts to C language to increase speed and reduce size... * File Manager Drop-Files management! Now you may easily perform actions when receiving dropped files from Window File Manager. See TestDrop.prg and TestDrp2.prg samples. You could never imagine this may be so easy! * Enhancement: All FiveWin Msg...() functions, have been modified to automatically convert any kind of data into a string. So, now, when you want to display a Msg with a date, numeric, logical, etc... don't worry for converting it into a string. Let's be as easy and simple as possible! !short: FiveWin 1.6 e  FiveWin 1.6 e ============= * Bug corrected: We were not initializing ::oFont in MdiFrame and MdiClient. This bug only appeared when trying to place a Bitmap on the oWndClient DATA of a MdiFrame window. * Enhancement: The constructor method ::New() of the Class TPrinter now support creating the object without showing the typicall Print dialog Box. So, it is possible to start a print work without showing that dialog box. See PRINT.CH for new syntax added. * Missing: Clause MESSAGE was missing on ComboBox! It has been corrected. Thanks Garry! * TIcon::SetName() was not working properly. Check now TestIco.prg and it will work fine! * Enhancement: PIXEL clause was missing at @ ... LISTBOX ... FIELDS. Now it is ok. * New method ::Enable() and ::Disable() for RadMenu objects. They work on every Radio contained in the RadMenu object. * Bug corrected: ComboBoxes when losing focus where not updating properly its ::nAt data. * New CodeBlock DATA for Dialog Boxes: ::bStart. This CodeBlock if exists will be evaluated after the first time the Dialog Box is painted. Here you have a great chance to start executing some processes that can not be issued from the ON INIT clause, because at that time the Dialog Box is not already visible !!! See the source code of MsgMeter.prg to see an example of use. * New user interface Message function: MsgMeter(). This function shows a Modal Dialog Box which has a meter and a cancel button. This is the perfect funtion for building indexes, searches, etc... You have to supply this function a CodeBlock that will be executed as soon as the message appears on the screen: MsgMeter( bAction, cMessage, cTitle ) bAction is a CodeBlock which receives the following parameters: bAction ==> { | oMeter, oText, oDlg, lEnd | ; MyFunction( oMeter, oText, oDlg, @lEnd ) } oMeter is the Meter object, so you can change its ::nTotal represented value and also you can ::Set() it new values. Don't forget to call SysRefresh() when you change its value to give Windows some time to stabilize (Clipper runs faster than Windows!!!). oText is the SAY object, so you can change its contents asn many times as you want. oDlg is the Dialog Box itself, do what you want with it! And lEnd is a variable by reference which will change as soon as the user press cancel. The source code of MsgMeter() is supplied in \SOURCE\FUNCTION\MsgMeter.prg feel free to study and modify it if you need to. * Bug corrected: VALID clause in Non-modal Dialog Boxes were being tested many times, when returning .f.. Now it is ok. * Enhancement: New Clause OF for Fonts creation: Many of you inform us that the same font on diferent printers returned different sizes. Now you can easily avoid this problem: PRINT oPrn NAME "MyDoc" DEFINE FONT oFont NAME "Arial" SIZE 0, -20 OF oPrn ... This will automatically create a specific font of -20 points for THAT specific printer !!! * Bug corrected: Bitmaps with automatic scroll were not working when only one scrollbar (vertical or horizontal) were shown. Now it is working ok! * TBrowse::lEditCol() method is ready !!! Now you can edit Browse cells on the fly! Syntax: oBrw:lEditCol( nCol, @uVar, cPicture, bValid, nClrFore, nClrBack ) Parameters: nCol The column of the browse to be edited uVar A variable passed by reference. Remember to use @Var cPicture The picture for the Get bValid the get validation nClrFore, The colors of the Get, by default we use Browse colors nClrBack Return: .t. or .f. if the Get was completed or Esc was pressed The new value for uVar gets automatically stored (this is why you have to use it by reference) in uVar. If the user cancel the operation, uVar again will have the same original value before editing. Example: local cName := "Hello" if oBrw:lEditCol( 2, @cName,,; { || MsgInfo( "Hello" ), .t. } ) * Bug corrected: SAYs with fonts produced _blinking_ due to a repaint of its container. In TWindow::SetFont we removed the :Refresh() call. Corrected! If you want the new font to appear inmeadiately after changing it, then :Refresh() it. * Bug corrected: when pressing the "." or "," in a numeric GET with ( i.e.) PICTURE "999.99", the position of the cursor and the visible result was not properly updated. Now it is ok! * Enhancement: New resizing capability automatically available from Browses. Now you can click on a browse column border and resize the column just draging with the mouse. Really usefull! Try it! * New! New! New!!! The incredible FiveWin Report Engine is working!!! Thanks very much to our friend and excelent programmer Ignacio Ortiz de Zu¤iga who did a super job! The FiveWin Report Engine has a powerfull xBase syntax -all based on true Objects- which lets produce very easily reports very, very sophisticated. In just two minutes of having a look at its syntax you will learn how to use them. In fact... you already know how to use them! (the magic of FiveWin and OOPS!) See TestRpt(x).prg demos for a complete review! Your FiveWin applications will produce incredible reports with a minimum effort by your side! * bug corrected: We were loosing Windows resource-memory. It was a quite hidden bug but now it is 100% ok. We could not solve this before because we did not find any way to inspect it. Now it is working perfect! * Warning, warning, warning !!! We have changed some parameters order in the SAY.prg Class. If you are using SAYs objects directly you may have troubles! Please check that your parameters (only for those of you who uses :New() and :Redefine() directly). Now we have very powerfull features in SAY objects: CENTERED, RIGHT, BORDER, SHADED, BOX, RAISED * WHEN clause it is working!!! Thanks very much to Jose Gabriel Escobedo for helping us enhancing FiveWin syntax. Gracias Jose. Warning: Mouse driven enviroments as Windows do not allow to execute code in WHEN clauses. WHEN _only_ controls if a control must be shown disabled or enabled. Do not perform any other tasks there !!! Two new methods added: TWindow():AEvalWhen() It is automatically called to :Enable() .or. :Disable() controls when the window or dialog is being activated. TControl():ForNext() It evals the WHEN clause of the next or previous control to get focus, and disable or enable it acording to its WHEN logic result. One new DATA added in TWindow() class: TWindow():nLastKey It keeps the value of the latest keyboard navigation value pressed. * New DBMS classes and Data dictionaries: Thanks very much to Jose Mariano Rodriguez. Some of them are still under development, but it is an excelent approach to modern DBMS for those of you who are interested in data dictionaries for application development. Thanks Jose! * TRtfFile Class enhancements: Thanks to Manolo from I2 for these new RTF supported features. See RtfFile.prg for details. Thanks Manuel! * Warning: We have detected that Clipper DbCreate() does not close (at least in Windows) the handle of the file that creates. This means that in some circunstances where you create many new files, you may don't have enough availables file handles. The solution to this is to call DbClose() or DbCloseAll() which does close the just created new DBF handle. !short: FiveWin 1.6 d  FiveWin 1.6 d ============= * Bug corrected: numeric GET correctly updates now when loosing focus. * Bug corrected: moving left or right in numeric gets now properly updates cursor position. * Bug corrected: We were not properly controlling Bad Dates on a date GET. Now it is working ok! See TestDat2.prg sample. * Enhancement: Now we you finish typing in a GET -i.e.: when you finish typing a date- the focus automatically jumps to the next control. Like in Clipper MsDos! See TestDat2.prg sample. * Enhancement: Now it is possible to set the message ::cMsg of any control so when the mouse moves over the control the message bar of the container window of the control will show on its message bar (if defined) the control message. This is very usefull to let the user identify the functionality of all the differents elements of the screen just moving the mouse over them. See IDE.exe for a good sample. The message of the control also gets automatically selected when the control gets the focus. So the message stored in the data ::cMsg of a control will be shown when the mouse moves over it and also when the control gets focused. !short: FiveWin 1.6 c  FiveWin 1.6 c ============= * Bug corrected: When pressing the up or down arrows on the ScrollBar of a ListBox a Clipper error was generated. Now it is Ok! Thanks Garry & thanks Manuel Pino! See TestLbx.prg for a sample. * TestPop.prg sample has been corrected, now it is working properly. nRow, nCol coordinates were mixed, Thanks John. * Popup menus may be created now also from resources. This is a feature Windows does not offer, but FiveWin yes! Now you can easily store Popup Menus in resources. See TestPop2.prg for a sample. * Enhanced behavior: Ctrl-F4 and Ctrl-F6 keystrokes are properly working now on MdiChilds Windows !!! * Today we got an incredible hidden bug! When were adjust the ButtonBar we were changing its zorder !!! My God! Now it is over and remember it for the future: always use SWP_NOZORDER when calling SetWindowPos(), you will sleep much better! * New MESSAGE clause added to all controls! Now you may specify message information for every GET, CHECKBOX, LISTBOX, etc... Remember that for using this capability you have you have to specify which window is the owner of the Dialog Box: // OF oWnd let us show the messages at oWnd DEFINE DIALOG oDlg RESOURCE "Clients" OF oWnd ... REDEFINE GET ... ... MESSAGE "Whatever..." * TextMetrics in Dialog Boxes has been corrected! Thanks Derk and Miguel! Now, the dimensions of a Dialog Box and Windows dont change if you change the screen mode. * New clause CENTERED added to SET MESSAGE OF oWnd TO ... Thanks Edmundo !!! SET MESSAGE OF oWnd TO "Whatever..." CENTERED * Hot, hot, hot!!! We have a new DataBase Class that lets you manage DataBase as Objects. You may access the Fields as DATA of the DataBase Object: USE MyDbf DATABASE oDbf // Automatically builted from the Alias // We automatically inherit a new Class // from TDataBase and we automatically // instanciate an Object! @ nRow, nCol GET oDbf:Name OF oWnd We access the fields as DATA ! So there is no need to declare an keep local variables! The information of the DataBase is automatically managed through a buffer ! So this is the perfect way to access DataBases in NetWorks! Try them ! See DBF01.prg. FiveWin will follow this system more and more in the future. * New method :Update() added in Class TWindow. :Update() checks which of its controls need to be :Refresh()ed. This is extremelly usefull to avoid declaring controls Object references in Dialog Boxes: We usually did: local oName REDEFINE GET oName VAR cName ID ... OF ... Now we can simply do: REDEFINE GET cName ID ... OF ... UPDATE Later, when we want to repaint these controls, we just have to do: oDlg:Update() and only the UPDATE controls will be :Refresh()ed. Resuming: :Update() method is a selective :Refresh() that only works on some controls (those which have been declared with UPDATE clause). It is a very simple system ! That let us reduce a lot of code. Try this powerfull feature with the new DataBase Class and you will avoid a lot of writting code in your programs!!! Review the sample DBF01.prg and you will see how easy it is !!! We will follow this techniques more and more in the future! * New method :Set3DLook() added to Controls. Now you can make 3D look any control no matter if they are placed on a Dialog Box (in that case it gets 3D automatically if you did SET 3DLOOK ON). * Bug corrected: We were not default initializing control's :nId before calling -internally- ::DefControl(). Now it is ok! This only affected people who create Dialog Boxes from source code -You all should use Borland's Resource Workshop! and resources - * Enhancement: Now it is possible to :End() a Window from a floating PopupMenu! Thanks Miguel Oliveira. It was quite sofisticated but... we did it! See TestPop2.prg for a sample. * REDEFINE SAY clause has been enhanced to use both VAR | PROMPT, also you may specify FONT clause and the Say object gets automatically related with the shown value (we create a bSETGET codeblock!) , so changing the value and doing :Refresh() is ok to redisplay the SAY. * See MMedia.bat and MMedia files for an incredible MultiMedia demo completelly builted with FiveWin. -Configure your in screen in 800x600 to test it better- Thanks Santi for this excelent FiveWin demo! We are MultiMedia 100% ! * New method added to TWindow base Class, ::Iconize() automatically iconizes a Window. Also a new method has been added to MDIFrame Windows, ::IconizeAll() which ::Iconize() all MDIChild Windows. Also a new default option has been added to standard MDI menu: "&Iconize All" which executes ::IconizeAll() method. * New method added to Menu Class, ::AddMdi(), automatically creates the standard MDI popup to control MDI Child windows from a MDI enviroment. See TestRpt1.prg to see how easy and powerfull is this new method! !short: FiveWin 1.6 b  FiveWin 1.6 b ============= * New bMMoved data added to base Class TWindow. Now we can defined actions to performed when the mouse is moved: oWnd:bMMoved = { | nRow, nCol, nKeyFlags | ... } * Dialogs ON INIT Clause is now working. When and Init clauses were incorrectly managed. WHEN shoud avoid Dialog Execution and INIT, now, properly initializes if defined. Thanks Satiago Perez! * We have added control to Windows WM_QUERYENDSESSION, that is, the message Windows sends to check if we allow to finish Windows execution. When we receive this message we try to :End() the window or the DialogBox. If successfully then we allow Windows to End(). Try this: DEFINE WINDOW oWnd FROM 1, 1 TO 10, 50 TITLE "You can not end me!" ACTIVATE WINDOW oWnd ; VALID MsgYesNo( "Do we let Windows end ?" ) Execute it and try to End Windows! * ON [ LEFT ] DBLCLICK clause added to standard ListBoxes! It was missing. * ADJUST clause on ButtonBitmaps was missing! Now it is ok. * The Windows Help designer at the IDE is working! Now you may easily create Windows Help files without having to use any word processor! Extremely easy to build documentation for applications! The Norton Guides generation support will be added pretty soon. * Now to refresh a SAY on screen you may just change the associated variable value and then do :Refresh() to the SAY Object. We have added this behavior to standarize it with the rest of Controls we manage. Also, it is possible to especify VAR or PROMPT, as now we will reflect automatically -when :Refresh()ing- the new values of the VARiable. * We already have SET KEYs !!! like in MsDos !!! My God! How easy was it to implement it and how blind we were !!! Enjoy SET KEY power !!! Look at TestKeys.prg example. * The debugger is working !!! Just compile with /b and... uhhhhhhh!!! We have modified BUILD.BAT to easily debug a program, just do: BUILD MyProg /b The whole debugger has been written using FiveWin !!! We are going to provide all the debugger source code so you will be able to customize the debugger to your own needs ! * The Windows Help files generator is working from the IDE !!! Try it! You will be able to write HLP files in a matter of minutes... !!! You need the utility HC.EXE or HC31.EXE to generate the HLPs from inside the IDE. Look at your Borland\bin directories or at Microsoft. You may even place bitmaps in your HLPs very easily. * The Dialog Box designer from inside the IDE is almost ready. Start testing it, and see how quicly FiveWin generates source code !!! Now we must add VALID, etc... capabilities. We are working on it. * A new expression Builder is almost ready. Review Indexes from the IDE. To build an expression just do: cGetExpression( [ cOldExpression ] [, cTitle ] ) with expression-syntax checking and the ability to review all workareas fields, variables, ... * New method :SetFore() for Bitmaps Objects. This Method forces the Bitmap to implement its own palette, so its image gets properly -with its colors- displayed. See FwRes.prg for an example. * What is the next ? We go for documentation... yes, very soon, as quickly as we can. And meanwhile we are preparing something really hot: Drag&Drop FiveWin own interface. Visual Programming is nothing for what you are going to see very soon... The next step in CASE technologies is about to arrive... stay tuned! * We have been reducing the .CH files trying to avoid Clipper 5.01 memory overbooked problem when compiling. Sorry for this. We were using version 5.2 and we forgot about 5.01 problems. If you get this problem try to remove unnecessary CH and, if you can, use Clipper 5.2 ! * We want to thank all the people who is helping us. From all countries people is providing very important help to develop FiveWin. An incredible Reporting engine is about to be added coming from Madrid -thanks Ignacio!-, a superb-Browse is near to be ready coming from USA -thanks Kevin!-, an incredible Data-Driven-Dictionary is beeing builted -thanks J. Mariano!-, the power to read and write RCs from FiveWin is coming from Netherlands -thanks Derk!- Thanks Alan Ashendorf for his support, his ideas and experience. Thanks all of you for putting your heart on this project! !short: FiveWin 1.6  FiveWin 1.6 =========== * New RecAdd() method for TWBrowse. Adds a new record to the Alias where the TWBrowse was created. RecAdd() evals a codeblock placed at the instvar :bAdd. Change that codeblock to suit your particular needs for adding records from inside the Browse. * New UpStable() method for TWBrowse. This avoid the typicall Clipper Browse bug when seeking to an above item in the Browse. Call :UpStable() to properly stabilize browses in those situations. * Bug fixed: TWindow:Move() method was not updating the Window coors! Now it is working fine. * Bug fixed: ListBox created from source code were not properly initializing its items. Now it is ok. A new Method added: TListBox:Default() which initializes items from source code and form resources also. * We are removing the 3D effects we implemented in previous versions of FiveWin. Much better to use CTL3D.DLL so we will move easily to next Windows 4 - named Chicago. * New INDEXED FILTERS for Browses !!! Now you can use Indexed Filters, wich are extremely fast- with Browses. This means, you may especify a selection to be only shown on the Browse: @ ..., ... LISTBOX ... BROWSE ... ... SELECT FOR [ TO ] cField is the name of the Index Key field. FiveWin will do a SEEK based on cField on the current INDEX. The SEEKed expression is and the Browse will show from that value up to the next change of the Index Key or if especified. Before ACTIVATING the Dialog where the Browse control is Shown, you MUST SEEK the expression to properly place the RecNo of the DataBase. See FwBrow.prg for a complete demo of the new powerfull Clause!!! Also a new method :SetFilter() has been implemented in Browses, letting you change the indexed filter on the fly!!! Extremely powerfull! * Bug fixed: INI file is working fine now! Sorry, we forgot about it. See the new IDE.prg for a complete example about how to manage them. Extremely easy! * Fonts for Browses! Now you may specify any font to be used by the Browse. Uhhhh! Really elegant! * VALID for Windows: We are implementing VALIDations for :End() ing Windows. MDI Child already support them. Very, very usefull when you have to close an area before ending the Window. * We are almost ready for Trees! in FiveWin! Like the ones you may see at Chicago or at OS2 ! Now you can review the information like a 'tree': opening and closing the tree extensions. Trees are implemented on Clipper Linked Lists (yes, like C ones!). We are going to inherit from TWBrowse. * 24/04/94: Objects 3.0 has been added to FiveWin. Now FiveWin is much faster , less stack consuming and has a _lot_ of new features. We will cover in the documentation all the new aspects of Objects 3.0 engine! * New Clause 3D for ButtonBars. Now you can have the same look as Borland's ButtonBars. Try it with BUTTONSIZE clause also, to make them larger! * CursorHand() now let show the nice WinHelp Hand Cursor! It is not necessary to load any DLL as we create the cursor inside FiveWin.lib !!! * Also try CursorCatch() * SetDate( nDay, nMonth, nYear ) new function to change System Date from Windows. Example: SetDate( 25, 11, 1982 ) --> returns .t. if success * Bug fixed in xPad...() functions. Now we use as default Chr(32) instead of 32. * Bug fixed in Popup Menus: They worked fine but they did not process actions. Thanks Miguel! * cGetFile() have been enhanced! Now you may use all these ways: cGetFile( "*.dbf", "Select a DataBase" ) or cGetFile( "Clipper DataBase (*.dbf) | *.dbf |" + ; "Paradox DataBase (*.db) | *.db |" + ; "ODBC DataBase (*.odb) | *.odb", "Select a DataBase" ) In this last example you may specify a third parameter to indicate in which kind of file you want to start: cGetFile( "Clipper DataBase (*.dbf) | *.dbf |" + ; "Paradox DataBase (*.db) | *.db |" + ; "ODBC DataBase (*.odb) | *.odb",; "Select a DataBase", 2 ) // Starts with Paradox * Colors standarization: We are using for GETs now the standard colors at Windows. You may select any color -from @ or from REDEFINE- on GETs -normal GETs and multiline GETs-. Thanks to Jon Kilburn! * We have implemented COLOR clause in all Windows and almost all controls. Also, now it is possible to use COLOR , the standard color strings format: ... COLOR "W+/B" See Color Management at the documentation NG file. * Warning, warning, warning: We have been checking the new Borland's C++ 4.0 BWCC.DLL and be aware that we have found some problems with colors in controls. It seems the new BWCC.DLL does not work properly, or at least in the same manner as in the previous version. We needed one full day work to find this bug!!! Be aware of the BWCC.DLL you use !!! * ChooseColor() has been changed. Now it returns the nRGBColor we provide it in case the user selects cancel. * Bug fixed: ::BeginPaint() was not initializing ::nPaintCount. Now it is Ok! * VALID clause added to Windows. Try TestEnd.prg. Now we can decide if allow to :End() a Window. * VALID clause working also in MDI Windows! The main MDI Frame Window will request its MDI Childs to VALID before ending :End() them. * We are controlling Palettes!!! When a bitmap gets focus also set its palette. All is done automatically! * :SelFont() method has been enhanced. Now we automatically detect previous font used by the Object, and also we select the color the user chooses. * Focus management changed: Now we have :SetFocus(), :GotFocus() and :LostFocus() methods. To give the focus to a control just do: oCtrl:SetFocus() * Automatic Cursors management for all Windows and controls. Now you can assign a nice mouse cursor to be automatically selected when the mouse is over your control or window. See TestCurs.prg * Bug corrected: We were duplicating ComboBox items when initializing. This was already solved in ListBox Class but it was missing in ComboBox. Sorry! * ODBC is working: Yes! See TestODBC.prg for a full working demo. In previous versions we had the bug ODBC only manages LONG handles! God! Now it is going super! We have been testing it with the xBase ODBC driver provided with Borland's Visual Solutions Pack. Please, if you develop some ODBC examples send some to us. Thanks! * Communications are working! See TestComm.prg for a full working version. We would like to add ZModem support to FiveWin. If you please know about some freeware zmodem code please let us know! Thanks! * New Methods: :Hide() and Show() . They have been implemented at TWindow base Class, so all Objects which classes inherits from TWindow may use them! Hide() hides an Object and Show() shows the Object . * New methods: :Save() for TGet and TMultiGet Class. They updates the Clipper character related variable with the screen control text. !short: FiveWin 1.5  FiveWin 1.5 =========== * Reset() method added to TComboBox Class -it was missing!- It resets the contents of a ComboBox and also empties the associated array. * TRadMenu:Refresh() method added. Also, TRadio:lIsChecked() method added. * Automatic defaults values for TRadMenu -to 1- and for TCheckBox -to .f.-. This avoid crashing the system when the user forgets to properly initialize variables. * New PIXEL clause now added to ScrollBars. We are testing this Clause to be soon implemented to all controls. * New scrolling methods for Bitmaps!!! Really nice! You may Scroll a bitmap in the four directions inside its own area. ::ScrollUp(), ::ScrollDown(), ::ScrollLeft(), ::ScrollRight() You may review now bitmaps bigger than their visible area !!! * All the above -Scrolling Bitmaps- it is automatically! executed when doing a @ ..., ... BITMAP ... SCROLL... It is extremely easy! * Bug fixed: Missing correct initialization when doing @ ...,... SCROLLBAR. Now everything goes fine! * New INLINE clause added in OBJECTS.CH. INLINE Clause gets converted into a BLOCK clause but it is much more easier to manage. We are preparing FiveWin for the new OBJECTS 3.0 engine will be included in next version of FiveWin. We will replace BLOCK clauses into INLINE -better xBase!- * More capabilities: Max number of INSTVARS -DATA- now up to 100! Thanks Miguel! If someone needs more, please say. -Those enhancements have been done inside OBJECTS engine modules- If you are using OBJECTS also for your Clipper DOS Classes, you just need DATA.OBJ from inside FiveWin. Take it using LIB.EXE FiveWin * Data,, * ADJUST clause for Bitmaps! Now, it is possible to make a Bitmap adjust its picture to its own visible area! @ nRow, nCol BITMAP oBmp ... ADJUST ... or just doing: oBmp:lStretch = .t. oBmp:Refresh() or oBmp:lStretch = .f. oBmp:Refresh() to restore it to its normal state! * Bug correction: in Browses ON THUMBPOS did not activate ON CHANGE clause. Now it works correctly! !short: FiveWin 1.5 b  FiveWin 1.5 b ============= * DOUBLES numbers params added to CallDll() and DLL.ch. Thanks Miguel! * New BUTTONSIZE clause for BUTTONBARs: Now it is possible to define the desired width and height of the Buttons of the ButtonBar when creating the ButtonBar. DEFINE BUTTONBAR oBar BUTTONSIZE 80, 40 OF oWnd Also, they have been enhanced to support 256 colors! and the ability to adjust automatically its size to the whole area of the button: DEFINE BUTTON OF oBar ... ADJUST * We are already using intensively the OOPS clause INLINE. It is very fast and very nice xBase! * Bug fixed: Method TTimer:DeActivate(). Now it is ok. Thanks Javier Blasco! * New Pixel param added to TWindow:Say() method: oWnd:Say( nRow, nCol, cText, nClrText, nClrBack, oFont, lPixel ) If lPixel is .t. FiveWin uses pixels instead of characters. !short: FiveWin 1.4  FiveWin 1.4 =========== * New: PullDown Menu from resources !!! And also, MenuItems bitmaps from resources. * Bug: cCtrl2Chr() admits now any length (always less than 64Ks). This was detected when doing MemoEdits from source code with char variables bigger than 200 characters: @ nRow, nCol GET cText DIALOG oDlg MULTILINE * Bug: We detect when compiling with /b and avoid errors. We are working on the debugger for Windows. * WndCenter() now accepts two parameteres: 1. The hWnd of the Window to be centered. 2. The hWnd of the Parent Window. GetDesktopWindow By default. A new method added to TWindow: Center( oWnd ) * Clause ON CHANGE / ON CLICK added to RadioButtons! * SET RESOURCES now admits as many DLLs as we need. They automatically get freed when application ends. We may select an active RESOURCES DLL doing SET RESOURCES TO ... -previously opened DLL-. * New clause for Scrollbars: ON THUMBPOS YourAction( nPos ) This event is generated when the user moves the Scrollbar Thumb and places it into a new position. We automatically supply nPos parameter wich is the ScrollBar Bar in Range new nPosition. It is responsability of you to let the scrollbar updates its thumb: REDEFINE SCROLLBAR oScrollBar ... ... ON THUMBPOS ( DbSkip( nPos - RecNo() ),; // To move through DBF oScrollBar:SetPos( nPos ) ) // We let the ScrollBar // updates its pos If you don't clearly understand what means nPos, try this: ON THUMBPOS MsgInfo( Str( nPos ) ) * New and incredible powerfull print methods!!! : :Print( oPrint, nRow, nCol, nScale ) // Print any Window on printer oPrn :HardCopy( nScale ) // Makes a hardcopy of any Window, Dialog, Control, // Bitmap, etc... to printer They admit a nScale factor! to set the desire size we want! -try FwBorl.prg and press Print button on Clients Dialog Box! Really hot! * New Clause ON CLICK / ON CHANGE for Browses. * New Clauses ON [ LEFT ] CLICK and ON RIGHT CLICK for Bitmaps! Three parameters are automatically supplied: nRow, nCol, nKeyFlags when executing the action you provide for those events. ON CLICK MsgInfo( Str( nRow ) + ";" + Str( nCol ) + ";" + ; Str( nKeyFlags ) )