Table field behavior

Bill bill at bluewatermaritime.com
Fri May 20 09:54:55 EDT 2005


The problem with using grouped fields instead of a table field is then you
lose the ease of using Trevor DeVore's libDatabase to move the data in and
out of your database without too much thought (all this talk about
appletalk, smalltalk etc -- I want the programming language NoThink so that
I can program without  thinking).


On 5/20/05 9:41 AM, "Lynch, Jonathan" <bnz2 at cdc.gov> wrote:

> I find the current table fields just too clunky.
> 
> I am creating a table object based on grouped fields. After a recent fix of a
> few bugs, it seems to work quite well, and allows for much better control.
> 
> The advantage to this approach is that it allowed me to do things like allow
> for a simple scheme for moving columns, inserting columns, proper tabbing,
> automatic vertical scrolling, etc...
> 
> If anyone wants a copy of this object, just e-mail me, and I will be happy to
> send it to you. It work well right now - but I plan to keep modifying it and
> adding in new capabilities.
> 
> For a table that needs to hold several hundred (or even several hundred
> thousand) rows, I am thinking of creating a different design - one that holds
> the data for each row in a custom property, and creates the fields/groups from
> the appropriate custom property for each row on the fly as the user scrolls up
> or down, then destroys those fields/groups as the row dissappears from view
> when it is scrolled past.
> 
> -----Original Message-----
> From: use-revolution-bounces at lists.runrev.com
> [mailto:use-revolution-bounces at lists.runrev.com] On Behalf Of Bill
> Sent: Friday, May 20, 2005 9:27 AM
> To: How to use Revolution
> Subject: Re: Table field behavior
> 
> Wow -- can't we make this any more complicated?
> 
> Thanks a whole lot. I will put your code in right now and start in as that
> automatic scroll thing is annoying as ^(%$^%!@! (if you curse in unicode
> than no one will see).
> 
> 
> On 5/20/05 9:17 AM, "Eric Chatonet" <eric.chatonet at sosmartsoftware.com>
> wrote:
> 
>> Hello Bill,
>> 
>> I am working on a How-To stack about table fields.
>> It's not finished but here is an excerpt from this stack which might
>> help you without waiting for the release :-)
>> As you will see it, it's a little bit dry and tricky :-(
>> But fully commented :-)
>> Following scripts are placed in the card script.
>> 
>>> By default, a table has no limits: you can use the arrowkeys or the
>>> tabkey to navigate as far as you wish.
>>> Practically, you will often need to display a x*y cells table
>>> without scrollbars as a matrix where all cells are visible and let
>>> the user navigate in carousel (go from the last cell in a row to
>>> the first cell in the next row and so on) through the limits you
>>> have set.
>>> In order to set these limits, you will trigger the keyboard events
>>> within a rawKeyDown handler.
>>> Here the limits which are integers are stored as custom properties
>>> named xLimit and yLimit in the table field named "MyTable":
>>> 
>>> on rawKeyDown pKey
>>>   -- allows tabbing and arrowkeys to act in carousel
>>>   -- horizontal and vertical limits are stored in 2 custom
>>> properties (xLimit and yLimit) in the table field
>>> 
>>>   if "revCell" is in the target then
>>>     -- when editing a table field, target function returns
>>> something like: field "revCell-1,1"
>>>     if the xLimit of fld "MyTable" = "None" or the xLimit of fld
>>> "MyTable" is empty then pass rawKeyDown -- no limits
>>>     -----
>>>     switch pKey
>>>     case 65363 -- arrow key right
>>>     case 65289 -- tab key
>>>       if the cRevTable["currentxcell"] of fld "MyTable" = the
>>> xLimit of fld "MyTable" then
>>>         if the cRevTable["currentycell"] of fld "MyTable" = the
>>> yLimit of fld "MyTable" then
>>>           SelectCell "MyTable",1,1 -- the first table cell
>>>         else
>>>           SelectCell "MyTable",1,the cRevTable["currentycell"] of
>>> fld "MyTable" + 1 -- the first table cell in the next line
>>>         end if
>>>       else pass rawKeyDown
>>>       break
>>>       -----
>>>     case 65361 -- arrow key left
>>>       if the cRevTable["currentxcell"] of fld "MyTable" = 1 then
>>>         if the cRevTable["currentycell"] of fld "MyTable" <> 1 then
>>>           SelectCell "MyTable",the xLimit of fld "MyTable",the
>>> cRevTable["currentycell"] of fld "MyTable" - 1 -- 
>>>           -- the last allowed table cell in the previous line
>>>         else
>>>           SelectCell "MyTable",the xLimit of fld "MyTable",the
>>> yLimit of fld "MyTable" -- 
>>>           -- the last allowed table cell
>>>         end if
>>>       else pass rawKeyDown
>>>       break
>>>       -----
>>>     case 65364 -- arrow key down
>>>       if the cRevTable["currentycell"] of fld "MyTable" = the
>>> yLimit of fld "MyTable" then
>>>         if the cRevTable["currentxcell"] of fld "MyTable" = the
>>> xLimit of fld "MyTable" then
>>>           SelectCell "MyTable",1,1 -- the first table cell
>>>         else SelectCell "MyTable",the cRevTable["currentxcell"] of
>>> fld "MyTable" + 1,1 -- 
>>>         -- the first table cell in the next column
>>>       else pass rawKeyDown
>>>       break
>>>       -----
>>>     case 65362 -- arrow key up
>>>       if the cRevTable["currentycell"] of fld "MyTable" = 1 then
>>>         if the cRevTable["currentxcell"] of fld "MyTable" <> 1 then
>>>           SelectCell "MyTable",the cRevTable["currentxcell"] of fld
>>> "MyTable" - 1,the yLimit of fld "MyTable" -- 
>>>           -- the last allowed table cell in the previous column
>>>         else SelectCell "MyTable",the xLimit of fld "MyTable",the
>>> yLimit of fld "MyTable" -- 
>>>         -- the last allowed table cell
>>>       else pass rawKeyDown
>>>       break
>>>       -----
>>>     default
>>>       pass rawKeyDown -- lets the engine do it
>>>     end switch
>>>   else pass rawKeyDown
>>> end rawKeyDown
>>> ----------------------------------------------------------------
>>> 
>>> on SelectCell pFieldName,pColumn,pRow
>>>   -- select a cell
>>> 
>>>   -- pFieldName parameter is the short name of the table field
>>>   -- pColumn parameter is the column number (an integer)
>>>   -- pRow parameter is the row number (an integer)
>>> 
>>>   SetCurXCell pFieldName,pColumn -- 
>>>   SetCurYCell pFieldName,pRow -- 
>>>   -----
>>>   SetScroll "hScroll",the cRevTable["cellxspacing"] of fld
>>> pFieldName * (pColumn - 1),pFieldName,"Header" -- 
>>>   SetScroll "vScroll",the cRevTable["cellyspacing"] of fld
>>> pFieldName * (pRow - 1),pFieldName,"Rows" -- 
>>>   -----
>>>   click at CellLoc(pFieldName,pColumn,pRow) -- 
>>>   -----
>>>   -- to select again the current cell, you can use:
>>>   -- click at the cRevTable["currentxmouseloc"] of fld
>>> pFieldName,the cRevTable["currentymouseloc"] of fld pFieldName
>>> end SelectCell
>>> 
>>> ----------------------------------------------------------------
>>> 
>>> function CellLoc pFieldName,pColumn,pRow
>>>   -- returns the loc of any cell
>>> 
>>>   -- pFieldName parameter is the short name of the table field
>>>   -- pColumn parameter is the column number (an integer)
>>>   -- pRow parameter is the row number (an integer)
>>> 
>>>   local  
>>> tLeft,tTop,tCellxspacing,tCellyspacing,tCurrenthscroll,tCurrentvscroll
>>>   -----
>>>   put the left of fld pFieldName into tLeft
>>>   put the top of fld pFieldName into tTop
>>>   put the cRevTable["cellxspacing"] of fld pFieldName into
>>> tCellxspacing
>>>   put the cRevTable["cellyspacing"] of fld pFieldName into
>>> tCellyspacing
>>>   put the hScroll of fld pFieldName into tCurrenthscroll
>>>   put the vScroll of fld pFieldName into tCurrentvscroll
>>>   return ((pColumn - 1) * tCellxspacing) + (tCellxspacing div 2) +
>>> tLeft - tCurrenthscroll, \
>>>       ((pRow - 1) * tCellyspacing) + (tCellyspacing div 2) + tTop -
>>> tCurrentvscroll
>>> end CellLoc
>>> ----------------------------------------------------------------
>>> 
>>> on SetCurXCell pFieldName,pValue
>>>   -- updates prop in the cRevTable of the table field
>>> 
>>>   -- pFieldName parameter is the short name of the table field
>>>   -- pValue parameter is the column number (an integer)
>>> 
>>>   set the cRevTable["currentxcell"] of fld pFieldName to pValue
>>> end SetCurXCell
>>> 
>>> ----------------------------------------------------------------
>>> 
>>> on SetCurYCell pFieldName,pValue
>>>   -- updates prop in the cRevTable of the table field
>>> 
>>>   -- pFieldName parameter is the short name of the table field
>>>   -- pValue parameter is the row number (an integer)
>>> 
>>>   set the cRevTable["currentycell"] of fld pFieldName to pValue
>>> end SetCurYCell
>>> 
>>> ----------------------------------------------------------------
>>> 
>>> on SetScroll
>>>   -- sets the table field and header fields scrolls if they are any
>>>   -- the syntax is not very comprehensible since this handler can
>>> set the scroll of an unknown number of fields
>>>   -- then it refers to parameters by order/number and not by name
>>> using the do command
>>> 
>>>   lock screen
>>>   lock messages
>>>   repeat with i = 3 to the paramcount
>>>     do "put there is a fld" && param(i) && "into tFlag"
>>>     if tFlag then do "set the" && param(1) && "of fld" && param(i)
>>> && "to" && param(2)
>>>     -- param (3) to param(x) are the names of the fields
>>>   end repeat
>>>   unlock messages
>>>   unlock screen
>>> end SetScroll
>> 
>> That's all!
>> Is it enough?
>> LOL
>> 
>> Le 20 mai 05 à 14:58, Bill a écrit :
>> 
>>> The docs on table fields is rather sparse.
>>> 
>>> An example table field has six cells across. It is unlocked on Mac
>>> OSX. When
>>> you enter data and tab across to the next cell and enter data for
>>> that cell
>>> and tab it works fine until you get to the last cell then it
>>> automatically
>>> scrolls to the right (there are no scroll bars set for either
>>> vertical or
>>> horizontal). This automatic scroll to the right makes all the
>>> previously
>>> entered data not visible and is a behavior I want to prevent. I tried
>>> locking position and that didn't work.
>>> 
>>> How do I do this?
>> 
>> 
>> Best regards from Paris,
>> 
>> Eric Chatonet.
>> ----------------------------------------------------------------
>> So Smart Software
>> 
>> For institutions, companies and associations
>> Built-to-order applications: management, multimedia, internet, etc.
>> Windows, Mac OS and Linux... With the French touch
>> 
>> Plugins, tutorials and more on our website
>> ----------------------------------------------------------------
>> Web site        http://www.sosmartsoftware.com/
>> Email        eric.chatonet at sosmartsoftware.com/
>> Phone        33 (0)1 43 31 77 62
>> Mobile        33 (0)6 20 74 50 86
>> ----------------------------------------------------------------
>> 
>> _______________________________________________
>> use-revolution mailing list
>> use-revolution at lists.runrev.com
>> http://lists.runrev.com/mailman/listinfo/use-revolution
>> 
>> 
> 
>             |    |    |
>            )_)  )_)  )_)
>           )___))___))___)\
>          )____)____)_____)\\
>        _____|____|____|____\\\__
> -------\                   /--------- http://www.bluewatermaritime.com
>  ^^^^^ ^^^^^^^^^^^^^^^^^^^^^
>   ^^^^      ^^^^     ^^^    ^^
>        ^^^^      ^^^
> 
> 24 hour cell: (787) 378-6190
> fax: (787) 809-8426
> 
> Blue Water Maritime
> P.O. Box 91
> Puerto Real, PR 00740
> 
> 
> 
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> http://lists.runrev.com/mailman/listinfo/use-revolution
> 
> 
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> http://lists.runrev.com/mailman/listinfo/use-revolution
> 
> 

            |    |    |
           )_)  )_)  )_)
          )___))___))___)\
         )____)____)_____)\\
       _____|____|____|____\\\__
-------\                   /--------- http://www.bluewatermaritime.com
 ^^^^^ ^^^^^^^^^^^^^^^^^^^^^
  ^^^^      ^^^^     ^^^    ^^
       ^^^^      ^^^

24 hour cell: (787) 378-6190
fax: (787) 809-8426

Blue Water Maritime
P.O. Box 91
Puerto Real, PR 00740





More information about the use-livecode mailing list