• Welcome to Powerbasic Museum 2020-B.
 

News:

Forum in repository mode. No new members allowed.

Main Menu

A SORT of PROBLEM

Started by Robert Sarrazin, January 19, 2008, 11:11:33 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Robert Sarrazin

This small program,  ask HOW to resolved the problem.
In this demo name make sure you see the problem.
I want to sort array 2 or 3 element. ???


#COMPILE EXE
#DIM ALL

#INCLUDE "WIN32API.INC"

%IDD_DIALOG1   =  101
%IDC_LISTBOX1  = 1001
%IDC_COMBOBOX1 = 1002   '*
%IDC_LISTBOX2  = 1003
%IDC_BUTTON1   = 1004
%IDC_BUTTON2   = 1005
%IDC_BUTTON3   = 1006
%IDC_LABEL1    = 1007   '*
%IDC_BUTTON4   = 1008

GLOBAL cons() AS STRING
GLOBAL x AS LONG

DECLARE CALLBACK FUNCTION ShowDIALOG1Proc()
DECLARE FUNCTION SampleListBox(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, BYVAL _
    lCount AS LONG) AS LONG
DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG

FUNCTION PBMAIN()
    REDIM cons(4,1)
    cons(0,0) = "Tom"
    cons(0,1) = "Cruise"
    cons(1,0) = "Jerry"
    cons(1,1) = "Lewis"
    cons(2,0) = "Elvis"
    cons(2,1) = "Presley"
    cons(3,0) = "Julia"
    cons(3,1) = "Roberts"
    cons(4,0) = "Dean"
    cons(4,1) = "Martin"

    ShowDIALOG1 %HWND_DESKTOP

END FUNCTION

CALLBACK FUNCTION ShowDIALOG1Proc()

    SELECT CASE AS LONG CBMSG
        CASE %WM_INITDIALOG
            ' Initialization handler

        CASE %WM_NCACTIVATE
            STATIC hWndSaveFocus AS DWORD
            IF ISFALSE CBWPARAM THEN
                ' Save control focus
                hWndSaveFocus = GetFocus()
            ELSEIF hWndSaveFocus THEN
                ' Restore control focus
                SetFocus(hWndSaveFocus)
                hWndSaveFocus = 0
            END IF

        CASE %WM_COMMAND
            ' Process control notifications
            SELECT CASE AS LONG CBCTL
               
                CASE %IDC_BUTTON1
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
                        cons(0,0) = "Tom"
                        cons(0,1) = "Cruise"
                        cons(1,0) = "Jerry"
                        cons(1,1) = "Lewis"
                        cons(2,0) = "Elvis"
                        cons(2,1) = "Presley"
                        cons(3,0) = "Julia"
                        cons(3,1) = "Roberts"
                        cons(4,0) = "Dean"
                        cons(4,1) = "Martin"
                        x=0
                        WHILE x < 5
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x,0)
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons(x,1)
                            x=x+1
                        WEND
                      END IF

                CASE %IDC_BUTTON2
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
                        ' what I try ---------------------------
                        ARRAY SORT  cons(0,0)
                        ' not work well
                        x=0
                        WHILE x < 5
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x,0)
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons(x,1)
                            x=x+1
                        WEND
                      END IF
                     
                CASE %IDC_BUTTON3
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
                        ' what I try ---------------------------
                        ARRAY SORT cons(0,1)
                        '  sort colum 2 ok
                        x=0
                        WHILE x < 5
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x,0)
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons(x,1)
                            x=x+1
                        WEND
                      END IF
               
                 CASE %IDC_BUTTON4
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
                        ' what I try ---------------------------
                        ARRAY SORT cons(0,1)
                        ARRAY SORT cons(0,0) FOR 1 + 4
                        '  sort colum 2 ok and colum 1 ok but WORK
                        ' perfectly but the result....
                        ' I tell you I try a Lot of possibility
                        x=0
                        WHILE x < 5
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x,0)
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons(x,1)
                            x=x+1
                        WEND
                      END IF

            END SELECT
    END SELECT
END FUNCTION

FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRslt AS LONG
    LOCAL hDlg  AS DWORD
    DIALOG NEW hParent, "Dialog1", 70, 70, 201, 99, %WS_POPUP OR %WS_BORDER _
        OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR _
        %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _
        %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT _
        OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
    CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX1, , 10, 5, 60, 70, %WS_CHILD OR _
        %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %LBS_NOTIFY, _
        %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
        %WS_EX_RIGHTSCROLLBAR
    CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX2, , 80, 5, 60, 70, %WS_CHILD OR _
        %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %LBS_NOTIFY, _
        %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
        %WS_EX_RIGHTSCROLLBAR
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON1, "No Sort", 148, 5, 50, 14
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON2, "TRY-1", 148, 30, 50, 14
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON3, "TRY-2", 148, 55, 50, 14
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON4, "TRY-3", 148, 80, 50, 14

    x=0
    WHILE x < 5
        LISTBOX ADD hDlg, %IDC_LISTBOX1, cons(x,0)
        LISTBOX ADD hDlg, %IDC_LISTBOX2, cons(x,1)
        x=x+1
    WEND
    DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt


    FUNCTION = lRslt
END FUNCTION


Noting to complex but a solution will be BIG help.

P.S. Remember I'm new in PB.

Thanks for your time.  8)

José Roca

#1
 
When sorting a multi-dimensional array, the array is treated as a single-dimension array containing all of the elements of the multi-dimensional array, in linear column-major order.

For what you want to achieve, you need to use two arrays and use ARRAY SORT in combination with TAGARRAY:


#PBFORMS CREATED V1.51

#COMPILE EXE
#DIM ALL

'------------------------------------------------------------------------------
'   ** Includes **
'------------------------------------------------------------------------------
#PBFORMS BEGIN INCLUDES
#IF NOT %DEF(%WINAPI)
    #INCLUDE "WIN32API.INC"
#ENDIF
#PBFORMS END INCLUDES
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Constants **
'------------------------------------------------------------------------------
#PBFORMS BEGIN CONSTANTS
%IDD_DIALOG1   =  101
%IDC_LISTBOX1  = 1001
%IDC_COMBOBOX1 = 1002   '*
%IDC_LISTBOX2  = 1003
%IDC_BUTTON1   = 1004
%IDC_BUTTON2   = 1005
%IDC_BUTTON3   = 1006
%IDC_LABEL1    = 1007   '*
%IDC_BUTTON4   = 1008
#PBFORMS END CONSTANTS
'------------------------------------------------------------------------------
GLOBAL cons() AS STRING
GLOBAL cons2() AS STRING
GLOBAL x AS LONG
'------------------------------------------------------------------------------
'   ** Declarations **
'------------------------------------------------------------------------------
DECLARE CALLBACK FUNCTION ShowDIALOG1Proc()
DECLARE FUNCTION SampleListBox(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, BYVAL _
    lCount AS LONG) AS LONG
DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
#PBFORMS DECLARATIONS
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Main Application Entry Point **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()

    REDIM cons(4)
    REDIM cons2(4)
    cons(0) = "Tom"
    cons2(0) = "Cruise"
    cons(1) = "Jerry"
    cons2(1) = "Lewis"
    cons(2) = "Elvis"
    cons2(2) = "Presley"
    cons(3) = "Julia"
    cons2(3) = "Roberts"
    cons(4) = "Dean"
    cons2(4) = "Martin"

    ShowDIALOG1 %HWND_DESKTOP

