Spanish Ejecutar subrutina desde un activity distinto

emvpic

Member
Licensed User
Longtime User
Hola, tengo una app con varias activity, necesito saber si se puede activar un evento desde una activity distinto. Por ejemplo: si tengo un boton en main3, hago click en el y quiero que ese botón tenga un código que haga como si hiciera click en otro boton que esta en otro main.

Es algo así como ejecutar algo en segundo plano (no se si se llamaría así), por ejemplo mover una imagen que está en main3, y desde main2 hago que se mueva, hago que se cargue main3 y en lo que tarda en cargarse ya se ha estado ejecutando el código que mueve la imagen y he notado que se ha movido la imagen.

Sería también como ejecutar codigo que esta en un main distinto sin tener que cargarlo(visualizarlo en pantalla).
No se si me he explicado bien.

Si no se pudiera o fuera muy dificil para mi, debería de recurrir a paneles, pero en ese caso tendría que modificar muchas cosas y son muchas lineas de código.
 

cas6678

Active Member
Licensed User
Longtime User
A ver si te sirve:

Creas un modulo de codigos (llamado "rutinas") en donde pones diferentes sub ("leer", "guardar", etc.). Luego desde cualquier activity puedo usarlas...

rutinas.leer, rutinas.guardar, etc.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Como bien te dice @cas6678, creas un Code Module. Yo suelo llamarle GlobalSubs y ahi pones las rutinas comunes a todos los activities.
Luego, para ejecutarlo, no es más que hacer lo siguiente:
B4X:
GlobalSubs.GuardaDatos(Dato)
Un saludo.
 

emvpic

Member
Licensed User
Longtime User
No se si entendi bien lo que me habéis explicado pero, si yo quiero mover un imageview que esta en main4, y yo quiero moverlo desde main3.
He creado un módulo de códigos, al declarar el imageview, me da un error: Cannot acces activity object from Procces_Globals.
Desde main 3, llamo a una rutina llamada pidomover que se encuentra en el modulo de codigos, y esta rutina es la que se encuentra también en main4 que se ejecuta si estoy en ese momento en la pantalla de main 4. Pero yo quiero que se ejecute esa rutina que mueve una imagen desde otra pantalla distinta (aunque no pueda verla porque estoy en otra pantalla)
No se si lo que pretendo es correcto o me estoy liando mucho.
 

hibrid0

Active Member
Licensed User
Longtime User
Yo tengo una duda, uno puede pintar controles en tiempo de ejecución desde un módulo compartido?

Es q requiero hacer unas funciones y la idea es pinten controles en tiempo de ejecución, pero creo q me toca tenerlos el mismo activity.
 

Descartex

Well-Known Member
Licensed User
Longtime User
Muy buenas:
Lo que puedes hacer es pasarle el control como parámetro al módulo en cuestión, no declarándolo dentro del propio módulo de codigos.
Por ejemplo:
B4X:
pidomover(ImageView4)
Al pasarlo como parámetro tienes toda la info con el... el parent, etc, etc.
 

emvpic

Member
Licensed User
Longtime User
Hola, sigo sin saber como seguir:
Lo que tengo es, de forma directa en el mismo main4, tengo una rutina de un timer que cuando necesito la habilitó para que mueva una imagen hacia los lados, también dentro de esta rutina hay variables, actualizo una base de datos, un label y 2 cuadros de texto. Esto estando en el layout del main4.

De forma indirecta (estando en otro layout), estando en main3, tengo un boton para que ejecute la rutina que hay en main4, ¿Y como se hace esto? Sin salir del main3. Luego puedo ir al layout de main4 y ver como termina moviendose la imagen.

Entonces no se si entendi bien, tengo que crear un rutina en un modulo de codigo, que no se si su función es hacer de puente entre main3 y main4 o que funcion tiene.
No entiendo lo de pasar el control como parámetro al módulo.
Me haría falta algún ejemplo para entenderlo.

El código que quiero ejecutar desde main3 que se encuentra en una rutina que hay en main4:
B4X:
Sub temporpidem1_tick
img1.Bitmap=LoadBitmap(File.DirAssets,"r1derecha.png")
    If img1.Left < 1151 Then
        img1.Left=img1.Left +3
