[C con Clase] No me quedo claro esta parte, por favor

Steven Davidson steven en conclase.net
Vie Jun 22 03:29:44 CEST 2007


Hola Luis,

El pasado 2007-06-20 21:49:12, Luis escribió:

L> Muchas gracias por la apreciación, espero no incomodarte, pero me queda la
L> duda de como estedes trajan con un objeto que no tiene donde guardar el
L> codigo de un registro, sere breve en mi pregunta.
L> Ejemplo
L> me piden llenar un ComboboxPersona, con la tabla persona.
L> 1 llena el ComboboxPersona  "Luis\n\r\ Veronica\n\r\ carlos\n\r" algo asi
L> creo que lo llena bueno hasta ahí bien.
L> y cuando yo quiero grabar el ComboboxPersona ovio que no voy a guardar
L> carlos\n\r ó Veronica\n\r,  lo normal es que guarde su codigo de la persona
L> que el usuario selecciono
L> mi duda a todo esto es que o lo veia muy facil en Visual Basic y otros
L> lenguajes hacer algo asi
L> llenaba el combobox con NombrePersona a mostrar
L> llenaba el combobox con Id_persona Escondigo por dentro(no recuerdo la
L> propiedad ahora, )
L> en pocas palabas un combobox podia llanar el texto y por dentro el id y
L> cuando yo queria solo pedia el IDPersona que tenia guardado por dentro,
L> y comente por ahí, si se podia hacer esto Con Borland C++Builder 6, y me
L> dijeron que no que solo guarda el texto.
L> a todo esto es solo curiosidad espero no incomodarte.

No sé si lo he entendido correctamente, pero voy a hacer un intento. Creo que tienes una lista de cadenas de caracteres en tu aplicación. Quieres manipular tales cadenas como necesites y supuestamente como indique el usuario. Sin embargo, quieres tener la misma información - las cadenas - en un control "combobox". También quieres que cualquier cambio en tu lista de cadenas se produzca en las cadenas del "combobox", y viceversa. Me temo que esto no es el comportamiento estándar, principalmente, porque el "combobox", como varios otros controles copian la información pasada a sus propias variables internas al control. En tu caso, cualesquier cadenas de caracteres que pases al "combobox" son copiadas a una lista de cadenas interna y perteneciente a tal "combobox". Esto implica que las cadenas son diferentes e independientes.

Si no quieres ordenar la lista de cadenas, entonces no deberías preocuparte por el orden. Por lo tanto, puedes referirte a la misma cadena en ambas "estructuras" con el mismo índice. Por ejemplo,

TCHAR listaCadenas[10][1024];
...
lstrcpy( listaCadenas[nIndice], TEXT("Un mensaje en la lista") );
SendMessage( hCombobox, CB_ADDSTRING, 0, listaCadenas[nIndice] );

Si quieres indicar exactamente dónde colocar la cadena; es decir, el índice, entonces usa el mensaje CB_INSERTSTRING. Por ejemplo,

SendMessage( hCombobox, CB_INSERTSTRING, (WPARAM)nIndice, listaCadenas[nIndice] );

Con esto, no tenemos problemas de relación: el mismo índice se refiere a la misma cadena tanto en nuestra lista de cadenas como en la lista interna del "combobox".


Dicho todo esto, podemos pasar a otro aspecto que se consideraría avanzado, pero creo que es exactamente lo que quieres. Lo que hacemos es asociar otra información a cada elemento (cadena) de la lista. Usamos los mensajes 'CB_SETITEMDATA' y 'CB_GETITEMDATA'. Por ejemplo,

TCHAR listaCadenas[10][1024];
...
lstrcpy( listaCadenas[nIndice], TEXT("Un mensaje en la lista") );
SendMessage( hCombobox, CB_ADDSTRING, 0, listaCadenas[nIndice] );
SendMessage( hCombobox, CB_SETITEMDATA, nIndice, nIndice );

Si tienes un "combobox" con el estilo CBS_SORT (para ordenar), entonces tendrás que conseguir el índice adonde fue a parar tal cadena. Esto sería,

LRESULT nIndiceOrdenado =
               SendMessage( hCombobox, CB_ADDSTRING, 0, listaCadenas[nIndice] );
SendMessage( hCombobox, CB_SETITEMDATA, nIndiceOrdenado, nIndice );

Si queremos obtener los datos adicionales que previamente guardamos en el "combobox", entonces usamos el mensaje CB_GETITEMDATA.


Todo esto se explica en el capítulo 43 de nuestro curso del API de MS-Windows, el cual mencioné en varias ocasiones que consultaras. El enlace es: http://winapi.conclase.net/curso/index.php?cap=043c#CB2_ITEMDATA


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase