Autore Topic: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.  (Letto 1824 volte)

Offline eevan

  • Gamberetto
  • *
  • Post: 32
    • Mostra profilo
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...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #1 il: 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.

Offline eevan

  • Gamberetto
  • *
  • Post: 32
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #2 il: 23 Maggio 2012, 12:58:52 »
ehh....

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #3 il: 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.

Offline eevan

  • Gamberetto
  • *
  • Post: 32
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #4 il: 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...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #5 il: 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...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #6 il: 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.
« Ultima modifica: 24 Maggio 2012, 17:46:07 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #7 il: 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.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #8 il: 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 ?  ???
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #9 il: 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...  :-\

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #10 il: 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: )
« Ultima modifica: 25 Maggio 2012, 13:19:42 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #11 il: 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.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #12 il: 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
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #13 il: 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...

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Bloccare gli oggetti nelle loro posizioni per ingrandimento finestra.
« Risposta #14 il: 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:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »