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)
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
'------------------------------------------------------------------------------