Italian Domanda per programmatori

dragonblu19

Member
Licensed User
@sager
Lo devi selezionare se vuoi che il Designer crei per te la Sub per gestire la selezione di un elemento dallo Spinner
Su questo credo sia meglio tornarci su quando arriveremo ad impararlo (anche perchè non ho capito molto 😓 )

PS: @Sagenut @ivanomonti non mi dite male, ma dopo 2 ore che tentavo di usare il benedetto codice, non sono riuscito a creare nemmeno l'ombra di un bottone😭. Infine, in preda alla disperazione ho usato il designer. Ma guardando il lato positivo della cosa, ho almeno fatto l'esercizio;).

Il termine Value (Value,Value,255-Value,255) nei colori, cosa sta ad indicare. Vi allego l'esercizio, datemi un parere.
 

Attachments

  • Esercizio.zip
    9.7 KB · Views: 186

LucaMs

Expert
Licensed User
Longtime User
Guardando quel video...

Un suggerimento anche per @dragonblu19: dai sempre nomi significativi alle variabili.

Non fare come Erel, che chiama sempre "1" il suo layout principale ed anche il progetto di esempio che pubblica (prima o poi gli sparerò per questa cosa 😄).

Per i layout, sarebbe utile (io perlomeno lo faccio) usare il prefisso "lay", quindi avrò il mio "layMain", poi magari un altro di nome "layAgenda".
Quando non era possibile raggruppare i file nel tab File, questo era molto utile perché comunque venivano visualizzati in ordine alfabetico, per cui avevo tutti i layout vicini tra loro, usando quel prefisso, così come i file Activity, ai quali dò sempre un nome con prefisso "actMain", "actAgenda", ...

[Il fatto che adesso nell'IDE sia possibile raggruppare file all'interno di gruppi personalizzati non cambia le cose, è sempre utilissimo sia dare sempre nomi significativi alle variabili, sia usare dei prefissi che ti indichino il tipo di contenuto]
 

LucaMs

Expert
Licensed User
Longtime User
Dato che Erel spiega in inglese, un punto importante potrebbe sfuggire a chi guardi quel video senza "ascoltare": i valori in percentuale usati nello script.

Ad esempio, lui ad un certo punto vuole posizionare un Button nel centro e scrive:

Button1.HorizontalCenter = 50%x
Button1.VerticalCenter = 50%y

Quelle percentuali, supponendo che stessimo creando un layout per B4A, non significano "il 50% della larghezza dell'Activity" ma "il 50% della larghezza del contenitore nel quale a runtime caricheremo quel layout".

Perciò, se quel layout lo caricheremo dentro un'Activity, esso starà proprio nel centro di questa, ma se nell'Activity avessimo due Panel e caricassimo quel layout nel primo dei due Panel, Button1 verrebbe visualizzato nel centro di questo Panel, non nel centro dell'Activity.

Quindi la "regola" è di ricordarsi che %x e %y, nello script si riferiscono al contenitore nel quale andremo a caricare il layout a runtime, e non all'Activity (B4A) o al Form (B4J).

P.S. Ho continuato a guardare il video e successivamente lui vuole centrare Button1 nel Pane1 e scrive del codice script per questo. Questa è una cosa diversa da quella che ho scritto sopra perché, ripeto, sopra mi riferisco ad un eventuale Panel (B4A - Pane B4J) nel quale venga caricato il layout a runtime, mentre in quel caso lui sta centrando il tasto all'interno di un Pane presente in quel layout (ed infatti non usa %x e %x, per farlo).
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Un'altra cosa che si può capire guardando quel video tutorial, è che... Erel ha perlomeno un gatto 😄

(il quale, tra l'altro, dev'essersi pappato i canarini che si sentivano in altri video tutorial e adesso non si sentono più 🤣)
 

LucaMs

Expert
Licensed User
Longtime User
Ecco, smanettando con gli script (usando B4J, che è più comodo per fare prove), ho scoperto che non è possibile fare una certa cosa strampalata che mi era venuta in mente (perlomeno non si può fare come ho tentato).

Mettiamo che io abbia un Button1 in fondo al layout, ancorato quindi al bordo inferiore ed anche a quello destro; si trovi, insomma, nell'angolo in basso a destra.
Voglio che se quello che sarà il suo contenitore quando caricherò il layout a runtime avrà una larghezza inferiore a 250dip, Button1 si "trasformi" e diventi verticale.

Mi spiego con due immagini:

