Gambas-it

Gambas3 => Programmazione => Topic aperto da: eevan - 23 Maggio 2012, 12:06:34

Titolo: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: eevan - 23 Maggio 2012, 12:06:34
Rieccomi qui con un nuovo quesito.

È da un po' che cerco il modo di (come da titolo) bloccare gli oggetti( pulsanti, form e menate varie) nella finestra, in modo che quando il form viene ingrandito, essi rimangano nelle loro posizioni.

immagino che vadano inglobati in un contenitore o una cosa del genere...
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 23 Maggio 2012, 12:39:38
In realtà la Form è già un contenitore, per cui bisogna agire sulle sue proprietà, in modo che non faccia il resizing degli oggetti children.
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: eevan - 23 Maggio 2012, 12:58:52
ehh....
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 23 Maggio 2012, 13:49:45
"ehh..." in che senso? Non ha capito, oppure la cosa la vedi difficile?

In realtà è alquanto semplice, e basta leggersi un attimino la documentazione, o l'help in linea, sulle proprietà base di un container grafico, da cui è derivata anche la Form.
Di norma un contenitore ha la possibilità di agire sull'aspetto grafico sei suoi figli. Il contenitore, appunto, ha un'array che li referenzia.
Questo avviene tramite l'impostazione di alcune proprietà del contenitore, in modo da istruirlo a effettuare in runtime le modifiche necessarie ai suoi oggetti secondo determinate regole grafiche.
Gli oggetti figli, di conseguenza, ricevono dal parent, in container, le istruzioni necessarie, come ad esempio un resize, oppure un riposizionamento all'interno della pannello/area del contenitore.
Questo di norma è abilitato, ma è possibile indicare al singolo oggetto figlio di non accettare i comandi dal parent, mantenendo così il suo aspetto originale, così come l'hai impostato nell'editor dell'ide di gambas.
Puoi, altresì, dire al contenitore di non agire sui suoi figli, onde appunto evitare che spostino secondo le regole di cui sopra. Questo, ad esempio, è utile per rappresentare all'interno di una form un fax-simile di un documento stampabile, oppure anche utilizzare la stessa form come pagina di stampa.
Se invece vuoi condizionare secondo tue regole, la disposizione di determinati gruppi di oggetti, allora si può ricorrere a contenitori di tipo VBox/HBox, che a loro volta ricevono le istruzioni dal parent (es. la Form), ma agiscono indipendentemente dagli altri gruppi, riadattando i loro propri oggetti in modo separato. Oltre ai VBox/HBox, esistono anche altri oggetti di questo tipo, ma con caratteristiche particolari, come ad esempio i SidePanel, che al contrario hanno una loro rappresentazione visiva. VBox/HBox sono invece trasparenti.
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: eevan - 24 Maggio 2012, 13:55:10
sinceramente non è che abbia capito molto.

Dovrei fissare i componenti inglobandoli in un contenitore...

