Duda sobre la implementación de menú que sea trasparente para cualquier datawindow en Power Builder

Lo que necesito es
Tengo un menu con tres opciones
Insertar
Eliminar
Y actualizar
Tengo 3 ventanas distintas
Cada una de esta ventana tiene una datawindows
con nombre distinto por ejemplo
datawindow1 = dw_personal
datawindow2 = dw_ventas
datawindow3 = dw_perdidas
Lo que quiero hacer es que con el mismo menu con la opción insertar
por ejemplo me sirva para las 3 ventanas
Por ejemplo que el dw_xxx. Insertrow(0)
Sea transparente para cualquier datawindow desde la opción insertar de mi menu.
Como puedo hacer estos
Si em pudieran ayudar se los agradecería mucho

2 respuestas

Respuesta
1
Creo que tu tampoco me has entendido.
El ejemplo que aparece será en el caso de la ventana 1.
El nombre del evento ha de ser común en todas las ventanas pues el menú no sabe como se llaman las datawindows, quien realmente sabe como se llaman es la ventana, por eso el menú llama al evento de la ventana que es donde hay que codificar. Es decir, en la ventana 1 el evento ev_insertar tendrá el nombre de la datawindow
( En este caso dw_personal )
En la ventana 2 el evento ev_insertar contendrá el nombre de la datawindows que necesitas ( en este caso dw_ventas )... etc..
Si realmente quieres hacer this. Insertrow(0) tendrás que llamar de la misma forma las datawindows y el menú ha de llamar a la datawindows y hacer lo de insertrow, pero como no es el caso, la mejor forma es la que te he comentado.
Recuerda, el objeto menú no sabe en ningún momento que objetos tiene una ventana, por eso, para que sea común a varias ventanas tiene que tener en común algo, en este caso el nombre de los eventos.
El menú simplemente se limita a llamar al evento y que haga lo que tenga que hacer, en cada ventana tendrá que hacer el insertrow a la datawindows que le interese.
Muy bien gracias
Como te comenté antes, haz lo mismo con la ventana, es decir creas un evento con las opciones del menú.
ev_insertar
ev_eliminar
ev_actualizar
en cada uno de ellos pon el código que corresponda,
es decir en ventana1
ev_insertar()
dw_personal.insertRow(0)
ev_eliminar()
Long ll_row
Integer li_resp
ll_row = dw_personal.GetSelectedRow(0)
if ll_row > 0 then
li_resp = MessageBox("Eliminar","Desea eliminar el registro",Question!,yesno!)
if li_resp = 1 then
dw_personal.DeleteRow(ll_row)
end if
end if
Recuerda que en el evento clicked del menú has de llamar al evento insertar, eliminar, actualizar, etc... y en cada ventana hará lo que tenga que hacer.
Respuesta
1
Existe una función que denota quien tiene el foco, o sea que objeto se encuentra activo dentro de la ventana, esta función es GETFOCUS(), esta función devuelve un valor tipo OBJECT.
A continuación el ejemplo que se encuentra en la ayuda online de pb.
GraphicObject which_control
SingleLineEdit sle_which
CommandButton cb_which
string text_value
which_control = GetFocus()
CHOOSE CASE TypeOf(which_control)
CASE CommandButton!
cb_which = which_control
text_value = cb_which.Text
CASE SingleLineEdit!
sle_which = which_control
text_value = sle_which.Text
CASE ELSE
text_value = ""
END CHOOSE
En el ejemplo anterior la función getfocus() devuelve un objeto gráfico, y dependiendo del tipo de este, es asignado a uno de un tipo especifico,
en tu caso deberás preguntar si se trata de un datawindow!, y por supuesto designar la variable datawindow temporal, y asignarla cuando esta coincida con el tipo.
Eso por una parte, una vez determinada la variable, es como si tuvieras, directamente el datawindow.
Antes de continuar crea varios eventos de usuario en cada una de los datawindow, por ejemplo,
para altas ue_altas
para bajas ue_bajas
para cambios ue_cambios
y así sucesivamente...
Esto en cada uno de los datawindow.
Continuando con lo anterior, una vez que tienes ya en la variable definida el datawindow que posee el foco.
Entonces podrás soportarte en cualquiera de dos funciones POSTEVENT o TRIGGEREVENT
estas funciones permiten hacer una llamada a un evento dinámico, o en otras palabras, que no necesariamente existe.
Por ejemplo
datawindow ldw_foco
GraphicObject lgo_control
IF (TYPEOF(lgo_control) = datawindow!) THEN
ldw_foco = lgo_control //--> aqui ya tengo el datawindow activo.
ldw_foco.POSTEVENT('ue_insert') //--> y ahora ejecuto el evento UE_INSERT del datawindow activo.
END IF
La variable puede ser global y puedes omitir la función GETFOCUS() por el evento en cada una de los datawindows, o sea en el evento getfocus(), incluye la asignación de una variable tipo datawindow, con el datawindow que se activa
ejm.
En el evento getfocus() de cada datawindow
idw_control = THIS
De esta manera idw_control que sera una variable de instancia, contendrá el datawindow activo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas