Power Builder Menu Popup para copiar datawindow.

Me gustaría saber como creer un menu popup que aparezca al hacer click con el botón derecho del ratón sobre un datawindow con la opción copiar, y que al pulsar me copie las celdas seleccionadas previamente con el mouse. ¿Alguien puede ayudarme?

1 respuesta

Respuesta
1
Tratare de ayudarte. Con lo siguiente:
1 - Crear un menu llamado m_menu
2 - Dentro de el creas un ítem llamado opciones
3 - Dentro de opciones creas subitem llamado copiar
4 - Creas una ventana con 2 DW (ya enlazados a tu tabla, es decir que apunten a un solo DWO )
5 - Para el ejemplo DW1 sera el origen y DW2 el fin
6 - Dentro de DW1 en el evento clicked! Va esto
If IsSelected(row) Then
    SelectRow(row, False)
Else
     SelectRow(row, True)
End If
7 - Dentro del DW1 en el evento rbuttondown!
m_menu lm_menu
integer ii_ope_popup
ii_ope_popup = 1
lm_menu = CREATE m_menu
lm_menu.m_opciones.PopMenu(PointerX(), Pointery())
8 - En la ventana creas un evento llamado ue_copiar que no retorne argumentos y pegas esto
integer li_fila
for li_fila = 1 to dw_1.rowcount( )
     if dw_1.isselected( li_fila) then
           dw_1.rowscopy( li_fila,li_fila,primary!,dw_2,1,primary!)
      end if
next
**************************************************
Espero te sirva, pero igual ya lo ise así que más luego te lo cuelgo el código fuente en el siguiente link: (ahora no lo puedo hacer porque acá no tengo permiso para subir al HOSTING)
http://calzadocaley.com/solo-info/?page_id=20#
Acá tienes el link que te prometí con el código fuente.
http://www.calzadocaley.com/solo-descargas/MenuPopupCopiaFilas.rar
http://calzadocaley.com/solo-info/?page_id=20
No olvides finalizar la pregunta
Lo que quiero es copiar las filas seleccionadas al portapapeles para poderlas pegar, por ejemplo en excel. ¿Puedes ayudarme? Por cierto utilizo power builder 9.0.
A por suerte es lo mismo que te acabo de decir, pero adicional a ello tienes que copiar al portapapeles todo el DW2 (usar función CLIPBOARD)que es que que contiene los datos seleccionados en el DW1.
string ls_data
ls_data = dw_1.object.data
::Clipboard(ls_data)
Luego arias pegar o Ctrl + V en EXCEL.
Algo adicional, para copiar datos seleccionados en un excel a una DW
dw_cualquiera. ImportClipBoard ( ) ''La condición es que tengan la misma estructura las tablas
El ejemplo que subí esta en 10.5, lo lamento pero no tengo el 9.0 pero de todas manera arriba esta todo el código que tiene la aplicación
Disculpa mi ignorancia pero no consigo hacer funcionar el código. Te comento:
Pasos 1, 2 y 3 ok.
4 - Creas una ventana con 2 DW (ya enlazados a tu tabla, es decir que apunten a un solo DWO(¿te referies a crear dos dw control referenciados al mismo datawindow? )
5 - 6, 7 8 ok
No entiendo como se supone que al pinchar en copiar se llama al evento ue_copiar, ¿hay qué refrescar el dw_2 o se deben insertar las filas seleccionadas inmediatamente?
Gracias por las aclaraciones.
4 - Así es, ya que para que funcione el tema de copiar DW de uno a otro se puede pero tienen que tener la misma estructura. Eso cuando usas los ROWSCOPY, SHAREDATA que son usados para pasar finlas de una DW a otra.
**
Creo que me falto indicarte dos cosas
En el evento click del menu COPIAR va esto
parentwindow.triggerevent("ue_copiar")
En el la propiedadMenuName de tu ventana tienes que asociarlo al menu.
Y el el menu lo pones invisible si no quieres que se vea en la parte superior y solo se vera al dar click derecho.
Te recomiendo conseguirte la version 10.5 para que veas el código ahí esta ya listo, pero de todas manera te paso esto, exporte mi ventana y le ise editar con bloc de notas y este es mi código quizás te ayude un poco más podrías remplazarlo todo eso con lo que tienes en tu ventana.
Los DW que use es un external con 3 columnas y lo llene al cargar la ventana,

***************************************

$PBExportHeader$w_1.srw
forward
global type w_1 from window
end type
type dw_2 from datawindow within w_1
end type
type dw_1 from datawindow within w_1
end type
end forward
global type w_1 from window
integer width = 3168
integer height = 1952
boolean titlebar = true
string title = "Ventana 1"
string menuname = "m_menu"
boolean controlmenu = true
boolean minbox = true
boolean maxbox = true
boolean resizable = true
long backcolor = 67108864
string icon = "AppIcon!"
boolean center = true
event ue_copiar ( )
dw_2 dw_2
dw_1 dw_1
end type
global w_1 w_1
type variables
integer ii_ope_popup
end variables
event ue_copiar();integer li_fila
for li_fila = 1 to dw_1.rowcount( )
    if dw_1.isselected( li_fila) then
        dw_1.rowscopy( li_fila,li_fila,primary!,dw_2,1,primary!)
    end if
next
end event
on w_1.create
if this.MenuName = "m_menu" then this.MenuID = create m_menu
this.dw_2=create dw_2
this.dw_1=create dw_1
this.Control[]={this.dw_2,&
this.dw_1}
end on
on w_1.destroy
if IsValid(MenuID) then destroy(MenuID)
destroy(this.dw_2)
destroy(this.dw_1)
end on
event open;integer li_fila
li_fila = dw_1.insertrow(0)
dw_1.setitem(li_fila,'cod',1)
dw_1.setitem(li_fila,'dato1','A')
dw_1.setitem(li_fila,'dato2','AA')
li_fila = dw_1.insertrow(0)
dw_1.setitem(li_fila,'cod',2)
dw_1.setitem(li_fila,'dato1','B')
dw_1.setitem(li_fila,'dato2','BB')
li_fila = dw_1.insertrow(0)
dw_1.setitem(li_fila,'cod',3)
dw_1.setitem(li_fila,'dato1','C')
dw_1.setitem(li_fila,'dato2','CC')
li_fila = dw_1.insertrow(0)
dw_1.setitem(li_fila,'cod',4)
dw_1.setitem(li_fila,'dato1','D')
dw_1.setitem(li_fila,'dato2','DD')
li_fila = dw_1.insertrow(0)
dw_1.setitem(li_fila,'cod',5)
dw_1.setitem(li_fila,'dato1','E')
dw_1.setitem(li_fila,'dato2','EE')
end event
type dw_2 from datawindow within w_1
integer y = 784
integer width = 2853
integer height = 748
integer taborder = 10
string title = "none"
string dataobject = "d_prueba"
boolean livescroll = true
borderstyle borderstyle = stylelowered!
end type
type dw_1 from datawindow within w_1
integer width = 2853
integer height = 748
integer taborder = 10
string title = "none"
string dataobject = "d_prueba"
boolean livescroll = true
borderstyle borderstyle = stylelowered!
end type
event rbuttondown;m_menu lm_menu
ii_ope_popup = 1
lm_menu = CREATE m_menu
lm_menu.m_opciones.PopMenu(PointerX(), Pointery())
end event
event clicked;
If IsSelected(row) Then
    SelectRow(row, False)  
Else
    SelectRow(row, True)
End If
end event
********************

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas