Gambas-it

Gambas3 => Programmazione => Topic aperto da: akrobaticone - 10 Aprile 2020, 12:54:21

Titolo: [RISOLTO] Replicare gruppo di controlli
Inserito da: akrobaticone - 10 Aprile 2020, 12:54:21
Ciao
in un form dovrei replicare un gruppo di controlli piu volte
un paio di label con una textbox, uno spin box e una casella di spunta
essi costituiscono un gruppo che a seconda delle esigenze va replicato piu volte
collocati in un contenitore per esempio
si riesce a riunire i controlli e con una unica replica creare altri gruppi?
spero la domanda non sia troppo contorta...
Titolo: Re:Replicare gruppo di controlli
Inserito da: kicco - 10 Aprile 2020, 13:58:37
in un form dovrei replicare un gruppo di controlli piu volte
immagino da codice...
 :ciao:
Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 10 Aprile 2020, 14:09:14
in un form dovrei replicare un gruppo di controlli piu volte
immagino da codice...
 :ciao:
si per evitare molte linee di codice in piu

magari creando un nuovo oggetto che ingloba gli altri?
Titolo: Re:Replicare gruppo di controlli
Inserito da: kicco - 10 Aprile 2020, 16:20:16
Creare una classe costituita da un contenitore con i controlli e poi istanziare gli oggetti?
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 10 Aprile 2020, 16:54:44
Ciao Akro,
ero in altre mansioni affaccendato..

Prova questo codice:

Codice: [Seleziona]
' Gambas class file

Private hvBox As VBox
Private hHBox As HBox
Private hLabel As Label
Private hTextBox As TextBox
Private hCheckBox As CheckBox
Private hSpinBox As SpinBox

Public Sub Form_Open()

  Me.Arrangement = Arrange.Vertical
  Me.AutoResize = True
  Me.Margin = True
  Me.Spacing = True
  Me.Resizable = False
  CreaGruppo("txtName1", "Pippo", "txtSurname1", "Pluto")
  Me.Show
  Wait 2
  CreaGruppo("txtName2", "Topolino", "txtSurname2", "Minni")
  Wait 2
  CreaGruppo("txtName3", "Paperino", "txtSurname3", "Gastone")

End

Private Sub CreaGruppo(sName1 As String, sTag1 As String, sName2 As String, sTag2 As String)

  hvBox = New VBox(Me) 'As "VBox1"
  hvBox.AutoResize = True
  hvBox.Spacing = True
  hvBox.H = 120
  hvBox.W = 520
  hHBox = New HBox(hvBox) 'As "HBox1"
  hHBox.Spacing = True
  hHBox.H = 32
  hHBox.W = 512
  hLabel = New Label(hHBox) 'As "Label1"
  hLabel.AutoResize = True
  hLabel.Text = "Nome"
  hTextBox = New TextBox(hHBox) As "txtName"
  hTextBox.Expand = True
  hTextBox.Name = sName1
  hTextBox.Tag = sTag1
  hLabel = New Label(hHBox) 'As "Label2"
  hLabel.AutoResize = True
  hLabel.Text = "Cognome"
  hLabel.AutoResize = True
  hTextBox = New TextBox(hHBox) As "txtSurname"
  hTextBox.Expand = True
  hTextBox.Name = sName2
  hTextBox.Tag = sTag2
  hHBox = New HBox(hvBox) 'As "HBox2"
  hHBox.Spacing = True
  hHBox.H = 32
  hHBox.W = 512
  hCheckBox = New CheckBox(hHBox) 'As "CheckBox"
  hCheckBox.Text = "Spunta questo"
  hCheckBox.AutoResize = True
  hLabel = New Label(hHBox) 'As "Label3"
  hLabel.Expand = True
  hLabel.Alignment = Align.Right
  hLabel.Text = "Scegli un numero"
  hSpinBox = New SpinBox(hHBox) 'As "SpinBox1"
  hSpinBox.W = 136
  hSpinBox.MinValue = 0
  hSpinBox.MaxValue = 12000

End

Public Sub txtName_MouseDown()

  Print Last.Name;; Last.Tag

End