END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ShowDIALOG1Proc()

    SELECT CASE AS LONG CBMSG
        CASE %WM_INITDIALOG
            ' Initialization handler

        CASE %WM_NCACTIVATE
            STATIC hWndSaveFocus AS DWORD
            IF ISFALSE CBWPARAM THEN
                ' Save control focus
                hWndSaveFocus = GetFocus()
            ELSEIF hWndSaveFocus THEN
                ' Restore control focus
                SetFocus(hWndSaveFocus)
                hWndSaveFocus = 0
            END IF

        CASE %WM_COMMAND
            ' Process control notifications
            SELECT CASE AS LONG CBCTL
               
                CASE %IDC_BUTTON1
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
                        cons(0) = "Tom"
                        cons2(0) = "Cruise"
                        cons(1) = "Jerry"
                        cons2(1) = "Lewis"
                        cons(2) = "Elvis"
                        cons2(2) = "Presley"
                        cons(3) = "Julia"
                        cons2(3) = "Roberts"
                        cons(4) = "Dean"
                        cons2(4) = "Martin"
                        x=0
                        WHILE x < 5
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x)
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons2(x)
                            x=x+1
                        WEND
                      END IF

                CASE %IDC_BUTTON2
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
                        ARRAY SORT  cons(0), TAGARRAY cons2()
                        x=0
                        WHILE x < 5
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x)
                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons2(x)
                            x=x+1
                        WEND
                      END IF
                     
'                CASE %IDC_BUTTON3
'                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
'                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
'                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
'                        ' what I try ---------------------------
'                        ARRAY SORT cons(0,1)
'                        '  sort colum 2 ok
'                        x=0
'                        WHILE x < 5
'                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x,0)
'                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons(x,1)
'                            x=x+1
'                        WEND
'                      END IF
               
'                 CASE %IDC_BUTTON4
'                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
'                        LISTBOX RESET CBHNDL, %IDC_LISTBOX1
'                        LISTBOX RESET CBHNDL, %IDC_LISTBOX2
'                        ' what I try ---------------------------
'                        ARRAY SORT cons(0,1)
'                        ARRAY SORT cons(0,0) FOR 1 + 4
'                        '  sort colum 2 ok and colum 1 ok but WORK
'                        ' perfectly but the result....
'                        ' I tell you I try a Lot of possibility
'                        x=0
'                        WHILE x < 5
'                            LISTBOX ADD CBHNDL, %IDC_LISTBOX1, cons(x,0)
'                            LISTBOX ADD CBHNDL, %IDC_LISTBOX2, cons(x,1)
'                            x=x+1
'                        WEND
'                      END IF

            END SELECT
    END SELECT
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Sample Code **
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRslt AS LONG

#PBFORMS BEGIN DIALOG %IDD_DIALOG1->->
    LOCAL hDlg  AS DWORD

    DIALOG NEW hParent, "Dialog1", 70, 70, 201, 99, %WS_POPUP OR %WS_BORDER _
        OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR _
        %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _
        %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT _
        OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
    CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX1, , 10, 5, 60, 70, %WS_CHILD OR _
        %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %LBS_NOTIFY, _
        %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
        %WS_EX_RIGHTSCROLLBAR
    CONTROL ADD LISTBOX, hDlg, %IDC_LISTBOX2, , 80, 5, 60, 70, %WS_CHILD OR _
        %WS_VISIBLE OR %WS_TABSTOP OR %WS_VSCROLL OR %LBS_NOTIFY, _
        %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
        %WS_EX_RIGHTSCROLLBAR
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON1, "No Sort", 148, 5, 50, 14
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON2, "TRY-1", 148, 30, 50, 14
'    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON3, "TRY-2", 148, 55, 50, 14
'    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON4, "TRY-3", 148, 80, 50, 14
#PBFORMS END DIALOG

    x=0
    WHILE x < 5
        LISTBOX ADD hDlg, %IDC_LISTBOX1, cons(x)
        LISTBOX ADD hDlg, %IDC_LISTBOX2, cons2(x)
        x=x+1
    WEND
    DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt

#PBFORMS BEGIN CLEANUP %IDD_DIALOG1
#PBFORMS END CLEANUP

    FUNCTION = lRslt
END FUNCTION
'------------------------------------------------------------------------------