/* dyn100buttons.p
   Progress OpenEdge ABL (GUI) - dynamically create 100 buttons, each with a different BMP.
*/

DEFINE VARIABLE hFrame     AS HANDLE     NO-UNDO.
DEFINE VARIABLE hBtn       AS HANDLE     NO-UNDO.
DEFINE VARIABLE i          AS INTEGER    NO-UNDO.
DEFINE VARIABLE r          AS INTEGER    NO-UNDO.
DEFINE VARIABLE c          AS INTEGER    NO-UNDO.
DEFINE VARIABLE btnW       AS DECIMAL    NO-UNDO INITIAL 12.  /* width in chars */
DEFINE VARIABLE btnH       AS DECIMAL    NO-UNDO INITIAL 2.8. /* height in chars */
DEFINE VARIABLE padX       AS DECIMAL    NO-UNDO INITIAL 0.3.
DEFINE VARIABLE padY       AS DECIMAL    NO-UNDO INITIAL 0.2.
DEFINE VARIABLE cols       AS INTEGER    NO-UNDO INITIAL 10.  /* 10x10 = 100 */
DEFINE VARIABLE imgDir     AS CHARACTER  NO-UNDO.
DEFINE VARIABLE imgPath    AS CHARACTER  NO-UNDO.
DEFINE VARIABLE imgOk      AS LOGICAL    NO-UNDO.
define var w2 as handle.

define frame fr.
def var nr as integer view-as fill-in.
def button btn.
enable btn nr with frame fr.


def var st as int.
on choose of btn do:
    assign nr.
    st = etime(yes).
    
    create window w2.
    
    w2:width-chars = 150.
    w2:height-chars = 50.
    
    /* Display and wait */
    
    /* Point this to your folder containing img001.bmp ... img100.bmp */
    ASSIGN imgDir = "images\".

    /* Create a host frame (in the current window). */
    CREATE FRAME hFrame
      ASSIGN
        PARENT       = w2
        NAME         = "frButtons"
        ROW          = 1
        COL          = 1
        WIDTH-CHARS  = 140
        HEIGHT-CHARS = 40
        VISIBLE      = TRUE
        SCROLLABLE   = FALSE.
    
    hFrame:MOVE-TO-TOP().
    
    /* Create 100 buttons dynamically */
    DO i = 1 TO nr:
    
      /* Grid position */
      ASSIGN
        r = TRUNCATE((i - 1) / cols, 0)
        c = (i - 1) MOD cols.
    
      /* Build image filename */
      ASSIGN imgPath = imgDir + SUBSTITUTE("img&1.bmp", STRING(i, "999")).
    
      /* Create the button */
      CREATE BUTTON hBtn
        ASSIGN
          FRAME        = hFrame
          NAME         = SUBSTITUTE("btn&1", i)
          LABEL        = ""                   /* keep label empty; show only image */
          ROW          = 1 + (r * (btnH + padY))
          COL          = 1 + (c * (btnW + padX))
          WIDTH-CHARS  = btnW
          HEIGHT-CHARS = btnH
          VISIBLE      = TRUE
          SENSITIVE    = TRUE.
    
      /* Load a unique BMP into the button */
      imgOk = hBtn:LOAD-IMAGE(imgPath).
    
      /* If the image can't be loaded, show a fallback label */
      IF NOT imgOk THEN DO:
        hBtn:LABEL = SUBSTITUTE("&1", i).
        /* Optional: make it visually obvious it failed */
        /* hBtn:BGCOLOR = 12. */ /* depends on your color table */
      END.
    
    END.
    
    enable all with frame hframe in window w2.
    
    message nr etime.
    WAIT-FOR 'i' OF w2.
    delete object w2.
end.

WAIT-FOR CLOSE OF CURRENT-WINDOW.