Se il contenitore più largo di 250... Se invece fosse < 250 dip
1588905119040.png
1588905215337.png


Ho voluto provare se in uno Script si potesse scrivere qualcosa di questo tipo:
B4X:
If %x < 250dip Then
    ' Change Button1 orientation.

Ovvero: "Se la larghezza del contenitore del layout sarà inferiore a 250dip, cambia forma (orientamento) a Button1".

Bene, non funziona, nel senso che lo Script non accetta quel %x (che era proprio una mia curiosità, vedere se lo avrebbe accettato).

Adesso, forse mi metto a ragionare su come dovrei fare per ottenere quel "comportamento" (probabilmente dovrò usare due Variant).
Che io trovi la soluzione (o una soluzione) o meno, è probabile che sottoporrò la questione anche ad Erel (ed agli altri membri degli altri forum)... sempreché Erel non legga anche questo :) (Klaus, poliglotta esperto di grafica e percentuali, a volte legge anche il forum italiano, chissà...).
 

LucaMs

Expert
Licensed User
Longtime User
Ho trovato immediatamente una soluzione al problema di cui al post preDecente, anche non se "pulitissima", ovvero usando un "trucchetto".

Usare un altro Variant temo che non mi avrebbe risolto il problema, in quanto non avrei potuto verificare ed utilizzare la misura precisa 250dip.
Ho aggiunto al layout una Label (nome: lblMeasWidth), resa invisibile ed ancorata orizzontalmente; la sua larghezza a runtime sarà quindi uguale a quella del contenitore del layout, dunque nello script potrò scrivere:
B4X:
w = Button1.Width
h = Button1.Height
RightDist = Button1.Right
BottomDist = Button1.Bottom

If lblMeasWidth.Width < 250dip Then
    ' Change Button1 orientation.
    Button1.Width = h
    Button1.Height = w
    Button1.Right = RightDist
    Button1.Bottom = BottomDist
End If

1.gif


(ovviamente dovrei cambiare anche l'orientamento del testo, ma mi interessava solo la prima cosa, ovvero verificare se l'interprete dello Script avrebbe accettato quel "If %x < 250dip")
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Come direbbe l'Emilio: "Che figura di m..."

Non serve aggiungere quella Label per "conoscere a runtime" la larghezza del contenitore (la View in cui caricheremo il nostro layout), è sufficiente usare 100%x in quella riga:

B4X:
If %x < 250dip Then
' Change Button1 orientation.
B4X:
If 100%x < 250dip Then
' Change Button1 orientation.

Erel ha risposto a questo, alla mia domanda nel forum B4J.

Si vede che stavo dormendo... in piedi? Che figuraccia 😄
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Infine, in preda alla disperazione ho usato il designer. Ma guardando il lato positivo della cosa, ho almeno fatto l'esercizio;).
Hai fatto benissimo ad usare il Designer.

Quando crei un layout nel Designer, puoi verificare come verrebbe con dispositivi con diversi "tipi" di display (dimensioni-risoluzione):
1588922492014.png


Selezioni ad esempio: 7" Tablet (portrait) e vedi come verrebbe su quel tipo di display.

Nel caso del tuo layout avresti dovuto usare gli "ancoraggi" (anchor) sulle View che stanno sulla destra:
i due button, impostare ancoraggio a destra:
1588922639996.png


Anche per le seekbar avresti potuto farlo, ma per queste (in questo caso) meglio ancora impostare entrambi i lati ancorati:
1588922876972.png



Prova ad impostarli così e poi a cambiare la selezione in alto, come detto prima, per vedere come verrebbe su vari display.
 

LucaMs

Expert
Licensed User
Longtime User
Il progetto, a parte quell'allineamento e.... i nomi delle view!!! (non sarebbe più leggibile se, ad esempio, avessi chiamato le seekbar:
skbColoreTesto, skbColoreButton o simili? Così le routine (sub) evento collegate a queste view-seekbar, si chiamerebbero:
Sub skbColoreTesto_ValueChanged (Value As Int, UserChanged As Boolean)

Il termine Value (Value,Value,255-Value,255) nei colori, cosa sta ad indicare.
Il Value, stando tra le parentesi dopo il nome di una routine (Sub), è un parametro.
E' un valore che la routine riceve da chi la chiama - in questo caso viene chiamata dal sistema, in quanto la routine è una "routine di evento", che in questo caso viene mandata in esecuzione quando fai qualcosa su una view, come spostare il cursore della seekbar.
Value è il valore attuale della seekbar.

