#DEFINE fLocation SYS(2023)+'\try' #DEFINE prgfile fLocation+'\tryClassPrg.prg' #DEFINE vcxfile fLocation+'\tryClassLib.vcx' CLEAR ALL CLEAR _SCREEN.FontSize = 8 IF !DIRECTORY(fLocation) MD fLocation ENDIF columnDef = '' TEXT TO columnDef NOSHOW DEFINE CLASS hd AS header FontName = 'Microsoft Sans Serif' FontSize = 8 Alignment= 2 Caption = '' ENDDEFINE DEFINE CLASS Cl AS Column ADD OBJECT hd AS hd ENDDEFINE ENDTEXT STRTOFILE(columnDef,prgfile) IF FILE(vcxfile) ERASE vcxfile ENDIF PRIVATE sLog sLog = '' SET TEXTMERGE ON SHOW SET TEXTMERGE TO MEMVAR sLog ADDITIVE \ 1. Create a baseGrid subclass, with MemberClass column cl TRY CREATE CLASS baseGrid OF vcxfile AS Grid NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1] .MemberClassLibrary=prgfile .MemberClass="cl" .ColumnCount = 1 showProperties() ENDWITH ENDIF SaveClass() CATCH \ <<MESSAGE()>> ENDTRY \ \ 2. Now reopen the grid, and rename the column TRY MODIFY CLASS baseGrid OF vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1].columns[1] \ Column Name _SCREEN.ForeColor = 255 \\ <<.name>> .Name = 'MyNameColonna' \\ is RENAMED to <<.name>> \ Header Caption is not (none). It have a ASCII <<ASC(.controls[1].Caption)>> _SCREEN.ForeColor = 0 \ Header Name is free. _SCREEN.ForeColor = 255 .controls[1].Name = 'hdRenamed' \ I rename Header to <<.controls[1].Name>> _SCREEN.ForeColor = 0 ENDWITH showProperties() ENDIF SaveClass() CATCH \ <<MESSAGE()>> ENDTRY \ \ 3. Now TRY to reopen the grid with column renamed * next i aspect a catch, then flush text on variable SET TEXTMERGE TO TRY MODIFY CLASS baseGrid OF vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1].columns[1] \ Column Name is <<.name>> ENDWITH showProperties() ENDIF closeClass() CATCH _SCREEN.ForeColor = 255 \ <<MESSAGE()>> _SCREEN.ForeColor = 0 \ Now rollback the problem, writing on VCX Table. sLog = m.sLog; +CHR(10)+MESSAGE() ; +CHR(10)+' Now rollback the problem, writing on VCX Table.'+CHR(10)+CHR(10) USE vcxfile BROWSE NOWAIT NOMODIFY REPLACE Parent WITH STRTRAN(Parent,'MyNameColonna','Cl1') FOR ObjName='Text1' INKEY(0.5) USE ENDTRY SET TEXTMERGE TO MEMVAR sLog ADDITIVE \ \ 4. Now reopen the grid with column name rollback TRY MODIFY CLASS baseGrid OF vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1].columns[1] _SCREEN.ForeColor = 255 \ Column new Name is lost. It return to <<.name>> _SCREEN.ForeColor = 0 \ Now remove text1 column control and rename the column .removeobject(.controls[2].Name) .Name = 'MyNameColonna' _SCREEN.ForeColor = 255 \ Column new Name is <<.name>> \ Header Caption is correct to (none). \ Header Name return to correct name. _SCREEN.ForeColor = 0 ENDWITH showProperties() ENDIF SaveClass() CATCH \ <<MESSAGE()>> ENDTRY \ \ 5. Now reopen the grid with column renamed TRY MODIFY CLASS baseGrid OF vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1].columns[1] \ SubClass is reopen because Text1 parent reference is correct with the column standard name <<.name>> \ Columns have <<.ControlCount>> controls \ VFP not use renamed column, but reapply standard column name _SCREEN.ForeColor = 255 \ Then class definition is stable : \ - Column name is forced to standard name \ - Header caption is correct \ - Column have only header control. _SCREEN.ForeColor = 0 ENDWITH showProperties() ENDIF closeClass() CATCH \ <<MESSAGE()>> ENDTRY \ \ 6. Now build a subclass of this subclass, and want put a EditBox as Cell column Control TRY CREATE CLASS subBaseGrid OF vcxfile AS baseGrid FROM vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1].columns[1] _SCREEN.ForeColor = 255 \ This SubClass of BaseGrid have on Column <<.name>> <<.ControlCount>> controls ! \ Class designer have added a new <<.controls[2].Name>> control \ Header Caption is (none). _SCREEN.ForeColor = 0 \ Now remove <<.controls[2].Name>> .removeobject(.controls[2].Name) \\ and add a EditBox .addobject('Edit1','EditBox') ENDWITH showProperties() ENDIF SaveClass() CATCH \ <<MESSAGE()>> ENDTRY FOR k=1 TO 2 \ \ 7.<<k>> Now reopen the subBaseGrid TRY MODIFY CLASS subBaseGrid OF vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1].columns[1] _SCREEN.ForeColor = 255 \ Now SubClass subBaseGrid have on Column <<.name>> _SCREEN.ForeColor = 255 \\ <<.ControlCount>> controls ! \ Class designer have add another <<.controls[2].Name>> control \ Header Caption is not (none). It have a ASCII <<ASC(.controls[1].Caption)>> _SCREEN.ForeColor = 0 ENDWITH showProperties() ENDIF IF k<2 SaveClass() ELSE \ ..... \ This continue until a overflow occur. \ The error is on MemberClass loader, it see empty column on BaseGrid, \ then add a Text1, ignoring ControlCount on current subBaseClass column closeClass() ENDIF CATCH \ <<MESSAGE()>> ENDTRY NEXT \ \ 8. Now reopen baseGrid, and change Header FontName TRY MODIFY CLASS baseGrid OF vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1] \ LockColumns is set to .LockColumns = 1 _SCREEN.ForeColor = 255 \\ <<.LockColumns>> _SCREEN.ForeColor = 0 WITH .columns[1].controls[1] \ Header FontName _SCREEN.ForeColor = 255 \\ <<.FontName>> .FontName = 'Batang' \\ is set to <<.FontName>> _SCREEN.ForeColor = 0 ENDWITH ENDWITH showProperties() ENDIF SaveClass() CATCH \ <<MESSAGE()>> ENDTRY \ \ 9. Now reopen the subBaseGrid TRY MODIFY CLASS subBaseGrid OF vcxfile NOWAIT MOVE WINDOW "Class Designer" TO 2,100 IF ASELOBJ( myGrid, 1 )=1 WITH myGrid[1] \ LockColumns is _SCREEN.ForeColor = 255 \\ <<.LockColumns>> . Inheritance is not apply _SCREEN.ForeColor = 0 WITH .columns[1].controls[1] \ Header FontName is _SCREEN.ForeColor = 255 \\ <<.FontName>> . Inheritance is not apply _SCREEN.ForeColor = 0 \ Header Caption is not empty. It have a ASCII <<ASC(.Caption)>> ENDWITH ENDWITH ENDIF CATCH \ <<MESSAGE()>> ENDTRY SET TEXTMERGE TO SET TEXTMERGE OFF _CLIPTEXT =M.SLOG WAIT CLEAR *!* ERASE fLocation+'\*.*' *!* RMDIR fLocation PROCEDURE showProperties * ALINES(aTips,msg) ACTIVATE WINDOW "properties" WAIT WINDOW "Read on screen area the step messages"; +CHR(13)+"See on Properties Window class definition"; +CHR(13)+"For next step PRESS SPACE" NOWAIT NOCLEAR MOUSE CLICK AT 20,50 PIXELS WINDOW "properties" DOEVENTS FORCE ACTIVATE WINDOW "Class Designer" ENDPROC PROCEDURE saveClass \ Now save this KEYBOARD '{CTRL+W}' CLEAR PLAIN DOEVENTS FORCE ENDPROC PROCEDURE closeClass KEYBOARD '{CTRL+F4}' CLEAR PLAIN DOEVENTS FORCE ENDPROCI need uses a MemberClass Column without cell controls for put