cioè, metti che ho un pulsante in basso a destra e volgio lasciarlo li anche durante il resize...
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 24 Maggio 2012, 16:13:10
Nel caso di posizionamento sui lati basso e destra, la cosa deve essere gestita in quanto, per logica, le coordinate iniziali partono da 0,0 ovvero in altro a sinistra, e quindi gli oggetti si agganciano a questa posizione.
Per poter spostare gli oggetti, durante il ridimensionamento della form, è necessario inserire nellla stessa un'ulteriore pannello, magari nascosto, ma che vada ad occupare, ridimensionandosi anch'esso, tutto lo spazio utile, ovviamente senza sovrapporsi al pulsante cui fai riferimento.
Per far questo puoi utilizzare: VBox e/o HBox (a seconda dei casi), che sono oggetti non visibili, ma impostandoli opportunamente si adattano espandendosi alle dimensioni del pannello client (ossia nell'area utile della form). Di conseguenza, il pulsante deve bloccare gli eventi di dimensionamento da parte del parent (la form), mantenendo quindi le sue proprie caratteristiche.
Con questi oggetti nascosti (V/HBox), puoi giocare con la presentazione della form.
Spesso, anzi normalmente, il pannello della form contiene svariati oggetti, che di solito vengono raggruppati logicamente, per cui utilizzando VBox, HBox, Panel, distanziatori e contenitori vari, puoi metterli dove vuoi. Utilizzando poi opportunamente le proprietà di ognuno, li puoi condizionare ulteriormente.

Adesso non ho sottomano Gambas, e la memoria, visto che ho il cervello in pensione, non mi regge, non ricordo esattamente le proprietà adatte, e non vorrei incasinarti le idee. Sicuramente puoi provare a leggere un pò in dettaglio le varie carrattersitiche degli oggetti che ti ho indicato, comprese le loro proprietà, e sicuramente provarle dal vivo, tanto al massimo non funzionano, e il computer non esplode...  ;D

Magari stasera posso darti indicazioni più precise, ma credo sia meglio che tu provassi direttamente, utilizzando questi miei pochi suggerimenti...
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: vuott - 24 Maggio 2012, 17:30:51
...forse  :-X anche così:

Codice: gambas [Seleziona]

Public Sub Form_Resize()
  
' in modo proporzionale:
  With Button1
    .X = ((FMain.W * 80) / 100) - Button1.W
    .Y = ((FMain.H * 80) / 100) - Button1.H
  End With
  
' in modo assoluto:
   With Button2
    .X = FMain.W - 100
    .Y = FMain.H - 100
  End With
  
End


Medesimo ragionamento se vuoi usare un contenitore, ad esempio un Panel. Inserisci il/i Button nel Panel, poi al posto del With Button porrai With Panel1.
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 25 Maggio 2012, 10:24:28
Lo spazio all'interno di un contenitore deve essere referenziato tramite le proprietà ClientH e ClientW.
Le proprietà W e H si riferiscono all'intero contenitore, inclusi margini, heade e quant'altro, quindi fare riferimento a questi due valori può portare a calcoli errati.
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: vuott - 25 Maggio 2012, 12:15:40
Lo spazio all'interno di un contenitore deve essere referenziato tramite le proprietà ClientH e ClientW.
Le proprietà W e H si riferiscono all'intero contenitore, inclusi margini, heade e quant'altro, quindi fare riferimento a questi due valori può portare a calcoli errati.
...ma mi pare di aver capito che eevan faccia riferimento all'intero contenitore-Form... o sbaglio ?  ???
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 25 Maggio 2012, 12:44:26
In realtà facevo riferimento al tuo esempio, in quanto per il pulsante usavi le coordinate della form, e non della sua area interna...  :-\
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: vuott - 25 Maggio 2012, 12:54:41
In realtà facevo riferimento al tuo esempio, in quanto per il pulsante usavi le coordinate della form, e non della sua area interna...  :-\
Ma, scusa, avendo posto (FMain.W * 80) / 100 e (FMain.H * 80) / 100, non faccio appunto riferimento alla sua area interna e non alle sue coordinate (che invece sarebbero: X ed Y) ?  :-\
Oppure tu fai riferimento all'area utile della Form ? Escludendo, così, "margini, heade e quant'altro". Però confesso che non mi viene in mente come individuare quest'area netta, utile... :-\ Puoi darmi qualche delucidazione ?

(Ahia ! Qua ci scappa qualche altra birra da pagare !  :hatecomputer: )
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 25 Maggio 2012, 13:34:00
Tanto ho il magazzino...per le birre...  ;D

Come avevo spiegato in post precedenti, l'area utile è identificabile tramite le proprietà ClientH/ClientW, oppure ClientWidth/ClientHeight.
Tramite queste proprietà puoi spostarti senza problemi nella zona assegnata agli oggetti figli del container.
Stessa cosa avviene per il posizionamento del margine Top/Left, che deve corrispondere come limite alle proprietà ClientX e ClientY. E' pur vero che questo sono sempre 0,0 e quindi non si hanno problemi.
Nel caso di una ScrollBox, questo è più accentuato a causa degli oggetti che sono già presenti nel container (es. le scrollbar laterali e in basso), e tenendo anche presente che l'area utile è più grande di quella visibile. In effetti ci sono due aree identificabili: l'area visibile e l'area di scroll (mediamente più grande). Le proprietà di individuazione sono perciò diverse. Per l'area visibile si utilizzano ScrollX/ScrollY/ScrollH/ScrollW, che hanno origine non più da zero, ma dalla posizione della zona all'interno dell'area totale. Invece per l'area totale si utilizzano le classiche ClientX/ClientY/ClientH/ClientW.
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: vuott - 25 Maggio 2012, 15:45:53
....l'area utile è identificabile tramite le proprietà ClientH/ClientW, oppure ClientWidth/ClientHeight.

Dunque... vediamo... allora i parametri dovrebbero essere impostati - nel mio esempio - così ?

Codice: gambas [Seleziona]

Public Sub Form_Resize()
 
' in modo proporzionale:
    With Button1
' le coordinate X ed Y del Button sono poste in un punto
' uguale alla differenza tra l'80% della dimensione dell'area "utile"
' del Form e la dimensione del Button medesimo:
      .X = ((FMain.ClientW * 80) / 100) - Button1.W
      .Y = ((FMain.ClientH * 80) / 100) - Button1.H
  End With

End


...va bene utilizzate così quelle proprietà ?   :-X
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 25 Maggio 2012, 16:23:32
Yes, anche se non ho compreso bene il perchè dell'operazione *80/100...

Se vuoi centrare il pulsante, basta che togli la dimensione del pulsante alla dimensione dell'area, e lo dividi per due...
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: vuott - 25 Maggio 2012, 17:38:44
Yes, anche se non ho compreso bene il perchè dell'operazione *80/100...
Se vuoi centrare il pulsante, basta che togli la dimensione del pulsante alla dimensione dell'area, e lo dividi per due...

Infatti non avevo pensato di centrarlo !   ;D  ...perdi una bottiglia di birra !  :P


Comunque, caro md9327, grazie per il suggerimento e la spiegazione: si è imparata un'altra cosa.  :coder:
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: sotema - 25 Maggio 2012, 23:49:30
Qui più che imparare si diventa alcolisti   :rolleyes:
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: vuott - 26 Maggio 2012, 12:13:52
Qui più che imparare si diventa alcolisti   :rolleyes:
...è quello che ho pensato anch'io.  ;D
E' però probabile che md9327 abbia installato in sé qualche strano componente, tipo... gb.beer, che lo difende:  :-\

Codice: gambas [Seleziona]

Public Sub Button1_Click()

 Dim alcool As Float
 Dim birra_qualsiasi As Beer

 alcool = beveBirra(birra_qualsiasi)

 Print alcool

End


Public Function beveBirra(litrozzo As Beer) As Float

 Dim residuoAlcool As Float
 
 residuoAlcool = metabolizza(litrozzo)
 
 Return residuoAlcool

End


...alla fine il risultato in console è uguale a zero !  :o
Titolo: Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
Inserito da: md9327 - 26 Maggio 2012, 20:03:26
Lo dici tu!

Ho la cambusa piena!!!  ;D