09-07-2012 09:39 AM
Hola CVI people
Estoy intentando obtener el HANDLE de un objeto creado en la interfaces UIR, para poder controlarlo usando el handle.
Cuando se crea un nuevo (Duplica etc..) es fácil handle= Newctrl (.....)
No se que comando usar cuando ya esta creado y quiero saber que handle tiene asignado., También se que en el archivo .h lo puedo ver, pero necesito una forma de leerlo desde el programa para controlarlo.
Saludos
Roque
09-08-2012 05:02 AM
Realmente no entiendo lo que necesitas: un control creado en el UIR editor tiene un identificativo que es el conjunto panel+control (por ej, PANEL_NUMERIC). Esto es lo que vas a usar en los comando, por ejemplo SetCtrlVal (panelHandle, PANEL_NUMERIC, 123);
Por favor, aclara mejor lo que necesitas, a ver si hay manera de solucionar tu problema.
09-10-2012 04:58 AM
Exactamente, un control creado en el UIR editor tiene un identificativo que es el conjunto panel+control (por ej, PANEL_NUMERIC).
Usualmente este identificativo tiene asignado un HANDLE que se puede ver en el archivo *.h
Lo que necesito saber es como leer este HANDLE desde los comandos.
Me explico.
Cuando se crea un control en comandos...ejemplo.
Handle_del_Control = NewCtrl (panelHandle, CTRL_NUMERIC , "Control", 500, 100);
El "Handle_del_Control" o identificativo puede ser usado para controlarlo. ejemplo
SetCtrlVal (panelHandle, Handle_del_Control, 123,...);
Desde el codigo es facil obtener el "Handle_del_Control"
Mi problema es como saber el "Handle_del_Control" cuando se ha creado desde el editor *.uir
Muchas Gracias
Roque
09-10-2012 05:46 AM - edited 09-10-2012 05:50 AM
Antes que todo, el identificativo de un control absolutamente no es un "handle" sino un índice progresivo entre el conjunto de controles. Mas vale decir que cuando ejecutas el comando "SetCtrlVal (panelHandle, PANEL_NUMERIC, ...); estás realmente haciendo esto: "dale un valor al primer (segundo, tercero, ...) control en el panel identificado por este panel handle". Este índice es lo que se encuentra en el archivo .h asociado al UIR.
Puedes escanear la lista de los controles en un panel con los comandos:
GetPanelAttribute (panelHandle, ATTR_PANEL_FIRST_CTRL, &ctrl); // índice del primer control while (ctrl) { // ... aquí puedes maniobrar el control GetCtrlAttribute (panelHandle, ctrl, ATTR_NEXT_CTRL, &ctrl); // ¿Hay otro control más? }
Lo que no entiendo es porqué ir por la ruta complicada en vez de usar el nombre dado en el editore de paneles: si has creado tú el panel, ya sabes el nombre de los controles ¿no? Lo más simple que puede pasar determinando los controles de esta manera es encontrar el error de " invalid data type: expected 'double' but found 'int' ". Para evitarlo puedes mirar a otros atributos como por ejemplo el ATTR_CTRL_STYLE para determinar si el control es un numeric, un botón u otro; ATTR_CTRL_MODE para determinar si es un indicador u un control activo; ATTR_DATA_TYPE para determinar e tipo de datos en el control... pero ¡es muuuy complicado!
09-10-2012 07:50 AM
Hola Roberto. Primero que todo muchas gracias por tu ayuda.
La razon para usar el "índice progresivo" es porque tengo muchos controlos iguales de tipo "Binary Switch, Leds etc.." que debo controlar dentro de loops (do-while) por lo tanto, no es util usar el nombre dado en el editore de paneles. En otras palabras necesito el "indice progresivo" asignado para controlarlos dentro del los loops etc...
Voy a intentar tu sugerencia. Muchas gracias
Roque
09-10-2012 10:49 AM
Hola Roque,
en mi opinion usar directamente el control ID es bastante peligroso: los ID son asignados por el CVI basándose en el tab order, y si tu vas por algun motivo a modificar éste igualmente debes modificar todas tus rutinas de manejo de controles.
Cuando estaba en una condición semejante a la tuya yo preferí crear un arreglo de control ID y trabajar con éste. Hice de esta manera:
int ctl[100]; // Creación del arreglo ctl[0] = PANEL_LED0; ctl[1] = PANEL_LED1; // ... CTL[10] = PANEL_LED9; // Manipulación de controles for (i = 0; i < 10; i++) { SetCtrlAttribute (panelHandle, ctl[i], ATTR_ON_COLOR, VAL_RED); SetInputMode (panelHandle, ctl[i], 1); }
También se discutió sobre este asunto en el foro: puedes leer por curiosidad esta conversación que fue bastante aclaratoria.
09-11-2012 10:10 AM
09-13-2012 09:37 AM
HOLA Roberto
Me puedes sugerir una idea de como plotear con " PlotPoint() " una variable en funcion del tiempo. La pregunta es porque esta funcion solo acepta variables "double" y el tiempo obtenido con "TimeStr()" es de tipo "char"
Gracias
09-13-2012 09:58 AM - edited 09-13-2012 09:59 AM
Hola Roque,
el método más simple es almacenar el valor restituido por la función Timer () en vez del TimeStr (). Por ejemplo:
double t0, tiempo; t0 = Timer (); // tu rutina de adquisición while (TRUE) { // ... medicion = (lo_que_sea); tiempo = Timer () - t0; PlotPoint (..., ..., tiempo, medicion, VAL_EMPTY_SQUARE, VAL_RED); }
esto te proporciona el tiempo desde el comienzo del proceso.
Alternativamente, puedes escanear la cadena del TimeStr (), extraer las informaciones de hora, minuto y segundo y pasarlas al MakeDateTime () para calcular el valor double correspondiente. Esto se puede pasar al gráfico. ¡Muy pesado!
Te sugiero que en cuanto tengas una nueva pregunta abras un nuevo hilo, para tener separados los argumentos de discusión.
Igualmente, es mejor utilizar el inglés en esta tabla internacional, u pasar a la tabla de habla española si prefieres este idioma.
Suerte