' 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)


CREATE Form AS QFORM
    Caption = "Form"
    top=10
    Width = 500 :    Height = 500
''    OnShow=FormOnShow
    center
   CREATE Panel AS QPanel
Left = 260         
Top = 15
Height = 99         
TabOrder = 1         
'Font.Color =clRed    
END CREATE
END CREATE


DIM EditHandle(10) AS HWND
DIM ButtonHandle(10) AS HWND
DIM I AS INTEGER

FOR I = 1 TO 1
  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, Panel.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, Panel.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