Public Sub txtSurname_MouseDown()

  Print Last.Name;; Last.Tag

End

E vedi se ti va bene...

 :ciao:

PS: Apportati dei cambiamenti
Titolo: Re:Replicare gruppo di controlli
Inserito da: cogier - 10 Aprile 2020, 17:29:15
Prova questo codice

(http://www.cogier.com/gambas/Repica.png)


Titolo: Re:Replicare gruppo di controlli
Inserito da: vuott - 10 Aprile 2020, 17:33:00
...ovviamente il codice di Gianluigi era meramente esemplificativo, indicativo, concettuale.
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 10 Aprile 2020, 18:09:23
...ovviamente il codice di Gianluigi era meramente esemplificativo, indicativo, concettuale.

 :)  :ciao:
Titolo: Re:Replicare gruppo di controlli
Inserito da: kicco - 10 Aprile 2020, 18:34:24
Non riesco a capire dov'è l'errore nella Caption del Form "REPICA".
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 10 Aprile 2020, 19:02:32
Credo che manchi una libreria .gambas che si è scordato di allegare, ma basta rimuoverla

 :ciao:
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 10 Aprile 2020, 22:40:48
Ho apportato dei cambiamenti al codice per renderlo più comprensibile... spero.

 :ciao:
Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 11 Aprile 2020, 08:54:10
Grazie a tutti per le risposte
il concetto ora è chiaro ed è proprio quello di cui avevo bisogno
confesso che ho sempre tralasciato di approfondire come funzionano i contenitori, ma mi rendo conto che sono importanti

@Kicco
nelle proprietà del progetto hai scritto "Repica"


Titolo: Re:Replicare gruppo di controlli
Inserito da: kicco - 11 Aprile 2020, 09:27:09
@Kicco
nelle proprietà del progetto hai scritto "Repica"
:ok: Giusto! Ecco dov'era!
Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 11 Aprile 2020, 11:24:48
ora un passo in piu
supponiamo di utilizzare un button per creare i gruppi uno alla volta e aggiungerli al form
ora vorrei con un altro button eliminarli uno alla volta
quindi dovrei eliminare i contenitori hbox precedentemente creati
Per individuali potrei fare una cosa del genere
Codice: [Seleziona]
  Dim x As Control
 
  For Each x In Me.Controls
   
    If x.name = "Hbox" & contatore
    Then
  Next

dopo il Then?
Titolo: Re:Replicare gruppo di controlli
Inserito da: cogier - 11 Aprile 2020, 15:02:51
Ecco la versione 2

(http://www.cogier.com/gambas/Repica2.png)

Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 11 Aprile 2020, 15:34:40
Grazie Cogier

Codice: [Seleziona]
    HBOxes[iCount - 1].Delete
    HBOxes.Pop

il pezzo che mi mancava

 :ok:
Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 12 Aprile 2020, 09:38:09
Da cosa nasce cosa
il form ha dimensioni predefinite, ma se si volesse ridimensionarlo in funzione del contenuto?
ho giocato con autoresize ed expand, ma non ottengo cio che desidero

buona pasqua

EDIT:
cose strane
con la proprieta autoresize di VBoxctrl su true ogni volta che premo  al suo interno non vedo nulla
Se setto expand su true ogni volta che premo + VboxCtrl si accorcia, cioè la proprietà height diminuisce
Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 12 Aprile 2020, 10:07:21
Dopo un po di prove ho concepito una cosa del genere
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 12 Aprile 2020, 14:07:13
Vedi allegato
Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 13 Aprile 2020, 08:18:58
Grazie Gianluigi
quindi è la proprietà Spacing che deve essere true
il resto del codice è molto piu semplice e funzionale
toglimi una curiosità
nella textbox la proprietà expand su true? 
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 13 Aprile 2020, 11:23:22
Grazie Gianluigi
quindi è la proprietà Spacing che deve essere true
il resto del codice è molto piu semplice e funzionale
toglimi una curiosità
nella textbox la proprietà expand su true?

Expand sulla textbox è solo per farti vedere che la TextBox occupa tutto lo spazio rimanente, in questo caso, trattandosi di arrangment orizzontale, quello in larghezza.
Era solo come dimostrazione.
I contenitori che normalmente influiscono sui controlli figli, se posti ad autoresize vengono invece influenzati da essi, l'autoresize della form occorre usarlo con attenzione e usare la proprietà expand per la text può essere dannoso oltre a portare a un layout poco piacevole se posti il resto dei controlli di HBox ad autoresize.
Se distribuisci la tua applicazione, occorrerebbe sempre fare le prove con dei font di diverso formato e vedere dove e come intervenire.
Ad esempio in questo caso si potrebbe provare a dare ai controlli interni le corrette misure atte a contenere tutti i dati con il font corrente, porre gli HBox su autoresize e ottenere dal font un fattore di proporzione che andrà a moltiplicare l'altezza e la larghezza dei controlli (Print Me.Font.Size).
Potrebbe essere anche più semplice porre tutto su autorezize tranne le textbox che non ce l'hanno dandogli delle misure molto abbondanti tenendo conto di possibili utenti ipovedenti o usare solo li il fattore di proporzione.
Un'ultima cosa, la proprietà padding nel caso di autoresize dei controlli può essere molto utile, provala magari a 5.

Ammesso che questo pistolotto abbia una morale o solo un senso questo è: fai molte prove sul disegno della finestra prima di iniziare a scrivere codice altrimenti potresti pentirti.

 :sleepy:
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 13 Aprile 2020, 17:24:35
Allego un progetto esplicativo di quanto detto sopra.

 :ciao:
Titolo: Re:Replicare gruppo di controlli
Inserito da: akrobaticone - 15 Aprile 2020, 12:23:39
Funziona bene
quindi trovi il font ottimale per l'applicazione e ridimensioni tutto con un fattore proporzionale a quello ideale
Con quest'ultima penso di aver avuto tute le informazioni necessarie

Grazie a tutti
Titolo: Re:Replicare gruppo di controlli
Inserito da: Gianluigi - 15 Aprile 2020, 14:37:36
quindi trovi il font ottimale per l'applicazione e ridimensioni tutto con un fattore proporzionale a quello ideale

Tanto per essere ancora più chiari, impostando una finestra con Autoresize = True e Resizable = False,  tu dai alla finestra un'impostazione rigida anche se questa (qui) si adatta a tutti i vari temi con relative misure.
Piccola divagazione,  come ben sai ci sono alcuni utenti che hanno temi particolari, in Linux sono molto in voga i temi dark e allora cambiare i colori non è mai cosa saggia perché potresti trovarti con un colore chiaro su sfondo chiaro o viceversa, a meno che non usi colori generici per tutti i cambiamenti tipo LightBackground, ButtonForeground ecc.

Stessa cosa vale per le misure, una data misura in altezza e larghezza di un controllo che sul tuo desktop contiene benissimo quanto deve essere li immesso potrebbe risultare insufficiente se un tuo utente usa un tema personalizzato con caratteri più grandi, magari in grassetto ecc. Anche viceversa se usa caratteri molto piccoli perché, beato lui, ha una vista da aquila.

Quindi, in questo caso specifico (finestra che si auto imposta rigidamente) per essere sicuro che il tuo utente veda bene tutto come vedi tu, occorre dare ai controlli uno spazio sufficiente anche al grassetto e poi proporzionare in base alle misure del carattere da lui usato.

Il fattore lo ottieni dividendo la dimensione del suo carattere con il valore della dimensione del tuo.

Ricorda che qui parliamo di una finestra che si adatta ai suoi controlli, mentre di norma è l'opposto.

Ci vuole un po ad abituarsi al comportamento dei vari contenitori e all'influenza che essi hanno sugli altri contenitori e sui controlli in base a come vengono impostati.
Un buon sistema per imparare è quello si dare colori diversi ai contenitori e ai controlli e poi cambiando le varie impostazioni vederne il comportamento.

Siamo in Linux non in Windows e ogni tema ha impostazioni diverse se vuoi che io veda le tue finestre esattamente come le vedi tu non hai altra strada che questa.

Sia chiaro che anch'io sto imparando  ;D