[C con Clase] Creo que me va a servir, una ultima consulta

Steven Davidson steven en conclase.net
Mie Jun 20 22:26:18 CEST 2007


Hola Luis,

El pasado 2007-06-20 16:46:53, Luis escribió:

L> Creo que me sirve muchas gracias, voy  aprobarlo
L> Pero una consulta entonces esto no es potable, va a depender el api de la pc
L> donde la ejecute

En general, sí. Sin embargo, si usas el API de MS-Windows, no tendrás este problema, con tal de que ese PC esté usando MS-Windows. Por eso, en el curso del API de MS-Windows, nos basamos en el API, ya que es la base o núcleo de MS-Windows. Hoy en día, las versiones de MS-Windows traen la mayoría de las DLL's para las API's o armazones (frameworks, en inglés) de MS-Windows. Esto es, MFC, OLE/COM, y algunas bibliotecas más.

En general, para asegurar que tu aplicación funcione correctamente, es recomendable adjuntar las bibliotecas necesarias; o sea, distribuir las DLL's. Si usas el API de MS-Windows, no tendrás que redistribuir nada, porque forma parte de MS-Windows.

L> me pase todo un día intentando seleccionar lo que te pedí, en Visual Basic
L> es mas fácil, y bueno me rompí la cabeza.
L> y como trabajan para guardar el ID de lo seleccionado o solo trabajan con
L> posiciones ejemplo:
L> Si me piden que muestre las opciones en un bombobox "Muestro el texto" ? y
L> el código donde va ?.

No estoy muy seguro a qué te refieres con "opciones". Voy a suponer que una "opción" es algún texto que previamente conoces. Por ejemplo,

+---------------+
|Aquí se escribe|
+---------------+
+---------------+
| 1.  Opción  1 |
| 2.  Opción  2 |
| 3.  Opción  3 |
| 4.  Opción  4 |
| 5.  Opción  5 |
+---------------+

Si empiezas con un "combobox" vacío, y quieres rellenar la parte del listado con esta información, entonces necesitas agregar estas cadenas al "combobox". Para hacer esto, envíamos el mensaje 'CB_ADDSTRING' junto con la cadena a agregar. Si el "combobox" no tiene el estilo 'CBS_SORT' (para ordenar alfabéticamente automáticamente), entonces se agrega cada cadena al final de la lista. Por ejemplo,

SendMessage( hComboBox, CB_ADDSTRING, 0, (LPARAM) "1.  Opción  1" );
SendMessage( hComboBox, CB_ADDSTRING, 0, (LPARAM) "2.  Opción  2" );
...

Y así sucesivamente. Como esto es algo inicial, sugiero enviar estos mensajes dentro de WM_CREATE de la ventana principal. Obviamente, el control "combobox" debe existir antes de poder enviarle mensajes.

Si no tienes acceso al manipulador de ventana, entonces usarás su número de identificación. Con esto, sustituimos 'SendMessage()' por 'SendDlgItemMessage()', indicando la ventana pariente. Por ejemplo,

SendDlgItemMessage( hPariente, IDC_COMBOBOX, CB_ADDSTRING,
                    0, (LPARAM) "1.  Opción  1" );
SendDlgItemMessage( hPariente, IDC_COMBOBOX, CB_ADDSTRING,
                    0, (LPARAM) "2.  Opción  2" );
...

L> Cuando tengo que guardar el código de ese texto ¿ que trabajo con

Esto depende del porqué tienes que guardar u obtener el texto. Recuerda que las aplicaciones son motivados o dirigidos por eventos ("event-driven", en inglés). Esot quiere decirse que, las aplicaciones realizan tareas específicas con respecto a algún evento o acción típicamente provocado por el usuario. En la programación de dichas aplicaciones, obtenemos mensajes que nos indican el comportamiento a procesar.

Si quieres obtener el texto en el "combobox", tienes que saber la acción provocada para realizar esta tarea. Si quieres obtener los textos porque el usuario interactuó con el "combobox", entonces puedes procesar el mensaje WM_COMMAND el cual contendrá mensajes de notificación, entre otros tantos, del "combobox". Por ejemplo,

static TCHAR szTextoElegido[1024];
...
case WM_COMMAND:
  if( LOWORD(wParam) == IDC_COMBOBOX && HIWORD(wParam) == CBN_SELCHANGE )
  {
    HWND hCombobox = (HWND) lParam;
    int nIndice = SendMessage( hCombobox, CB_GETCURSEL, 0, 0 );
    SendMessage( hCombobox, CB_GETLBTEXT, (WPARAM) nIndice,
                 (LPARAM) szTextoElegido );
  }


Este código obtiene el texto elegido por el usuario en la parte del listado, para ser guarado en la cadena de caracteres 'szTextoElegido'. Esto se hace cada vez que el usuario elija una cadena de la lista.

Como puedes ver, obtenemos el índice de la cadena elegida. Posteriormente, usamos este índice para obtener la cadena que necesitamos.

L> posiciones?, y si me pidieron que el combobox  lo muestre ascendente o
L> descendente, los registros de la tabla y de la del Combobox  no tienen el
L> mismo orden??,  esa parte no entiendo.

Esto depende del estilo que indicaste al crear el "combobox". Si aplicaste el estilo 'CS_HASSTRINGS' y 'CS_SORT', entonces el control reordenará automáticamente las cadenas para que queden en orden alfabético. Este comportamiento es aplicado si usamos el mensaje 'CB_ADDSTRING'.

Si queremos otro tipo de ordenamiento, entonces tenemos que procesar el mensaje 'WM_COMPAREITEM' en el procedimiento de la ventana pariente.

En cuanto a si tienen el mismo orden, esto depende de si el "combobox" tiene el estilo 'CBS_SORT' o no. Si lo tiene, y se usa el mensaje 'CB_ADDSTRING', entonces el orden interno de las cadenas del "combobox" es modificado.


Todo esto es tratado en los capíutlos 11 y 43 de nuestro curso del API de MS-Windows. Recomiendo vehementemente consultar esta información.


Espero haber aclarado las dudas.

Steven


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