' ARRAY OF COMPONENTS for Rapid-Q by William Yu
'
' Here's a way to create an array of components, however, it's really
' tricky, and quite nasty.  You will have to process your own messages,
' which are sent to your form, so assign Form.WndProc to some function.
' Some common API functions that you'll need if you try this are:
'
' MoveWindow, SetWindowText, CloseWindow, etc...
'
' You'll definitely need a good API reference/tutorial if you don't know
' what messages get posted.

$TYPECHECK ON

$DEFINE HWND INTEGER

CONST WS_EX_CLIENTEDGE = &H200       ' Just some of the many API constants
CONST WS_CHILD = &H40000000
CONST WS_VISIBLE = &H10000000
CONST WS_BORDER = &H800000
CONST ES_LEFT = 0
CONST ES_AUTOHSCROLL = &H80

CONST WM_COMMAND = &H111

'** Some Button Notification Codes **

CONST BN_CLICKED = 0
CONST BN_PAINT = 1
CONST BN_HILITE = 2           '** Pushed   **
CONST BN_UNHILITE = 3         '** UnPushed **
CONST BM_DOUBLECLICKED = 4    '** There's more... **

CONST IDM_CLEAR = 1


DECLARE FUNCTION CreateWindowEx LIB "USER32" ALIAS "CreateWindowExA" _
                 (ExStyle&, ClassName$, WindowName$, Style&, X&, Y&, _
                  Width&, Height&, WndParent&, hMenu&, hInstance&, Param&) AS LONG

DECLARE FUNCTION GetModuleHandle LIB "KERNEL32" ALIAS "GetModuleHandleA" _
                 (ModuleName AS STRING) AS LONG

DECLARE FUNCTION SetWindowText LIB "USER32" ALIAS "SetWindowTextA" _
                 (Hwnd AS INTEGER, Text AS STRING) AS LONG

DECLARE SUB FormWndProc (Handle AS INTEGER, uMsg AS LONG, wParam AS LONG, lParam AS LONG)

DIM Form AS QForm
    Form.Center

DIM EditHandle(10) AS HWND
DIM ButtonHandle(10) AS HWND
DIM I AS INTEGER

FOR I = 1 TO 5
  EditHandle(I) = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "Edit"+STR$(I), _
                      WS_CHILD OR WS_VISIBLE OR WS_BORDER OR ES_LEFT OR ES_AUTOHSCROLL, _
                      10,I*27,200,25, Form.Handle, 5+I, GetModuleHandle("WINEX.EXE"), 0)
  ButtonHandle(I) = CreateWindowEx(WS_EX_CLIENTEDGE, "Button", "Clear "+STR$(I), _
                      WS_CHILD OR WS_VISIBLE, _
                      210,I*27,80,25, Form.Handle, I, GetModuleHandle("WINEX.EXE"), 0)
                                                '- ^ Button ID, make sure this is unique
NEXT I

Form.Caption = "Creating Windows"
Form.WndProc = FormWndProc
Form.ShowModal


SUB FormWndProc (Handle AS INTEGER, uMsg AS DWORD, wParam AS LONG, lParam AS LONG)
  IF uMsg = WM_COMMAND THEN
    IF lParam = 0 THEN
      IF (wParam AND &HFF) = IDM_CLEAR THEN
        SetWindowText EditHandle(wParam SHR 8), ""
      END IF
    ELSE
      SELECT CASE (wParam AND &HFFFF)
        CASE IS = 1 AND (wParam SHR 16) = BN_CLICKED  '-- Button 1 clicked
            SendMessage(Handle, WM_COMMAND, &H0100 OR IDM_CLEAR, 0)
        CASE IS = 2 AND (wParam SHR 16) = BN_CLICKED  '-- Button 2 clicked
            SendMessage(Handle, WM_COMMAND, &H0200 OR IDM_CLEAR, 0)
        CASE IS = 3 AND (wParam SHR 16) = BN_CLICKED  '-- Button 3 clicked
            SendMessage(Handle, WM_COMMAND, &H0300 OR IDM_CLEAR, 0)
        CASE IS = 4 AND (wParam SHR 16) = BN_CLICKED  '-- Button 4 clicked
            SendMessage(Handle, WM_COMMAND, &H0400 OR IDM_CLEAR, 0)
        CASE IS = 5 AND (wParam SHR 16) = BN_CLICKED  '-- Button 5 clicked
            SendMessage(Handle, WM_COMMAND, &H0500 OR IDM_CLEAR, 0)
      END SELECT
    END IF
  END IF
END SUB
