LabWindows/CVI

cancel
Showing results for 
Search instead for 
Did you mean: 

Como obtener HANDLE de un objeto creado en la UIR

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

 

0 Kudos
Message 1 of 9
(3,991 Views)

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.



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 Kudos
Message 2 of 9
(3,984 Views)

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

0 Kudos
Message 3 of 9
(3,977 Views)

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!



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 Kudos
Message 4 of 9
(3,973 Views)

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

 

 

 

 

 

0 Kudos
Message 5 of 9
(3,966 Views)

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.



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 Kudos
Message 6 of 9
(3,961 Views)

And this thread might also be useful.

 

Luis

0 Kudos
Message 7 of 9
(3,952 Views)

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

 

0 Kudos
Message 8 of 9
(3,921 Views)

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



Proud to use LW/CVI from 3.1 on.

My contributions to the Developer Community
________________________________________
If I have helped you, why not giving me a kudos?
0 Kudos
Message 9 of 9
(3,918 Views)