Clone a combo doesn't act like expected

Hi guys…

When I clone a Combo control it doesn’t react like the original.
I can’t use LeftKey, RightKey etc., but in the original Combo it works as expected.

I tried PROP:IMM, setting explicit AlertKey-codes etc. but nothing seems to help

This is what I am trying:

  PROGRAM

  include('keycodes.clw')
  
qCombo  QUEUE
sText     CSTRING(256)
        END
  MAP

  END
Window WINDOW('Caption'),AT(,,395,224),GRAY,AUTO,FONT('Microsoft Sans Serif',8)
    BUTTON('&OK'),AT(291,201,41,14),USE(?OkButton),STD(STD:Close),DEFAULT
    BUTTON('&Cancel'),AT(333,201,42,14),USE(?CancelButton),STD(STD:Close)
    COMBO(@s20),AT(63,118,139),USE(?COMBO1),DROP(5),FROM(qCombo),FORMAT('150L(2)' & |
        '|M@S255@')
  END
lClone signed
  CODE

  loop i# = 1 to 10 
    qCombo.sText = 'This is item #' & i#
    add(qCombo)
  end
  open(window)

  lClone = clone(0, ?COMBO1)
  setPosition(lClone, 63, 180)
  lClone{PROP:Imm} = FALSE
  
  ACCEPT

  END
  close(window)

EDIT: Tried this with Clarion 10 and Clarion 11…same behaviour

I agree it behaves oddly. If you click to drop the list, then click on a row it does not contract.

I made an example that I will send to SV.

It does it via CREATE also which seems easy enough you can work around the issue. If you need to do this a lot make a CloneCombo(LONG OldFEQ, omittable[ *QUEUE FromQ ] ) procedure that does the CREATE() work so in the future you can change it to use CLONE.

  PROGRAM
  INCLUDE('KEYCODES.CLW')
  INCLUDE('CbWndPreview.INC'),ONCE  !Get from https://github.com/CarlTBarnes/WindowPreview
  MAP
ComboTest   PROCEDURE()
  END
    CODE
    ComboTest()

ComboTest   PROCEDURE()              
qCombo  QUEUE
sText     CSTRING(256)
        END
    MAP
ComboClone   PROCEDURE(LONG PropEqt)    
    END 
Window WINDOW('Combo CLONE Test WndPreview '),AT(,,395,224),CENTER,GRAY,AUTO,SYSTEM,FONT('Microsoft Sans Serif',8)
        BUTTON('Close'),AT(333,201,42,14),USE(?CancelButton),STD(STD:Close)
        COMBO(@s20),AT(60,60,140,12),USE(?COMBO1),DROP(5),FROM(qCombo),FORMAT('150L(2)|M@S255@')
        STRING('Combo'),AT(10,60)
        STRING('Clone()'),AT(10,80)
        STRING('Create()'),AT(10,100)
        PROMPT('Cloned COMBO behaves oddly. After pick cannot Left/Right arrow. Also does not contra' & |
                'ct on click'),AT(1,125,384,34),USE(?PROMPT1)
    END
lCombo  signed
lClone  signed
lCreate signed
CbWndPrv CBWndPreviewClass
  CODE

  loop i# = 1 to 10 
    qCombo.sText = 'This is item #' & i#
    add(qCombo)
  end
  open(window)
  lCombo = ?COMBO1
  lClone = clone(0, ?COMBO1)
  setPosition(lClone, 60, 80)   ! ; lClone{PROP:Imm} = FALSE
  
  lCreate=CREATE(0,CREATE:dropcombo) !CREATE:Combo)
  lCreate{PROP:From}=qCombo
  setPosition(lCreate, 60, 100,140,12)
  ComboClone(PROP:Drop)
  ComboClone(PROP:Text) !Picture
  ComboClone(PROP:Format)
  UNHIDE(lCreate) 
 
  CbWndPrv.Init(2)  
  ACCEPT

  END
  close(window)
