How to Create a Mover Dialog Box

ID: Q137123

2.50 2.50a 2.50b 2.60 2.60a | 2.50 2.50a 2.50b 2.60 2.60a

WINDOWS                     | MS-DOS

The information in this article applies to:

SUMMARY

A mover dialog box is an object you can use to move items from one list object to another to make selections from available choices. FoxPro does not have a mover dialog box option to choose when making a screen, but you can use the techniques presented in this article to simulate a mover dialog box in FoxPro.

MORE INFORMATION

This example of a mover dialog box can be created once but used over and over throughout all of your applications. The GENSCRN generated code will be a procedure that accepts three parameters: cTitle, acChoices and acSelected.

When the Mover Dialog Box is run, it will determine if any choices have already been placed in the "selected list" and mark those choices as unavailable in the list of choices. As items are selected from the list of choices, they will become unavailable, unless that item is moved back.

Steps to Create Mover Dialog Box

1. Create a screen in FoxPro. On the left side of the screen, create a

   list box for the variable m.nChoice from an array called acChoices.
   This list box should only take up the left 2/5's of the screen. In the
   Valid Code Snippet, place this code:

   IF m.nChoice # 0
      IF LEFT(acChoices[m.nChoice],1) # "\"
         m.nSelected = m.nSelected + 1
         m.nSelect = m.nSelected
         acSelected[m.nSelected] = acChoices[m.nChoice]
         acChoices[m.nChoice] = "\" + acChoices[m.nChoice]
         SHOW GETS
         SHOW GET nAction, 1 ENABLED
         SHOW GET nAction, 2 ENABLED
         IF m.nSelected = 0
            SHOW GET nAction, 3 DISABLED
            SHOW GET nAction, 4 DISABLED
         ELSE
            SHOW GET nAction, 3 ENABLED
            SHOW GET nAction, 4 ENABLED
         ENDIF
      ENDIF
   ENDIF