Anche quando le routine non sono routine-evento, ma sono routine chiamate-lanciate-eseguire da te, possono avere (e di solito hanno) uno o più parametri. Esempio facile facile:
B4X:
Sub FaiLaSomma(Valore1 As Int, Valore2 As Int)
    Dim Totale As Int = Valore1 + Valore2
    Log("Il totale di " & Valore1 & " + " & Valore2 & " è: " & Totale
End Sub
Nel progetto userai quella routine così:
B4X:
FaiLaSomma(5, 7)
e nella finestra del Log vedrai il testo che il comando Log scrive.

Quindi, FaiLaSomma è una routine (chiamata anche "metodo"), Valore1 e Valore2 sono i parametri.
Anziché fare scrivere il risultato nella finestra dei Log, cosa utile solo per cercare i difetti nel tuo progetto (= fare il debugging del progetto), sarà più utile ottenere il totale ed usarlo in altre parti del codice. Per fare questo, si deve trasformare il metodo (la routine) in una funzione, ovvero un metodo che restituisce un valore.

B4X:
Sub FaiLaSomma(Valore1 As Int, Valore2 As Int) As Int '<--- questo indica che questa funzione FaiLaSomma restituirà un valore di tipo numerico Intero.
    Dim Totale As Int = Valore1 + Valore2
    Return Totale ' <--- "restituisce" il risultato a chi utilizzi la funzione FaiLaSomma
End Sub

B4X:
Dim TotaleSpeseDiAntonio As Int = FaiLaSomma(5, 7)
Dim TotaleSpeseDiMaria As Int = FaiLaSomma(123, 5392)
Log("Totale spese di Antonio = " & TotaleSpeseDiAntonio")
Log("Totale spese di Maria = " & TotaleSpeseDiMaria")

Ovviamente Maria, essendo donna, ha speso molto di più 😄
 

Sagenut

Expert
Licensed User
Longtime User
L'esercizio dell'aggiungere 8 button via codice non era finalizzato a creare interfacce senza usare il Designer.
Era per vedere se aveva capito qualcosa dall'esempio precedente che, anche se realizzabile in maniera più semplice e giusta tramite un ulteriore Layout, mostrava proprio come aggiungere delle View da codice.
Volevo vedere se riusciva a capire il concetto esposto ed applicarlo ad un contesto lievemente diverso.
Inoltre mi aspettavo che risolvesse l'esercizio in un certo modo, diciamo errato anche se funzionante, per poi introdurlo ai cicli.
@dragonblu19 se in un progetto vuoto aggiungi questo
B4X:
Dim btn As Button
btn.Initialize("giusto")
btn.Text = "IO SONO IL NUMERO 0"   
btn.TextColor = Colors.Black
Activity.AddView(btn, 0, 0, 200, 50)
nella Activity_Create non vedi crearsi un Button sulla APP?
 

Sagenut

Expert
Licensed User
Longtime User
Il progetto, a parte quell'allineamento e.... i nomi delle view!!! (non sarebbe più leggibile se, ad esempio, avessi chiamato le seekbar:
skbColoreTesto, skbColoreButton o simili? Così le routine (sub) evento collegate a queste view-seekbar, si chiamerebbero:
Sub skbColoreTesto_ValueChanged (Value As Int, UserChanged As Boolean)
E anche di questo ne avevamo parlato, no? ;)
Consiglio per i nomi delle View:
per rendere più comodo e logico gestire le varie View può essere utile assegnare uno stesso prefisso a seconda del tipo di View (btn per i Button, lbl per le Label, iv per le ImageView e via dicendo) seguito da qualcosa di logico che indichi a cosa serve.
Nel tuo esempio sarebbe stato comodo chiamare i 4 button così:
btnScrivi
btnCancella
btnColora
btnCopia
In questo modo quando dovrai digitare il nome di qualche View nel codice filtrerai la scelta ai soli oggetti di quel tipo e sarà più facile trovarli.
Non è obbligatorio ma è una ottima prassi.
@dragonblu19 non devi seguirci a ruota libera.
Fermaci se ti blocchi su qualcosa, facciamo chiarezza.
E' inutile andare avanti fino a quando non senti di aver acquisito una cosa.
Anche se riesci a fare un esercizio fai domande se ne hai, è importante.
 

ivanomonti

Expert
Licensed User
Longtime User
@dragonblu19, bene era qui che ti volevo "Il termine Value (Value,Value,255-Value,255)" questi punti sono la base di tante cose, se non conosi i significati la cosa comincia a diventare più complessa.

1) SeekBar in sostanza e solo una slidebar cioè un oggetto che ti consegna (Value) il minimo (Min) o il massimo (max), il cursore che si muove determina il valore in uscita per l'appunto il value.

2) ARGB o RGB sta per Alfa (trasparenza) + Rosso (Red) + Verde (Green) + Blu (Blue), tutti i valori (value) sono composti da 0-255, la combinazione fra loro fanno milioni (16.581.375) di colori possibili il calcolo è semplice ((255*255)*255 = 16.581.375) non devi ricordarti il conto ma come usare certi valori.


Ora la mia domanda sono le seguenti, dici che sei un bambino che deve imparare a leggere e che non vuoi i compiti già fatti ma poi per la gentilezza degli insegnanti ne hai esempi strafatti e basilari, ovvio che ogni insegnante ti da il suo pane, fatto da lui e cotto da lui...

1) perchè cazzo usi B4A che è più complesso in termini di risultati e anche di scrittura, visto che non hai idea che cos'è il Value?
2) sai cosa vuol dire OO,OOP e via discorrendo?
3) quanti sono gli oggetti per la GUI (Graphic User Interface)?
4) li hai usati tutti smontandoli (vuol dire studiando il suo utilizzo) esempio la seekbar di android dove B4A la semplificata al massimo.
5) hai fatto una bozza su carta prima di passare al codice?
6) e ultima sai che tipo di linguaggio stai usando? Basic, visualBasic, C++, C#, Java, Pinton... (ma io fare una scarrellata a vedere quale sono le differenze fra loro.


B4X:
If dragonblu19 = 0 then
  Exit
Else If dragonblu19 = 20 then
  go to basic
Else If dragonblu19 = 50 then
  :)
Else If dragonblu19 = 100 then Exit
  go star
end if

Non sarebbe male fare un piccolo tools di valutazione hahahahah, se vuoi imparare prima che tu venga abbandonato a te stesso, fermati un secondo, risponditi alle domande e fai una scelta, perché se non conosci ABC di un linguaggio e non vai a leggerti qualche riferimento e continui a chiedere senza inquadrare le risposte e gli esempi tra un secolo siamo ancora qui.

Oggi corsi individuali (personal trainer informatico) hanno un costo che aggira tra 1500€ anche fino a 4000€, qui lo stiamo facendo a gratis, ma ho prendi la strada devota e studi almeno le basi dell'ABC informatico (seekBar.Value) ho meglio abbandonare.

Ti vedo volenteroso e cazzuto, quindi credo che andrai avanti, ma ripeto è non volermi male, l'informatica la si ha dentro o la si studia veramente. Tutto il resto non conta un cazzo.


B4X:
Public Sub mMenu_menu(mMenuBar As MenuBar,title As String, Args() As String)
    Dim mMenu As Menu
    mMenu.Initialize(title,"")
    mMenu.Tag=title
    mMenuBar.Menus.Add(mMenu)
    If Args(0)="" Then Return
    For i=0 To Args.Length-1
        Dim mi As MenuItem
        mi.Initialize(Args(i),"Actions")
        mi.Tag=Args(i)
        mMenu.MenuItems.Add(mi)
    Next
End Sub

Non avevo immagini belle da postare hahahahha
 

dragonblu19

Member
Licensed User
Il progetto, a parte quell'allineamento e.... i nomi delle view!!! (non sarebbe più leggibile se, ad esempio, avessi chiamato le seekbar:
skbColoreTesto, skbColoreButton o simili? Così le routine (sub) evento collegate a queste view-seekbar, si chiamerebbero:
Sub skbColoreTesto_ValueChanged (Value As Int, UserChanged As Boolean)
@LucaMs hai ragione, ma i nomi li ho messi cos' al volo senza modificarli per fare una prova, lo so che li avrei dovuti modificare

Anche se riesci a fare un esercizio fai domande se ne hai, è importante.
Non ho scritto tutto a codice però il risultato sembra giusto? NO?

ARGB o RGB sta per Alfa (trasparenza) + Rosso (Red) + Verde (Green) + Blu (Blue), tutti i valori (value) sono composti da 0-255, la combinazione fra loro fanno milioni (16.581.375) di colori possibili il calcolo è semplice ((255*255)*255 = 16.581.375) non devi ricordarti il conto ma come usare certi valori.
ARGB o RGB cosa siano, come sono composti e come si usano, questo lo so, la mia domanda era mirata al termine "Value" in particolare.

