' 'Class desription: ' !short:Browse class structure: Class Browse: ~~~~~~~~~~~~~~ It serves as key-precessing by view/edit of structured data (arrays or database files) with help of standard clipper class TBrowse. Two ways of displaying of data table are introduced: 1.Browse = classical form of displaying. 2.Form = only one table row is displayed, with all data put one under other. Common use: ~~~~~~~~~~~~ LOCAL OBJECT Br OF Browse Br:Init(...) //or Br:GoodInit(...) Br:AddBlock(...) //could be repeated or could be Br:AddGet(...) ... Methods AddBlock() and AddGet() could be mixed and repeated, or instvar variables of this object can be changed (i.g.Br:CanSwap:=false). You don't take care for displaying, editation because the parent class Task methods do the work for us. If you need to produce the displayer of structured data, and you can't use the classes ABrowse or DBrowse, you can as superset of this class write your own displayer. Source code of class Browse is in C_Browse.prg !seealso: c_task.ngo:Task c_window.ngo:Window c_box.ngo:Box c_abrows.ngo:ABrowse c_dbrows.ngo:DBrowse c_color.ngo:Color ob_class.ngo:"Class hierarchy" !short:~~~~~~~~~~~~~~~~~~~~~~~~ !short:create class Browse from Task !short: export: !short: var MoreRecords //true ^BBrowse:MoreRecords^N: private: logical Internal variable for Browse and View used for correct displaying of help text obtained by F1 key. !short: var MaskFeature //false ^BBrowse:MaskFeature^N: public:logical Abstract variable used for indication of creation of the object from the class Mask (or its descendats). !short: var CanShowSkip //false ^BBrowse:CanShowSkip^N: public: logical If true, after each skip command is in the dialog line displayed information about searching for next record (usefull with filter switched on for long search for next record) !short: var CanEdit //true ^BBrowse:CanEdit^N: public: logical Enables - disables editation of data displayed with this object. !short: var CanAppend //true ^BBrowse:CanAppend^N: public: logical Enables - disables appending or deleting of a line of displayed table. If CanEdit is false no change of the table is allowed and instvar variable CanAppend has no sense. !short: var CanSwap //true ^BBrowse:CanSwap^N: public: logical Enables / disables Browse - Form switching. !short: var CanSkip //true ^BBrowse:CanSkip^N: public: logical Only in Form display, enables - disables next or previous table line skipping with PgDn/PgUp key. !short: var FormActive //false ^BBrowse:FormActive^N: public: logical If display is switched to Form the instvar variable is true. The display mode (Form/Browse) of the object can be initialised by assigning of logical value to this variable. !short: var CanMoveCursor //true ^BBrowse:CanMoveCursor^N: public: logical If true, the finishing of editation moves cursor in the direction in which we entered the edited field. Otherwise is cursor moved to right. (if is it possible) !short: var Direction //K_RIGHT ^BBrowse:Direction^N: public: numeric Variable for saving the last cursor key pressed before entering edited field. After leaving this field cursor is moved to direction after this variable. !short: var QuickEdit //true ^BBrowse:QuickEdit^N: public: logical When starting the editation in Browse mode is this variable true, direct entering the field is enabled, if false the editation of the field is possible after pressing the Enter key. !short: var SetConfirm //Set(_SET_CONFIRM) ^BBrowse:SetConfirm^N: public: logical Saves local value of clipper switch SET CONFIRM... for this object. Diferent objects can have diferent values of this switch. !short: var AddMsg //"" ^BBrowse:AddMsg^N: public: character Text string which is appended to dialog line when this window is active. !short: var InsBlock //{|o|nil} ^BBrowse:InsBlock^N: public: code_block Code block (as parameter by activation recieves self object), serving for adding next line to table edited by this object.If CanAppen is false, this code block is not activated, otherwise it is activated by pressing the Ins key in Browse mode. Form mode has no possibility for appending or deleting of the line from edited table. !short: var DelBlock //{|o|nil} ^BBrowse:DelBlock^N: public: code_block The same as InsBlock, but serves for deleting the line from the table, activated by pressing the Del key. !short: var PreSkip //nil public: code_block If not nil, is processed for each skip. !short: var PostSkip //nil public: code_block If not nil, is precessed after each skip. !short: var InfoBlock //{|o|nil} ^BBrowse:InfoBlock^N: public: code_block This code block is processed when object is waiting for key pressing. As a parameter recieves self object. !short: var TestVRecord //{|o,g|true} ^BTestVRecord(Brovse,Get)^N:public: code_block: return true Tests if variable which is manipulated by the Get object is not a virtual record in database file. (i.e.RecNo()<=LastRec()). It has no sense to edit virtual record due to lose of any changes after finishing of such editation. !short: var GetList //{} ^BBrowse:GetList^N: private: array Array of clippper get objects for editation of table fields. Each field has its own get object. !short: var DoGetList //{} ^BBrowse:DoGetList^N: private: array Array of code blocks, which with get objects from Getlist array serve for edit of table fields. Each field ha sits own (indenpendent) code block. !short: var DelGet //{} ^BBrowse:DelGet^N: private: array User can exclude not interesting fields from the view. These are transferred from instvar variable Getlist to instvar variable (array) DelGet. In the same time are code blocks transferred from DoGetlist to DelDoGet. !short: var DelDoGet //{} ^BBrowse:DelDoGet^N: private: array As DelGet, serves for saving of code blocks of instvar variable DoGetList, when user excludes some fields from the view of the table. !short: var Tb //nil ^BBrowse:Tb^N: public: clipper_object This Clipper object manipulates with edited or viewed table. Must be used as instvar, because the Oclip-library don't allow to inherit from the original clipper classes. !short: var Freeze //0 ^BBrowse:Freeze^N: public: numeric Contains number of fields of the table which must be locked on left side of the window. The lock is valid for Form mode too, but there it appears as locking of form rows from the upper side of the window. !short: var FormTop //1 ^BBrowse:FormTop^N: public: numeric Contains field number in Form mode which should be displayed as first line in Form window. !short: var Form //(object of Window) ^BBrowse:Form^N: private: object_of_window Serves as Form mode window. !short: var SetUp //false ^BBrowse:SetUp^N: private: logical Before first processing of method Process() of this class is necessary to finish the initialisation of clipper object TBrowse, if it is done the instvar variable Setup is true. It is because the clipper class TBrowse has no Copy() method for returning of identical copy of self object. !short: method New=BrowseNew //o:New() --> self ^BBrowse:New()^N: public: return self Fills object with default initialising values. !short: method Init=BrowseInit //o:Init(Name,R,C,Rs,Cs,Clr,Shd) --> true ^BBrowse:Init(Name,R,C,Rs,Cs,Clr,Shadow)^N: public: return true Object is initialised, when method is finished the Tb object (of TBrowse class) is still empty. The parameters are passed till to the class Box method Init(). For detailed description see the class Box. !short: method GoodInit=BrowseGoodInit //o:GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shd) --> true ^BBrowse:GoodInit(Name,R,C,Rs,Cs,CurSize,Clr,Shadow)^N: public: return true It is the same as Browse:Init(..) but by placing of the window on the screen is used the principe ^UGoodInit^N defined in parent class Box. The parameters are the same as in the class Box. !short: method AddBlock=BrowseAddBlock //o:AddBlock(LongNm,ShortNm,VarNm,Block,DoGet,Pict,When,Valid) --> true ^BBrowse:AddBlock(LongName,ShortName,VarName,Block,DoGet,Picture,When,Valid)^N: public: return true Next column of the table is appended to this object. During the editation is the record virtuality not tested i.e. database record can be edited even if RecNo()>LastRec(). Parameter description ~~~~~~~~~~~~~~~~~~~~~ ^ULongName^N: character: default is ShortName It is name of column used in Form mode. ^UShortName^N: character: default is "" It is name of column used in Browse mode. ^UVarName^N: character: default is ShortName It is name of edited variable, or the name of database field and will be saved as information to clipper Get objet created in this method and saved to array DoGet. It is because clipper get object used for editation should know the name of the edited variable. ^UBlock^N: code_block: no default It is code block of get/set type, you can create by clipper functions FieldBlock(), FieldWBlock(), MemVarBlock() or by own piece of program. ^UDoGet^N: code_block: default is virtual_method_Browse:DoGet() It is code block which with help of Get object edits a variable (database field) in current table column. ^UPicture^N: character: default is "" It is display mask for display mode of current column. ^UWhen^N: code_block: default is {||true} It is code block, evaluated before entering the editation of current column, if it is false the editation is skipped. Could be used for computed fields of table or read-only columns. ^UValid^N: code_block: default is {||true} It is code block, evaluated after finishing of editation of current column. His job is to evaluate if the new entered value is valid, in this case returns true, otherwise false. !short: method AddGet=BrowseAddGet //o:AddGet(Get,DoGet) --> true ^BBrowse:AddGet(Get,DoGet)^N: public: return true Adds new column to this object. Parameter description: ~~~~~~~~~~~~~~~~~~~~~~ ^UGet^N: clipper_Get_objekt: no default Is used for variable input and the also for saving of new value to variable which refers to table column (of course to table row). Pay attention to Cargo variable of this object (Get:Cargo) which should content a array with following data: 1. cLongName = name used in Form mode 2. cShortName = name used in Browse mode 3. cAlias = Alias database name if it is a database field (or "") 4. zero (0) = internal (for saving Col() cursor coordinate) Example: Get:Cargo:={"Employee name","Name","DbfEmp",0} ^UDoGet^N: code_block: default is virtual_method_Browse:DoGet() It is code block which with help of Get object edits a variable (database field) in current table column. !short: method PostInit=BrowsePostInit //o:PostInit() --> true ^BBrowse:PostInit()^N: private: return true It is used for calculating of actual window size in Form mode. !short: method DoGet=BrowseDoGet //o:DoGet() --> true ^BBrowse:DoGet()^N: private: return true It is used for one field editation in Browse mode. The Form mode is written as indenpendent static function BrowseDoForm() for speed reasons. !short: method VPaint=BrowseVPaint //o:VPaint() --> true ^BBrowse:VPaint()^N: private: return true Paints window content with use of RefreshAll() method to clipper object Tb of TBrowse class. Tb object is the instvar variable of Tb object of Browse class. !short: method SwapForm=BrowseSwapForm //o:SwapForm() --> true ^BBrowse:SwapForm()^N: public: return true Browse - Form mode switching. !short: method VProcess=BrowseVProcess //o:VProcess() --> true ^BBrowse:VProcess()^N: private: return true The table editation. !short: method Process=BrowseProcess //o:Process() --> true ^BBrowse:Process()^N: public: return true The parrent method (Task) is changed for use of PostInit() method in the Browse class. !short: method DoForm=BrowseDoForm //o:DoForm() --> true ^BBrowse:DoForm()^N: private: return true It is VProcess() (i.e. key-processing) for Form mode. !short: method DoBrowse=BrowseDoBrowse //o:DoBrowse() --> true ^BBrowse:DoBrowse()^N: private: return true It is VProcess() (i.e. key-processing) for Browse mode. !short: method FormPaint=BrowseFormPaint //o:FormPaint() --> true ^BBrowse:FormPaint()^N: public: return true It is VirtualPaint method (doing the job in current window) for Form mode (::FormActive==true) of Browse class object. !short: method MaskPaint=BrowseMaskPaint //o:MaskPaint() --> true ^BBrowse:MaskPaint()^N: public: return true Abstract method used for class Mask objects (redefined in class Mask). !short: endclass