edtpruebas.Text=img1.Left
Dim id As Int
Dim b1l,b1t,b1a,b1cla,b1col,b1s As String
Dim cursor1 As Cursor
id = Starter.idlista.Get(1)     
cursor1 = Starter.SQL1.ExecQuery("SELECT * FROM base WHERE ID = " & id) 
    cursor1.Position = 0                                          
    b1l = bastidor1.left      
    b1t = bastidor1.Top          
    b1a = cursor1.GetString("Ac") 
    b1cla=cursor1.GetString("Cl") 
    b1col=cursor1.GetString("Co")
    b1s=cursor1.GetString("Se")
         
    Dim Query As String
    Query = "UPDATE base Set Posl = ?, Post = ?, Ac = ?, Cl= ?, Co= ?, Se = ? WHERE ID = " & Starter.idlista.Get(Starter.indice)
    Starter.SQL1.ExecNonQuery2(Query, Array As String(b1l, b1t, b1a,b1cla, b1col, b1s))                     
    cursor1.Close
     
    End If
    If img1.Left=1151 Then
        img1.Bitmap=LoadBitmap(File.DirAssets,"r1arriba.png")
        temporpidem1.Enabled=False
        tempsubida.Enabled=True
     
    End If

End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

Te han dado la respuesta tanto cas6678 como Descartex, si quieres ejecutar un sub desde otro formulario, puedes emplear CallSub, CallSubDelayed... y así llamaras a ese sub cargando el formulario donde esté esa rutina.

Saludos
 

emvpic

Member
Licensed User
Longtime User
Hola, he estado en otras partes del código mas sencillas, ahora he vuelto al asunto del que trata este tema que abrí hace unas semanas.
Usando CallSubDelayed pasa al activity donde esta esa rutina y se ejecuta, pasando de la activity 1 a la activity 4.
Lo que necesito es que se ejecute esa rutina en segundo plano, digamos que estoy en la activity 1 donde yo realizo la llamada a la función que esta en la activity 4, entonces yo quiero que se vea la activity 1 pero que se ejecute una rutina que este en la activity 4, como si dijéramos que esta la activity 4 minimizada pero ejecutando esa rutina, luego cuando a mi me interesa, minimizo la activity1 y maximizo la activity 4 y el proceso de la rutina puede que aún este en marcha o puede que ya haya terminado.
No se si me explique bien, si es fácil hacer este código o no.
La mejor manera que se me ocurre de arreglar el problema es recurrir a paneles, lástima que no lo pensé en su dia. Quiero averiguar si puedo evitar esa solucion ya que tendria que hacer una gran reforma en el código.
Agradeceria que me siguieran orientando.
Muchas gracias de nuevo a todo ustedes por su gran ayuda.
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola

CallSubDelayed es una combinación de StartActivity, StartService y CallSub. Así que no te vale, por que hará que se ponga en primer plano.
Si dices que la actividad 4 está como minimizada puedes emplear Callsub , la única condición es que el activity no tiene que estar en Pause, si lo está entonces te devuelve una cadena vacia. Eso tambien lo puedes saber asi:

B4X:
If IsPaused(activity4) = False Then CallSub(activity4, "NombreDelSub")

No se que estas haciendo, así que es dificil aconsejar, pero yo te recomiendo que ese sub que llamas lo pongas en un módulo de código o en un servicio, es muy facil, y te evitas los problemas de que tengan que estar activos o no los formularios.
En ese modulo o servicio empleas variables globales y podrás consultarlas desde donde quieras, tanto del activiy1 como del activity4, y tambien puedes crear eventos, asi que lo tienes todo. Dependiendo de tus necesidades te puede ir mejor un módulo de código o un servicio.
A veces te ahorras mucho tiempo haciendo una buena planificación desde un principio y no por no cambiar algo que has echo te complica todo luego. Nos pasa a todos,que tenemos algo que nos va bien pero nos cuesta cambiarlo a otro sitio por no reescribir código, pero a la larga si lo haces te puede valer para otras aplicaciones.

Saludos
 
Top