XBrowse online editing

User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Nageswararao,

> Still the issue of the behavior when Valid Block opens any new dialog remains

Fixed :-) These changes are required:

Code: Select all

::oEditGet:bValid := { | oGet, lRet | oGet:lValidating := .T., lRet := Eval( ::bEditValid, oGet, Self ), oGet:lValidating := .F., If( ! lRet, oGet:SetFocus(),), lRet }
...
static function EditGetLostFocus(...)
   ...
   if ( oWnd := oWndFromHwnd( hWndFocus ) ) != nil .and. ! ( oWnd == oBrw ) .and. ;
      Upper( oWnd:ClassName() ) != "TGET"  // new!!!
      oBrw:CancelEdit()
      SetFocus( hWndFocus )               
      return nil
   endif   
   ...
The above "TGET" could be extended with the allowed controls to get focus from a VALID process.
In mallorca.prg these changes are required:

Code: Select all

oBrw:aCols[1]:bEditValid   := { | oGet, oCol | Valida( oGet, oCol ) }
...
STATIC FUNCTION Valida( oGet, oCol ) 
    
   local nVal := 0 

   if oGet:Value() > 6 
      MsgAlert( "Must be lower than 7" ) 
      if MsgGet( "New value", "Enter number between 1 and 6", @nVal ) 
         if nVal > 0 .and. nVal < 7 
            oGet:VarPut( nVal ) 
            oCol:PostEdit()
            return .T. 
          endif
      endif    
      return .F. 
    endif 

return .T.
A new mallorca.exe build:
http://www.hotshare.net/file/25998-4690817f9b.html
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Nageswararao,

This first line seems wrong:

oBrw:aCols[3]:aEditListBound:= ;
oBrw:aCols[3]:aEditListTxt := { 'AA', 'BB', 'CC', 'DD', 'EE', 'FF', 'GG', 'HH' }
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

If the data is numeric, ListBound should be { 1,2,3....}. In our case the data stored in the data ( array) is the same as display values. If we specify only litttxt the browse derives listbound with { 1,2,3 } and returns those values. Therefore what i wrote is correct and it works. Only problem is that user is not able to abandon edit and retain the original values.
Regards

G. N. Rao.
Hyderabad, India
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Nageswararao,

> Therefore what i wrote is correct and it works.

Yes, you are right. Now I see what you meant. Thanks! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

I tried the revised exe posted. It is working ok. As you said we may need to cover other usual controls used in popup helps that may be used in valid functions. ( I am working with changing my copy of txbrowse ).
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

I am trying listbox issues. I think the behaviour should be if the user clicks the mouse elsewhere, the original value should be retained. If he is navigating with keys, if he presses escape, the listbox should end and original value retained.

But :bKeyDown of listbox is not intercepting Escape key
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

I made the following changes in the ShowBtnList( nKey ) method.

Code: Select all

//   ::oEditLbx:bLostFocus := {|| ::PostEdit( aBound[ Max( 1, nAt ) ], .t. ) } // iif(::oEditLbx != nil, ::oEditLbx:End(),) } A.L. Nov 2007
   ::oEditLbx:bLostFocus := {|| ::PostEdit( eval(::bEditValue), .t. ) }
.................
                                }
/*
   ::oEditLbx:bKeyDown   := {|k| iif( k == VK_RETURN .and. nAt > 0,  xValue := aBound[ nAt ], ),;
                                 iif( k == VK_RETURN .or. k == VK_ESCAPE, ::PostEdit( xValue, .t. ), ) }
*/

   ::oEditLbx:bKeyDown   := ;
   		{|k| iif( k == VK_RETURN .and. nAt > 0, ;
   			       ::PostEdit( aBound[ nAt ], .t. ) , ;
   			       iif( k == VK_ESCAPE, ::PostEdit( eval(::bEditValue), .t. ), nil ) ) }
But escape key is not captured at all
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

I carried out the corrections. I don't what I am missing but I am getting an error

Code: Select all

Application
===========
   Path and name: C:\TESTS\Bin\MALLORCA.Exe (32 bits)
   Size: 1,437,184 bytes
   Time from start: 0 hours 0 mins 7 secs 
   Error occurred at: 12/26/07, 17:53:59
   Error description: Error BASE/1005  Class: 'NIL' has no property: NLASTKEY
   Args:
     [   1] = U   
     [   2] = N   13

Stack Calls
===========
   Called from:  => _NLASTKEY(0)
   Called from: xbrowse.prg => EDITGETKEYDOWN(4543)
   Called from: xbrowse.prg => (b)TXBRWCOLUMN:EDIT(4479)
   Called from: WINDOW.PRG => TWINDOW:KEYDOWN(0)
   Called from: CONTROL.PRG => TCONTROL:KEYDOWN(0)
   Called from: TGET.PRG => TGET:KEYDOWN(0)
   Called from:  => TWINDOW:HANDLEEVENT(0)
   Called from: CONTROL.PRG => TCONTROL:HANDLEEVENT(0)
   Called from: TGET.PRG => TGET:HANDLEEVENT(0)
   Called from: WINDOW.PRG => _FWH(0)
   Called from:  => WINRUN(0)
   Called from: WINDOW.PRG => TWINDOW:ACTIVATE(0)
   Called from: MALLORCA.PRG => MAIN(59)
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

I am still getting the above error from the application I linked. Your exe downloaded is working fine. I am wondering what is the difference.

This is the valida method I am using as advised by you

Code: Select all

STATIC FUNCTION Valida( oGet, oCol )

   local nnew  := 0
   local method := 2

   if method == 1
   	return ( oget:varget() <= 6 )

   elseif method == 2
    IF oGet:Value() > 6
       MsgAlert( "Must be lower than 7" )
       if msgget('NEW VALUE','Enter number between 1 and 6',@nnew)
          if nnew > 0 .and. nnew < 7
             oGet:varput( nnew )
//             oget:refresh()
//             oget:nLastKey := VK_RETURN
//             msginfo(oget:varget())
             oCol:PostEdit()
             return .t.
          else
             return .f.
          endif
       endif
       return .F.
    ENDIF

 elseif method == 3
    if oget:value() > 6
       oget:varput(6)
       oget:refresh()
    endif
 endif

RETURN .T.
Regards

G. N. Rao.
Hyderabad, India
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Nageswararao,

> I made the following changes in the ShowBtnList( nKey ) method.

Fixed. Required changes:

Code: Select all

METHOD ShowBtnList( nKey ) CLASS TXBrwColumn
   ...
   ::oBrw:lEditMode := .T.

return .T.

Code: Select all

METHOD CancelEdit() CLASS TXBrowse
   ...
   for nFor := 1 to nLen
        ...
        if oCol:oEditLbx != nil
           oCol:oEditLbx:End()
        endif   
   next
...
Now the click on a buttonbar and fire its action is missing, when the listbox is showing. Working on it :-)
Last edited by Antonio Linares on Thu Dec 27, 2007 9:51 am, edited 1 time in total.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

A new mallorca.exe build:
http://www.hotshare.net/file/26219-85426459f1.html

Thanks for your feedback! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Moving the listbox item with the keyboard and then escape was wrongly assigning the selected item. Fixed:

Code: Select all

METHOD ShowBtnList( nKey ) CLASS TXBrwColumn
...
   ::oEditLbx:bKeyDown   := {|k| ::oEditLbx:nLastKey := k,;  // new!
   	                             If( k == VK_RETURN .and. nAt > 0,  xValue := aBound[ nAt ], ),;
                                 If( k == VK_RETURN .or. k == VK_ESCAPE, ::PostEdit( xValue, .t. ), ) }
...

Code: Select all

METHOD KeyChar( nKey ) CLASS TXBrowse
...
      case nKey == VK_ESCAPE
              ...
           if ::lEditMode
              oCol := ::SelectedCol()  
              if oCol:oEditLbx != nil
                 oCol:oEditLbx:nLastKey = VK_ESCAPE
              endif   
              ::CancelEdit()
           endif
...
And finally in mallorca.prg:

Code: Select all

   oBrw:aCols[3]:bOnPostEdit  := { | oCol, xVal, nKey | If( nKey == VK_RETURN, aLin[ oBrw:nArrayAt, 3 ] := xVal,) } 
A new mallorca.exe build:
http://www.hotshare.net/file/26227-6326669358.html
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

Mr Antonio

I tested the latest exe posted by you. Keyboard edit of listbox is working okay. But I am not able to change the item with mouse. If I activate the listbox and click on any item, that item is not assigned.
Now the click on a buttonbar and fire its action is missing, when the listbox is showing. Working on it
It would be nice if this works. But not such a priority.

Small suggestion. You may increase the column width a little more when a button is shown in the column. Now the text is getting truncated a little.

I shall incorporate your changes in my copy and test it again.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

Guess by oversight you might have omitted the correction to be made in postedit method

Original Code

Code: Select all

      case ::nEditType == EDIT_LISTBOX
            < .... code ... >
           Eval( ::bOnPostEdit, Self, xValue, 0)
Last line should be changed to

Code: Select all

          Eval( ::bOnPostEdit, Self, xValue, ::oEditLbx:nLastKey )
Please confirm.

You may also consider why cant we use Combobox instead of Listbox? This easily covers EDIT_LISTBOX and EDIT_GET_LISTBOX cases easily
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
Posts: 8017
Joined: Sun Nov 19, 2006 5:22 am
Location: India
Contact:

Post by nageswaragunupudi »

Made these changes. My changes are untidy though

Code: Select all

method postedit ( ..... )
...
local nlastkey := 0
....

      case ::nEditType == EDIT_LISTBOX
           if ::oEditLbx != nil .and. IsWindow( ::oEditLbx:hWnd )
              nlastkey := ::oEditLbx:nlastkey
              ::oEditLbx:End()
              ::oEditLbx := nil
           endif
           if lbutton == .t.
              nLastKey := VK_RETURN
           endif
           Eval( ::bOnPostEdit, Self, xValue, nLastKey )	

Now both keyboard edit and mouse selection both assign the selected value. And Escape key retains the original value.
Regards

G. N. Rao.
Hyderabad, India
Post Reply