ComboClone   PROCEDURE(LONG PropEqt)
    CODE
    lCreate{PropEqt}=lCombo{PropEqt}
2 Likes

Hi Carl.

Thank you…that works as expected!
I 've already reported it to SV (Tracker #43094).

After I posted I kept thinking about how to code a Clone Procedure. I use CHOOSE() to store a List of PROPs to copy so it is easy to add one because thinking of 1 seems to makes me think of 2 more.

ComboClone   PROCEDURE(LONG CloneFEQ,LONG NewX, LONG NewY, <*QUEUE FromQueue>)!,LONG,PROC
NewFEQ  LONG,AUTO
X       USHORT,AUTO
PropX   LONG,AUTO
    CODE     
    NewFEQ=CREATE(0,CREATE:dropcombo) 
    IF ~NewFEQ THEN RETURN 0.
    SETPOSITION(NewFEQ,NewX,NewY) 
    IF ~OMITTED(FromQueue) THEN
        NewFEQ{PROP:From}=FromQueue            !From(queue)
    ELSE
        NewFEQ{PROP:From}=CloneFEQ{PROP:From}  !From('Mr|Ms|Mrs')
    END
    LOOP X=1 TO 99     !Below PROPs to Clone from Original
        PropX=CHOOSE(X,PROP:Drop,PROP:DropWidth,PROP:AlwaysDrop, PROP:Text,PROP:Format, |
                       PROP:Width,PROP:Height, PROP:Disable,PROP:Skip, |
                       PROP:Hide) !<-- Hide Must be Last 
        NewFEQ{PropX}=CloneFEQ{PropX}                     
    WHILE PropX <> PROP:Hide      !<-- Hide Must be Last 
    RETURN NewFEQ

Here’s the top of the program:

  PROGRAM   !Example - Revenge of the Clones
  INCLUDE('KEYCODES.CLW')
  INCLUDE('CbWndPreview.INC'),ONCE  !Get from https://github.com/CarlTBarnes/WindowPreview
  MAP
ComboTest    PROCEDURE()
ComboClone   PROCEDURE(LONG ClonedComboFEQ ,LONG NewX, LONG NewY, <*QUEUE FromQueue>),LONG,PROC     
  END
    CODE
    ComboTest()

ComboTest   PROCEDURE()              
qCombo  QUEUE
sText     CSTRING(256)
        END
Window WINDOW('Combo CLONE Test WndPreview '),AT(,,395,224),CENTER,GRAY,AUTO,SYSTEM,FONT('Microsoft Sans Serif',8)
        COMBO(@s20),AT(60,60,140,12),USE(?COMBO1),DROP(5),FROM(qCombo),FORMAT('150L(2)|M@S255@')
        STRING('ORIGINAL'),AT(10,60)
        STRING('CLONE()'),AT(10,80)
        STRING('CREATE()'),AT(10,100)
        PROMPT('Cloned COMBO behaves oddly.<13,10>After pick from drop cannot Left/Right arrow entry.<13,10>DSrop with Mouse does not contra' & |
                'ct on pick'),AT(10,145,370,40),USE(?PROMPT1)              
        BUTTON('Cl&ose'),AT(333,201,42,14),USE(?CancelButton),STD(STD:Close),SKIP
    END
lCombo  signed
lClone  signed
lCreate signed
CbWndPrv CBWndPreviewClass
  CODE
  loop i# = 1 to 10 
    qCombo.sText = 'This is item #' & i# ; ADD(qCombo)
  end
  open(window)
  lCombo = ?COMBO1
  lClone = clone(0, ?COMBO1)
  setPosition(lClone, 60, 80)   ! ; lClone{PROP:Imm} = FALSE
  lCreate=ComboClone(?COMBO1,60,100,qCombo)
  CbWndPrv.Init(2)  
  ACCEPT
  END
  CLOSE(Window)