--------------------------------------------------------------------------------------------
                      [ENHANCED] VFP 9.0 FIX - THE DIRECTION OF THE LIST PORTION OF THE COMBOBOX CONTROL
                                 January 2024
                 --------------------------------------------------------------------------------------------
                                     CCB



1. BUG:

     In vfp9 (and vfp6, vfp7, vfp8), for the ComboBox control, after the drop-down arrow is clicked,
     the list portion is shown above or below the ComboBox control automatically,
     now we we can set the list portion is always shown above the ComboBox control,
     or the list portion is always shown below the ComboBox control.


2. CAUSE:

     There are some BUGs in the following code.


3. RESOLUTION:

     We can write some code to fix the BUG.

     Fun6d620f :: ; proc near
             push ebp                                                        ;0x006d620f :        55
             mov ebp , esp                                                   ;0x006d6210 :        8bec
             sub esp , 01Ch                                                  ;0x006d6212 :        83ec1c
             mov  ecx , dword ptr [ ebp + 12 ]                               ;0x006d6215 :        8b4d0c
             push ebx                                                        ;0x006d6218 :        53
             push esi                                                        ;0x006d6219 :        56
             mov ebx , eax                                                   ;0x006d621a :        8bd8
             call Fun4173cd                                                  ;0x006d621c :        e8ac11d4ff
             xor esi , esi                                                   ;0x006d6221 :        33f6
             cmp eax , esi                                                   ;0x006d6223 :        3bc6
             mov  dword ptr [ ebp - 8 ] , eax                                ;0x006d6225 :        8945f8
             je Label6d64a3                                                  ;0x006d6228 :        0f8475020000
             mov  ecx , dword ptr [ ebp + 12 ]                               ;0x006d622e :        8b4d0c
             xor edx , edx                                                   ;0x006d6231 :        33d2
             inc edx                                                         ;0x006d6233 :        42
             call Fun42f404                                                  ;0x006d6234 :        e8cb91d5ff
             mov  dword ptr [ ebp - 4 ] , eax                                ;0x006d6239 :        8945fc
             mov eax ,  dword ptr [ Data939528 ]                             ;0x006d623c :        a128959300
             cmp eax , 01h                                                   ;0x006d6241 :        83f801
             je Label6d626a                                                  ;0x006d6244 :        7424
             cmp eax , esi                                                   ;0x006d6246 :        3bc6
             je Label6d626a                                                  ;0x006d6248 :        7420
             push  dword ptr [ ebp + 24 ]                                    ;0x006d624a :        ff7518
             mov  eax , dword ptr [ ebp + 20 ]                               ;0x006d624d :        8b4514
             push  dword ptr [ ebp + 28 ]                                    ;0x006d6250 :        ff751c
             push  dword ptr [ ebp - 8 ]                                     ;0x006d6253 :        ff75f8
             push  dword ptr [ ebp + 16 ]                                    ;0x006d6256 :        ff7510
             push  dword ptr [ ebp + 12 ]                                    ;0x006d6259 :        ff750c
             push ebx                                                        ;0x006d625c :        53
             push  dword ptr [ ebp + 8 ]                                     ;0x006d625d :        ff7508
             call Fun6d6036                                                  ;0x006d6260 :        e8d1fdffff
             jmp Label6d64a3                                                 ;0x006d6265 :        e939020000

     Label6d626a ::
             mov  eax , dword ptr [ ebp - 4 ]                                ;0x006d626a :        8b45fc
             push edi                                                        ;0x006d626d :        57
             mov  edi , dword ptr [ ebp + 16 ]                               ;0x006d626e :        8b7d10
             call Fun41ba03                                                  ;0x006d6271 :        e88d57d4ff
             cmp eax , 0FFFFFFFFh                                            ;0x006d6276 :        83f8ff
             jne Label6d628a                                                 ;0x006d6279 :        750f
             mov  ecx , dword ptr [ ebp - 4 ]                                ;0x006d627b :        8b4dfc
             xor edx , edx                                                   ;0x006d627e :        33d2
             call Fun43de2a                                                  ;0x006d6280 :        e8a57bd6ff
             mov  eax , dword ptr [eax]                                      ;0x006d6285 :        8b00
             mov  dword ptr [ ebp + 16 ] , eax                               ;0x006d6287 :        894510

     Label6d628a ::
             mov  edi , dword ptr [ ebp - 4 ]                                ;0x006d628a :        8b7dfc
             call Fun78b845                                                  ;0x006d628d :        e8b3550b00
             cmp  dword ptr [ ebp + 24 ] , esi                               ;0x006d6292 :        397518
             jne Label6d62a2                                                 ;0x006d6295 :        750b
             xor ecx , ecx                                                   ;0x006d6297 :        33c9
             push esi                                                        ;0x006d6299 :        56
             inc ecx                                                         ;0x006d629a :        41
             xor eax , eax                                                   ;0x006d629b :        33c0
             call Fun544cfe                                                  ;0x006d629d :        e85ceae6ff

     Label6d62a2 ::
             mov  eax , dword ptr [ ebp - 4 ]                                ;0x006d62a2 :        8b45fc
             push esi                                                        ;0x006d62a5 :        56
             push esi                                                        ;0x006d62a6 :        56
             lea esi ,  dword ptr [ ebp - 28 ]                               ;0x006d62a7 :        8d75e4
             call Fun437e58                                                  ;0x006d62aa :        e8a91bd6ff
             mov  eax , dword ptr [ ebp - 16 ]                               ;0x006d62af :        8b45f0
             sub  eax , dword ptr [ ebp - 24 ]                               ;0x006d62b2 :        2b45e8
             mov  edi , dword ptr [ ebp + 16 ]                               ;0x006d62b5 :        8b7d10
             mov  dword ptr [ ebp + 12 ] , eax                               ;0x006d62b8 :        89450c
             mov  eax , dword ptr [ ebp - 20 ]                               ;0x006d62bb :        8b45ec
             sub  eax , dword ptr [ ebp - 28 ]                               ;0x006d62be :        2b45e4
             mov  dword ptr [ ebp + 28 ] , eax                               ;0x006d62c1 :        89451c
             mov  eax , dword ptr [ ebp - 4 ]                                ;0x006d62c4 :        8b45fc
             call Fun41ba03                                                  ;0x006d62c7 :        e83757d4ff
             push eax                                                        ;0x006d62cc :        50
             mov  eax , dword ptr [ ebp - 4 ]                                ;0x006d62cd :        8b45fc
             call Fun78dc34                                                  ;0x006d62d0 :        e85f790b00
             mov  esi , dword ptr [ ebp - 16 ]                               ;0x006d62d5 :        8b75f0
             sub  esi , dword ptr [ ebp - 24 ]                               ;0x006d62d8 :        2b75e8
             xor edi , edi                                                   ;0x006d62db :        33ff
             cmp  dword ptr [ ebp + 32 ] , edi                               ;0x006d62dd :        397d20
             jg Label6d62ea                                                  ;0x006d62e0 :        7f08
             mov eax ,  dword ptr [ Data94571c ]                             ;0x006d62e2 :        a11c579400
             mov  dword ptr [ ebp + 32 ] , eax                               ;0x006d62e7 :        894520

     Label6d62ea ::
             cmp  dword ptr [ ebp + 24 ] , edi                               ;0x006d62ea :        397d18
             jne Label6d62fe                                                 ;0x006d62ed :        750f
             mov  eax , dword ptr [ ebp - 8 ]                                ;0x006d62ef :        8b45f8
             mov  ecx , dword ptr [ ebp + 32 ]                               ;0x006d62f2 :        8b4d20
             cmp ecx , eax                                                   ;0x006d62f5 :        3bc8
             jnl Label6d6304                                                 ;0x006d62f7 :        7d0b
             mov  dword ptr [ ebp + 12 ] , ecx                               ;0x006d62f9 :        894d0c
             jmp Label6d6307                                                 ;0x006d62fc :        eb09

     Label6d62fe ::
             mov  eax , dword ptr [ ebp + 12 ]                               ;0x006d62fe :        8b450c
             cdq                                                             ;0x006d6301 :        99
             idiv esi                                                        ;0x006d6302 :        f7fe

     Label6d6304 ::
             mov  dword ptr [ ebp + 12 ] , eax                               ;0x006d6304 :        89450c

     Label6d6307 ::
             mov  eax , dword ptr [ ebp + 20 ]                               ;0x006d6307 :        8b4514
             mov  eax , dword ptr [ eax + 12 ]                               ;0x006d630a :        8b400c
             mov  dword ptr [ ebx + 4 ] , eax                                ;0x006d630d :        894304
             mov  eax , dword ptr [ ebp + 12 ]                               ;0x006d6310 :        8b450c
             cmp  dword ptr [ ebp - 8 ] , eax                                ;0x006d6313 :        3945f8
             je Label6d634a                                                  ;0x006d6316 :        7432
             mov  edi , dword ptr [ ebp + 16 ]                               ;0x006d6318 :        8b7d10
             mov  eax , dword ptr [ ebp - 4 ]                                ;0x006d631b :        8b45fc
             call Fun41ba03                                                  ;0x006d631e :        e8e056d4ff
             mov  ecx , dword ptr [ ebp + 12 ]                               ;0x006d6323 :        8b4d0c
             mov  dword ptr [ ebp + 24 ] , eax                               ;0x006d6326 :        894518
             mov  eax , dword ptr [ ebp - 8 ]                                ;0x006d6329 :        8b45f8
             cmp eax , ecx                                                   ;0x006d632c :        3bc1
             mov edx , eax                                                   ;0x006d632e :        8bd0
             jl Label6d6334                                                  ;0x006d6330 :        7c02
             mov edx , ecx                                                   ;0x006d6332 :        8bd1

     Label6d6334 ::
             mov edi , eax                                                   ;0x006d6334 :        8bf8
             sub edi , edx                                                   ;0x006d6336 :        2bfa
             cmp  dword ptr [ ebp + 24 ] , edi                               ;0x006d6338 :        397d18
             jl Label6d634d                                                  ;0x006d633b :        7c10
             cmp eax , ecx                                                   ;0x006d633d :        3bc1
             jnl Label6d6343                                                 ;0x006d633f :        7d02
             mov ecx , eax                                                   ;0x006d6341 :        8bc8

     Label6d6343 ::
             sub eax , ecx                                                   ;0x006d6343 :        2bc1
             mov  dword ptr [ ebp + 24 ] , eax                               ;0x006d6345 :        894518
             jmp Label6d634d                                                 ;0x006d6348 :        eb03

     Label6d634a ::
             mov  dword ptr [ ebp + 24 ] , edi                               ;0x006d634a :        897d18

     Label6d634d ::
             mov  ecx , dword ptr [ ebp + 24 ]                               ;0x006d634d :        8b4d18
             mov  edi , dword ptr [ ebp + 12 ]                               ;0x006d6350 :        8b7d0c
             mov  edx , dword ptr [ ebp - 4 ]                                ;0x006d6353 :        8b55fc
             mov  edx , dword ptr [edx]                                      ;0x006d6356 :        8b12
             lea eax ,  dword ptr [ ecx + edi ]                              ;0x006d6358 :        8d0439
             cmp  eax , dword ptr [ edx + 68 ]                               ;0x006d635b :        3b4244
             mov  dword ptr [ ebp - 12 ] , eax                               ;0x006d635e :        8945f4
             jle Label6d6368                                                 ;0x006d6361 :        7e05
             imul edi , esi                                                  ;0x006d6363 :        0faffe
             jmp Label6d6392                                                 ;0x006d6366 :        eb2a

     Label6d6368 ::
             xor edi , edi                                                   ;0x006d6368 :        33ff
             cmp ecx , eax                                                   ;0x006d636a :        3bc8
             mov  dword ptr [ ebp + 32 ] , ecx                               ;0x006d636c :        894d20
             jnl Label6d6392                                                 ;0x006d636f :        7d21

     Label6d6371 ::
             push  dword ptr [ ebp + 32 ]                                    ;0x006d6371 :        ff7520
             mov  eax , dword ptr [ ebp - 4 ]                                ;0x006d6374 :        8b45fc
             lea esi ,  dword ptr [ ebp - 28 ]                               ;0x006d6377 :        8d75e4
             call Fun78dc34                                                  ;0x006d637a :        e8b5780b00
             mov  eax , dword ptr [ ebp - 16 ]                               ;0x006d637f :        8b45f0
             sub  eax , dword ptr [ ebp - 24 ]                               ;0x006d6382 :        2b45e8
             add edi , eax                                                   ;0x006d6385 :        03f8
             inc  dword ptr [ ebp + 32 ]                                     ;0x006d6387 :        ff4520
             mov  eax , dword ptr [ ebp + 32 ]                               ;0x006d638a :        8b4520
             cmp  eax , dword ptr [ ebp - 12 ]                               ;0x006d638d :        3b45f4
             jl Label6d6371                                                  ;0x006d6390 :        7cdf

     Label6d6392 ::
             mov eax ,  dword ptr [ Data93a8b8 ]                             ;0x006d6392 :        a1b8a89300
             lea esi ,  dword ptr [ ebp - 28 ]                               ;0x006d6397 :        8d75e4
             mov  dword ptr [ ebp + 32 ] , eax                               ;0x006d639a :        894520
             call Fun425c32                                                  ;0x006d639d :        e890f8d4ff
             test eax , eax                                                  ;0x006d63a2 :        85c0
             jne Label6d63af                                                 ;0x006d63a4 :        7509
             mov  eax , dword ptr [ ebp - 24 ]                               ;0x006d63a6 :        8b45e8
             sub  eax , dword ptr [ ebp - 16 ]                               ;0x006d63a9 :        2b45f0
             add  dword ptr [ ebp + 32 ] , eax                               ;0x006d63ac :        014520

     Label6d63af ::
             mov  eax , dword ptr [ ebx + 4 ]                                ;0x006d63af :        8b4304
             mov  ecx , dword ptr [ ebp + 8 ]                                ;0x006d63b2 :        8b4d08
             add eax , edi                                                   ;0x006d63b5 :        03c7
             mov  dword ptr [ ebx + 12 ] , eax                               ;0x006d63b7 :        89430c
             mov  ecx , dword ptr [ecx]                                      ;0x006d63ba :        8b09
             mov  ecx , dword ptr [ ecx + 0A8h ]                             ;0x006d63bc :        8b89a8000000
             add ecx , eax                                                   ;0x006d63c2 :        03c8


     ;
     ;                 ---------------------------------------------------------------------------------
     ;                      VFP 9.0 FIX - THE DIRECTION OF THE LIST PORTION OF THE COMBOBOX CONTROL
     ;                                February 2019
     ;                 ---------------------------------------------------------------------------------
     ;                                     CCB
     ;
     ; The direction of the list portion of the ComboBox control.
     ;
     ; 2019/2/18, by ccb
     ;

             cmp dword ptr vfpa_sys9012_data,01h
             je Label6d63da
             cmp dword ptr vfpa_sys9012_data,02h
             je Label6d63c7


             cmp  ecx , dword ptr [ ebp + 32 ]                               ;0x006d63c4 :        3b4d20
             jl Label6d63da                                                  ;0x006d63ca :        7c0e

     Label6d63c7 ::
             mov  ecx , dword ptr [ ebp + 20 ]                               ;0x006d63c7 :        8b4d14
             mov  eax , dword ptr [ ecx + 4 ]                                ;0x006d63cc :        8b4104
             sub eax , edi                                                   ;0x006d63cf :        2bc7
             dec eax                                                         ;0x006d63d1 :        48
             mov  dword ptr [ ebx + 4 ] , eax                                ;0x006d63d2 :        894304
             add eax , edi                                                   ;0x006d63d5 :        03c7
             mov  dword ptr [ ebx + 12 ] , eax                               ;0x006d63d7 :        89430c

     Label6d63da ::
             mov  ecx , dword ptr [ ebp + 20 ]                               ;0x006d63c7 :        8b4d14
             mov  eax , dword ptr [ ecx + 8 ]                                ;0x006d63da :        8b4108
             mov  edx , dword ptr [ecx]                                      ;0x006d63dd :        8b11
             mov esi , eax                                                   ;0x006d63df :        8bf0
             sub esi , edx                                                   ;0x006d63e1 :        2bf2
             lea edx ,  dword ptr [ esi - 2 ]                                ;0x006d63e3 :        8d56fe
             cmp  edx , dword ptr [ ebp + 28 ]                               ;0x006d63e6 :        3b551c
             jle Label6d63ee                                                 ;0x006d63e9 :        7e03
             mov  dword ptr [ ebp + 28 ] , edx                               ;0x006d63eb :        89551c

     Label6d63ee ::
             mov  edx , dword ptr [ ebp + 8 ]                                ;0x006d63ee :        8b5508
             mov  edx , dword ptr [edx]                                      ;0x006d63f1 :        8b12
             mov  esi , dword ptr [ edx + 0ACh ]                             ;0x006d63f3 :        8bb2ac000000
             add  esi , dword ptr [ecx]                                      ;0x006d63f9 :        0331
             mov  edx , dword ptr [ ebp + 28 ]                               ;0x006d63fb :        8b551c
             add esi , edx                                                   ;0x006d63fe :        03f2
             cmp  esi , dword ptr [ Data93a810 ]                             ;0x006d6400 :        3b3510a89300
             jl Label6d6429                                                  ;0x006d6406 :        7c21
             mov  ecx , dword ptr [ ebp + 8 ]                                ;0x006d6408 :        8b4d08
             mov  dword ptr [ ebx + 8 ] , eax                                ;0x006d640b :        894308
             sub eax , edx                                                   ;0x006d640e :        2bc2
             add eax , 0FFFFFFFEh                                            ;0x006d6410 :        83c0fe
             mov  dword ptr [ebx] , eax                                      ;0x006d6413 :        8903
             mov  ecx , dword ptr [ecx]                                      ;0x006d6415 :        8b09
             mov  ecx , dword ptr [ ecx + 0ACh ]                             ;0x006d6417 :        8b89ac000000
             add eax , ecx                                                   ;0x006d641d :        03c1
             jns Label6d6434                                                 ;0x006d641f :        7913
             mov  dword ptr [ebx] , ecx                                      ;0x006d6421 :        890b
             lea eax ,  dword ptr [ ecx + edx - 2 ]                          ;0x006d6423 :        8d4411fe
             jmp Label6d6431                                                 ;0x006d6427 :        eb08

     Label6d6429 ::
             mov  eax , dword ptr [ecx]                                      ;0x006d6429 :        8b01
             mov  dword ptr [ebx] , eax                                      ;0x006d642b :        8903
             mov  eax , dword ptr [ecx]                                      ;0x006d642d :        8b01
             add eax , edx                                                   ;0x006d642f :        03c2

     Label6d6431 ::
             mov  dword ptr [ ebx + 8 ] , eax                                ;0x006d6431 :        894308

     Label6d6434 ::
             mov  esi , dword ptr [ ebp - 4 ]                                ;0x006d6434 :        8b75fc
             push  dword ptr [ ebp + 16 ]                                    ;0x006d6437 :        ff7510
             xor edx , edx                                                   ;0x006d643a :        33d2
             mov eax , esi                                                   ;0x006d643c :        8bc6
             call Fun4158f5                                                  ;0x006d643e :        e8b2f4d3ff
             pushd 00h                                                       ;0x006d6443 :        6a00
             mov edx , eax                                                   ;0x006d6445 :        8bd0
             mov ecx , esi                                                   ;0x006d6447 :        8bce
             call Fun416bd8                                                  ;0x006d6449 :        e88a07d4ff
             mov  edx , dword ptr [ ebp + 24 ]                               ;0x006d644e :        8b5518
             pushd 01h                                                       ;0x006d6451 :        6a01
             mov ecx , esi                                                   ;0x006d6453 :        8bce
             call Fun4c25d3                                                  ;0x006d6455 :        e879c1deff
             mov  eax , dword ptr [ebx]                                      ;0x006d645a :        8b03
             mov  ebx , dword ptr [ ebx + 4 ]                                ;0x006d645c :        8b5b04
             pushd 00h                                                       ;0x006d645f :        6a00
             push ebx                                                        ;0x006d6461 :        53
             push eax                                                        ;0x006d6462 :        50
             mov ebx , esi                                                   ;0x006d6463 :        8bde
             call Fun4c763c                                                  ;0x006d6465 :        e8d211dfff
             mov ecx , esi                                                   ;0x006d646a :        8bce
             call Fun46f36f                                                  ;0x006d646c :        e8fe8ed9ff
             neg eax                                                         ;0x006d6471 :        f7d8
             sbb eax , eax                                                   ;0x006d6473 :        1bc0
             not eax                                                         ;0x006d6475 :        f7d0
             and  eax , dword ptr [ ebp + 28 ]                               ;0x006d6477 :        23451c
             xor ecx , ecx                                                   ;0x006d647a :        33c9
             push edi                                                        ;0x006d647c :        57
             inc ecx                                                         ;0x006d647d :        41
             mov edi , esi                                                   ;0x006d647e :        8bfe
             call Fun544cfe                                                  ;0x006d6480 :        e879e8e6ff
             mov  eax , dword ptr [ ebp - 8 ]                                ;0x006d6485 :        8b45f8
             cmp  dword ptr [ ebp + 12 ] , eax                               ;0x006d6488 :        39450c
             pop edi                                                         ;0x006d648b :        5f
             jl Label6d6494                                                  ;0x006d648c :        7c06
             cmp  dword ptr [ ebp + 24 ] , 00h                               ;0x006d648e :        837d1800
             je Label6d64a3                                                  ;0x006d6492 :        740f

     Label6d6494 ::
             mov  esi , dword ptr [ ebp - 4 ]                                ;0x006d6494 :        8b75fc
             mov eax , esi                                                   ;0x006d6497 :        8bc6
             call Fun473ea1                                                  ;0x006d6499 :        e803dad9ff
             call Fun78c884                                                  ;0x006d649e :        e8e1630b00

     Label6d64a3 ::
             pop esi                                                         ;0x006d64a3 :        5e
             pop ebx                                                         ;0x006d64a4 :        5b
             leave                                                           ;0x006d64a5 :        c9
             ret 01Ch                                                        ;0x006d64a6 :        c21c00


4. APPLIES TO:

     VFP 6.0.8167.0
     VFP 6.0.8961.0 (SP5)

     VFP 7.0.0.9262
     VFP 7.0.0.9465 (SP1)

     VFP 8.0.0.2521
     VFP 8.0.0.3117 (SP1)

     VFP 9.0.0.2412
     VFP 9.0.0.3504 (SP1)
     VFP 9.0.0.4611 (SP2)
     VFP 9.0.0.5015 (SP2)
     VFP 9.0.0.5411 (SP2)
     VFP 9.0.0.5721 (SP2)
     VFP 9.0.0.5815 (SP2)
     VFP 9.0.0.6303 (SP2)
     VFP 9.0.0.6602 (SP2)
     VFP 9.0.0.7423 (SP2)

     The bug has been fixed in VFP Advanced.


5. REFERENCE WEBSITES:

     1, baiyujia.com:
     http://www.baiyujia.com
     http://www.baiyujia.com/vfpdocuments/f_vfp9fix63.asp

     2, sunyear.com.tw:
     http://vfp.sunyear.com.tw/viewtopic.php?t=6986


6. OTHER:

     For reference only, there is no guarantees.

     Any questions or suggestions, please send me an email at ccb2000@163.com.