Italian Creare evento in libreria

ivanomonti

Expert
Licensed User
Longtime User
ciao ragazzi non ricordo più come creare un evento di un bottone in libreria per poi essere richiamato da un progetto come semplice

B4X:
sub button_click

end sub

non ricordo se questo CallSubDelayed2 o altro io ho scritto questo ma mi va in crash


B4X:
Sub b_Click
    Dim b As Button
    b = Sender
    CallSubDelayed2(ac, "MenuFor_Click", b)
End Sub

Avete voglia di svegliare la mia memoria :-(
 

LucaMs

Expert
Licensed User
Longtime User
ciao ragazzi non ricordo più come creare un evento di un bottone in libreria per poi essere richiamato da un progetto come semplice

B4X:
sub button_click

end sub

non ricordo se questo CallSubDelayed2 o altro io ho scritto questo ma mi va in crash


B4X:
Sub b_Click
    Dim b As Button
    b = Sender
    CallSubDelayed2(ac, "MenuFor_Click", b)
End Sub

Avete voglia di svegliare la mia memoria :-(


Va quasi bene. Non funziona perché tu passi b che è un button come parametro.
B4X:
Sub b_Click
    CallSubDelayed(ac, "MenuFor_Click")
End Sub
 
Last edited:

ivanomonti

Expert
Licensed User
Longtime User
Va quasi bene. Non funziona perché tu passi b che è un button come parametro.
B4X:
Sub b_Click
    CallSubDelayed(ac, "MenuFor_Click")
End Sub

stesso problema va in crash

parametri di classe

B4X:
Sub Class_Globals
    Private ac As Activity
    Private pn As Panel
    Private al As Int
End Sub

inserimento bottone dinamicamente

B4X:
    ' icona 1
    Dim xb As Button
    xb.Initialize("b")
    xb.Tag = "b1"
    xb.SetBackgroundImage(CreateScaledBitmap(b(0),64dip,64dip))
    pn.AddView(xb,xl,xt,xw,xh)

evento click del bottone dinamico

B4X:
Sub b_Click
    CallSubDelayed(ac, "MenuFour_Click")
End Sub

errore

applicazione B$A imlibrary si è bloccata in modo anomalo, uffa


CallSubDelayed(component as Object,Sub as String)

component = ???
Sub = nome del metodo

Io cosa necessito, un codice che sta nel tag del botton xb.Tag = "b1"

riesci a darmi altre info per cortesia... questa è una libreria non una classe nelprogetto, non vorrei che cambiasse qualcosa.
 

ivanomonti

Expert
Licensed User
Longtime User
allora se uso questo codice nel progetto e non nella libreria va benissimo

B4X:
Sub b_Click
    Dim b As Button
    b = Sender
    Dim value As Object
     value = b.tag
    CallSubDelayed2 (Main, "MenuFour_Click",value)
End Sub

Ma io ho bisogno di metterlo dentro in una libreria e questo crea il crash
 

LucaMs

Expert
Licensed User
Longtime User
Un progetto può essere compilato come libreria.

Quando dici che nel progetto funziona, intendi dire sempre all'interno di una classe?

Poi, nell'ultimo codice che hai postato usi Main... sicuro che "ac" contenta il riferimento ad un'activity (o pannello)?

Come e dove usi "pn"?




Normalmente, nelle classi io uso:
B4X:
Private mCallback As Object ' nella Class_Globals
Private mEventName As String ' nella Class_Globals

Public Sub Initialize (Callback As Object, EventName As String)
mCallback = CallBack
mEventName = EventName
'...
End Sub

Private Sub Button1_Click
   If SubExists(mCallback, mEventName & "_Click") Then
     CallSubDelayed(mCallback, mEventName & "_Click")
     ' oppure CallSub(mCallback, mEventName & "_Click")
   End If
End Sub

Nell'Activity che userà quella classe (che sia inserita in una libreria o meno non cambia):
B4X:
Private OggettoTipoMiaClasse As MiaClasse
OggettoTipoMiaClasse.Initialize(Me, "NomeEvento")

Public Sub NomeEvento_Click
End Sub

(spero di non aver commesso errori perché l'ho scritto direttamente qui)
 

ivanomonti

Expert
Licensed User
Longtime User
pn è un pannel che uso come form, in questo modo posso creare il mio form e poi passarlo e distruggerlo a mio piacere, evito di creare attività diverse e uso di batteria, creo e distruggo, per il mio problema in effetti non passavo un parametro (me)
 

ivanomonti

Expert
Licensed User
Longtime User
Ecco il Risultato, ovviamente una cosa banalissima ma carina, è possibile migliorare alcune cose ma già così credo possa diventare utile.

trovi un progetto, la libreria e una class MenuFour con il sorgente base, dove puoi leggere come uso pn :)

grazie come sempre per il tuo aiuto
 

Attachments

  • Examples IMMenuLibrary v1.zip
    447 KB · Views: 241
  • 10710879_781778525219589_1779721222627156871_n.jpg
    10710879_781778525219589_1779721222627156871_n.jpg
    25.9 KB · Views: 249
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ecco il Risultato, ovviamente una cosa banalissima ma carina, è possibile migliorare alcune cose ma già così credo possa diventare utile.

trovi un progetto, la libreria e una class MenuFour con il sorgente base, dove puoi leggere come uso pn :)

grazie come sempre per il tuo aiuto


Figurati, dobbiamo aiutarci tra noi.

Piuttosto, a me non funziona. Forse perché ho una versione di B4A vecchia (la 3.00)?
Chiaramente ho ricreato il progetto, non potendo avviare il tuo, ma penso che sia il fatto che tu abbia compilato la libreria con una versione più recente di B4A.

La stessa cosa era successa per la libreria di un altro membro, il quale ha risolto, ma senza dire come. Eventualmente poi cercherò il thread.

L'errore (ma qui penso che servirebbe l'aiuto di Erel, che non legge i forum stranieri, per quanto ne so):
java.lang.NoSuchMethodError: anywheresoftware.b4a.BA.isShellModeRuntimeCheck