perchè cazzo usi B4A
Perchè è più mirato allo sviluppo di app...
sai cosa vuol dire OO,OOP e via discorrendo?
3) quanti sono gli oggetti per la GUI (Graphic User Interface)?
Più meno....
hai fatto una bozza su carta prima di passare al codice?
Di questo no...
e ultima sai che tipo di linguaggio stai usando?
Visual Basic??
fermati un secondo, risponditi alle domande e fai una scelta, perché se non conosci ABC di un linguaggio e non vai a leggerti qualche riferimento e continui a chiedere senza inquadrare le risposte e gli esempi tra un secolo siamo ancora qui.
Se fossi stato capace di farlo da solo... Per questo ho scritto sul forum...
studi almeno le basi dell'ABC informatico (seekBar.Value)
Ecco una delle cose che chiedevo, basi come questa che mi hai lincato non ne trovavo e nessuno me la indicava. Grazie per avermela data.
Ti vedo volenteroso e cazzuto, quindi credo che andrai avanti, ma ripeto è non volermi male, l'informatica la si ha dentro o la si studia veramente. Tutto il resto non conta un cazzo.
Io purtroopo da giovane ho sbagliato percorso di studi (avevo altre passioni ma non la voglia di studiare) e me ne rendo conto solo ora. Ho fatto l'alberghiero perchè non si studiava, ma posso rispondere alla tua affermazione sulle mie esperienze, ma anche tu non volermi male, tutti i grandi chef sono tali perchè hanno avuto grandi maestri.

Detto questo vi ringrazio cmq tutti per l'aiuto che mi state dando.
 

Sagenut

Expert
Licensed User
Longtime User
Non ho scritto tutto a codice però il risultato sembra giusto? NO?
Penso che tu ti riferissi alla Lezione che ti aveva dato @ivanomonti
Ci ho guardato di sfuggita perchè sinceramente non posso stare dietro anche a guardare cosa ti chiedono di fare altri e come viene fatto.
Io ti controllo quando mi proponi le cose che ti avevo chiesto io. :)
Comunque ho visto che qualcosa faceva quindi un risultato c'è.
La domanda è sempre una:
hai capito ciò che hai fatto?
O hai raggiunto il risultato ma non è chiaro cosa hai fatto in generale nel processo?
Qualche post indietro ti ho dato il pezzetto di codice che aggiunge una View da codice.
Aspetto ancora che mi mandi l'esercizio degli 8 button da codice che abbiano la scritta che cambia colore, che quindi è un mix dei miei 2 esempi che ti ho dato finora.
Se proprio mi dici che non ti è chiaro e non riesci và benissimo e ne parliamo quì.
Decidi tu ma secondo me è meglio se apri almeno 2 nuove discussioni:
1 dove segui le mie lezioni (se vogliamo chiamarle così)
1 dove segui quelle di @ivanomonti
Almeno rimangono divisi gli esercizi e le spiegazioni, altrimenti si crea davvero troppa confusione a mio parere.
 

LucaMs

Expert
Licensed User
Longtime User
@LucaMs hai ragione, ma i nomi li ho messi cos' al volo senza modificarli per fare una prova, lo so che li avrei dovuti modificare
Oh, di tutto quello che gli ho scritto, ha risposto solo su questo! Anche se:
la mia domanda era mirata al termine "Value" in particolare.
e:
Il Value, stando tra le parentesi dopo il nome di una routine (Sub), è un parametro.
E' un valore che la routine riceve da chi la chiama - in questo caso viene chiamata dal sistema, in quanto la routine è una "routine di evento", che in questo caso viene mandata in esecuzione quando fai qualcosa su una view, come spostare il cursore della seekbar.
Value è il valore attuale della seekbar.
E tutta la spiegazione su parametri, metodi (che tutti chiameranno erroneamente "Sub"), routine-evento, funzioni...

Basta, mi ritengo offeso :mad:

😄

In realtà è stato molto colpito dal delicatissimo post che gli ha dedicato Ivano, quindi ha pensato bene di rispondere dettagliatamente a quello.

Comunque, a me non servivano risposte, spero solo sia servito a lui ciò che ho scritto ;)
 

ivanomonti

Expert
Licensed User
Longtime User
mi tengo fuori dalle lezioni così non creo PANDEMIA hahahah
 
Top