2. On the right side of the screen, create another list box for the
   variable m.nSelect from an array called acSelected. This list box
   should only take up the right 2/5's of the screen. In the Valid Code
   Snippet, place this code:

   IF m.nSelect # 0
      IF ! EMPTY(acSelected[m.nSelect])
         m.Value = acSelected[m.nSelect]
         m.nSelected = m.nSelected - 1
         =ADEL(acSelected,m.nSelect)
         acSelected[ALEN(acSelected)] = ""
         x = ASCAN(acChoices,"\"+m.Value)
         acChoices[x] = substr(acChoices[x],2)
         SHOW GETS
         SHOW GET nAction, 1 ENABLED
         SHOW GET nAction, 2 ENABLED
         IF m.nSelected = 0
            SHOW GET nAction, 3 DISABLED
            SHOW GET nAction, 4 DISABLED
         ELSE
            SHOW GET nAction, 3 ENABLED
            SHOW GET nAction, 4 ENABLED
         ENDIF
      ENDIF
   ENDIF

3. In the middle of the screen, create a vertical, four-button push button
   set for the variable nAction. The buttons should be labeled: Select,
   Select All, Deselect, Deselect All. In the Valid Code Snippet, place
   this code:

   DO CASE
      CASE nAction = 1  && Select one
         IF m.nChoice # 0
            IF LEFT(acChoices[m.nChoice],1) # "\"
               m.nSelected = m.nSelected + 1
               m.nSelect = m.nSelected
               acSelected[m.nSelected] = acChoices[m.nChoice]
               acChoices[m.nChoice] = "\" + acChoices[m.nChoice]
               SHOW GETS
               IF m.nSelected = ALEN(acSelected)
                  SHOW GET nAction, 1 DISABLED
                  SHOW GET nAction, 2 DISABLED
               ELSE
                  SHOW GET nAction, 1 ENABLED
                  SHOW GET nAction, 2 ENABLED
               ENDIF
               SHOW GET nAction, 3 ENABLED
               SHOW GET nAction, 4 ENABLED
            ENDIF
         ENDIF
      CASE nAction = 2  && Select All
         =ACOPY(laChoices, acSelected)
         =ACOPY(laChoices, acChoices)
         FOR x = 1 to ALEN(acChoices)
            acChoices[x] = "\" + acChoices[x]
         ENDFOR
         m.nSelected = ALEN(acChoices)
         m.nSelect = 1
         m.nChoice = 1
         SHOW GETS
         SHOW GET nAction, 1 DISABLED
         SHOW GET nAction, 2 DISABLED
         SHOW GET nAction, 3 ENABLED
         SHOW GET nAction, 4 ENABLED
      CASE nAction = 3  && Deselect one
         IF m.nSelect # 0
            IF ! EMPTY(acSelected[m.nSelect])
               m.Value = acSelected[m.nSelect]
               m.nSelected = m.nSelected - 1
               =ADEL(acSelected,m.nSelect)
               acSelected[ALEN(acSelected)] = ""
               x = ASCAN(acChoices,"\"+m.Value)
               acChoices[x] = SUBSTR(acChoices[x],2)
               SHOW GETS
               SHOW GET nAction, 1 ENABLED
               SHOW GET nAction, 2 ENABLED
               IF m.nSelected = 0
                  SHOW GET nAction, 3 DISABLED
                  SHOW GET nAction, 4 DISABLED
               ELSE
                  SHOW GET nAction, 3 ENABLED
                  SHOW GET nAction, 4 ENABLED
               ENDIF
            ENDIF
         ENDIF
      CASE nAction = 4  && Deselect All
         =ACOPY(laChoices, acChoices)
         STORE "" TO acSelected
         m.nSelected = 0
         m.nSelect = 0
         m.nChoice = 0
         SHOW GETS
         SHOW GET nAction, 1 ENABLED
         SHOW GET nAction, 2 ENABLED
         SHOW GET nAction, 3 DISABLED
         SHOW GET nAction, 4 DISABLED
   ENDCASE

4. At the bottom of the screen, create a centered, horizontal, two-button
   push button set for the variable m.nResult. The buttons should be
   labeled: OK and Cancel. The "Terminate READ On Selection" check box
   should also be selected. In the Valid Code Snippet, place this code:

   IF m.nResult = 2
      =ACOPY(laChoices, acChoices)
      =ACOPY(laSelected, acSelected)
   ENDIF

5. In the Screen Setup Code Snippet, place this code:

   #SECTION1
   Parameters cTitle, acChoices, acSelected

   Private nChoices, nSelected, nChoice, nSelect, nAction, nResult, x
   STORE 0 TO nChoices, nSelected, nAction, nResult

   =ACOPY(acChoices, laChoices)
   =ACOPY(acSelected, laSelected)

   FOR x = 1 TO ALEN(acChoices)
      nChoices = nChoices + IIF(EMPTY(acChoices[x]),0,1)
      IF ASCAN(acSelected,acChoices[x]) # 0
         acChoices[x] = "\" + acChoices[x]
      ENDIF
   ENDFOR

   FOR x = 1 TO ALEN(acSelected)
      nSelected = nSelected + IIF(EMPTY(acSelected[x]),0,1)
   ENDFOR

6. In the "On Screen Entry (When)" Code Snippet, place this code:

   IF m.nSelected = 0
      SHOW GET nAction, 3 DISABLED
      SHOW GET nAction, 4 DISABLED
   ELSE
      SHOW GET nAction, 3 ENABLED
      SHOW GET nAction, 4 ENABLED
   ENDIF
   RETURN .t.

7. Under the Screen Layout dialog box, enter the screen title as &cTitle.
   and enter the screen name as Selector. Select the Position - Center
   check box so that the dialog box will always be centered on the screen.

8. Save the screen as Mover.Scx and generate the screen program. You may
   use the following as a test program:

   CLEAR
   ? "loading customer names ..."
   USE c:\fpw26\tutorial\customer
   SET FILTER TO recno()%10 = 0
   COPY TO ARRAY aChoices FIELD company
   ASORT(aChoices)
   USE
   CLEAR
   DIMENSION aSelected[ ALEN(aChoices,1) ]
   aSelected = SPACE(0)
   DO mover.spr WITH "Select Company", aChoices, aSelected
   CLEAR
   ? "You chose:"
   FOR x = 1 TO ALEN(aSelected)
      IF ! EMPTY(aSelected[x])
         ? x, aSelected[x]
      ENDIF
   ENDFOR

Additional reference words: 2.50 2.50a 2.50b 2.60 2.60a FoxWin FoxDos KBCategory: KBSubcategory: FxprgGeneral
Keywords          : kbcode FxprgGeneral 
Version           : 2.50 2.50a 2.50b 2.60 2.60a | 2.
Platform          : MS-DOS WINDOWS

Last Reviewed: May 22, 1998