[P.S. Trovato il thread, peccato che ero convinto di avere la 3.20, quando ho posto quella domanda :D]
 
Last edited:

ivanomonti

Expert
Licensed User
Longtime User
bomba ancora

Code

B4X:
Private Sub bt_Click
   Dim bt As Button = Sender
   Dim Value As Object
   Value = bt.tag
   If SubExists(mCallback, mEventName & "_Click") Then
     CallSubDelayed2(mCallback, mEventName & "_Click",Value)
   End If
End Sub

Errore....

B4X:
java.lang.Exception: Sub menudinamic_click signature does not match expected signature.
public static anywheresoftware.b4a.pc.RemoteObject b4a.example.main_subs_0._menudinamic_click() throws java.lang.Exception

Perchè uffa!!!!!
 
D

Deleted member 103

Guest
Come è il nome della Sub che chiami e il tipo di parametro?
 

ivanomonti

Expert
Licensed User
Longtime User
B4X:
    Dim c As MenuDinamic
    c.Initialize(Me,Activity,bt,lb,0,"MenuDinamic")


la classe quando viene istanziata

B4X:
'Class module
Sub Class_Globals
    Private ac As Activity
    Private mCallback As Object
    Private pane As Panel
    Private al As Double
    Private mEventName As String
End Sub

Public Sub Initialize(M As Object, A As Activity, B() As Bitmap, L() As String, Alfa As Int, EventName As String)
 
    mCallback = M
    ac = A
    mEventName = EventName
 
    Dim xw,xh,xl,xt,space,panexw As Int
 
    xw = 64dip
    xh = xw
    xl = space
    xt = 0

    pane.Initialize("pane")
    pane.Color = Colors.ARGB(Alfa,255,255,255)
 
    xPanelAnimation(pane)
 
    ac.AddView(pane,5%x,(98%y)-(xh),90%x,xh)

    xw = (pane.Width-((20%X/B.Length)*B.Length)) / B.Length ' ridimensiona altezza e larghezza button
    xh = xw
    xl = ((pane.Width- xw*B.Length )/2)-(3dip*B.Length) ' trova il centro di tutto
    xt = ((pane.Height-xh)/2)
 
    For i = 0 To B.Length-1
        Dim xb As Button
        xb.Initialize("bt")
        xb.Tag = i
        xb.Tag = L(i)
        xb.SetBackgroundImage(CreateScaledBitmap(B(i),xw,xh))
        pane.AddView(xb,xl,xt,xw,xh)
        xl = xl + 2.5%x + xw
    Next
 
End Sub

Private Sub xPanelAnimation(v As View)
    Dim a1 As Animation
    a1.InitializeAlpha("",0,1)
    a1.Duration=1000
    a1.Start(v)
End Sub

Private Sub xPanelCloseAnimation(v As View)
    Dim a1 As Animation
    a1.InitializeAlpha("a1",1,0)
    a1.Duration=1500
    a1.Start(v)
End Sub

Sub a1_AnimationEnd
    For i = 0 To ac.NumberOfViews-1
        If ac.GetView(i).tag = "pn" Then
            ac.RemoveViewAt(i)
            Return
        End If
    Next
End Sub


Private Sub CreateScaledBitmap(Original As Bitmap, Width As Int, Height As Int) As Bitmap
   Dim r As Reflector
   Dim b As Bitmap
   Dim filter As Boolean: filter=True
   b = r.RunStaticMethod("android.graphics.Bitmap", "createScaledBitmap", _
   Array As Object(Original, Width, Height, filter), _
   Array As String("android.graphics.Bitmap", "java.lang.int", "java.lang.int", "java.lang.boolean"))
   Return b
End Sub

Private Sub bt_Click
    Dim bt As Button = Sender
    Dim Value As Object
     Value = bt.tag
    If SubExists(mCallback, mEventName & "_Click") Then
        CallSubDelayed2(mCallback, mEventName & "_Click",Value)
    End If
End Sub

quando richiamo il metodo ereditato

B4X:
Sub MenuDinamic_Click
    Dim xb As Button = Sender
    Msgbox(xb.tag,"Message")
End Sub

sicuramente sbaglio nel passare Object
 
D

Deleted member 103

Guest
Prova così
B4X:
Private Sub bt_Click
  Dim bt As Button = Sender
  Dim Value As Object
  Value = bt
  If SubExists(mCallback, mEventName & "_Click") Then
    CallSubDelayed2(mCallback, mEventName & "_Click",Value)
  EndIf
End Sub
Sub MenuDinamic_Click( Value as Objekt)
    Dim xb As Button = Value
    Msgbox(xb.tag,"Message")
End Sub
 

ivanomonti

Expert
Licensed User
Longtime User
cazzo sei un mitico io mi perdo in cretinate che ha volte non so nemmenocome faccio.

Grazie Filippo
 

LucaMs

Expert
Licensed User
Longtime User
Ivano, il messaggio di errore:
java.lang.Exception: Sub menudinamic_click signature does not match expected signature.

significa che la routine ha una "signature" diversa (urgh non so come spiegare, hehehe) da come l'hai chamata.

Insomma, la signature è la prima riga della routine, l'ingresso.
 
Top