Window ridimensionabili

Saluti a tutti voi, sono una new entry di questo blog.
Ecco in breve la mia storia: 10 anni fa acquistai una licenza Real Studio Professional Edition per Mac che mi permise di sviluppare alcune applicazioni desktop. Pur essendo un neofita, grazie al supporto che ebbi da Omnidea, la societ che allora distribuiva Real Studio in Italia, riuscii a realizzare le mie applicazioni. Dopodich, mi sono occupato di altri settori ed abbandonai completamente lattivit di programmazione. Ora, dopo 10 anni, ho ripreso a sviluppare alcune applicazione, ma mi sono subito reso conto di avere enormi lacune rispetto alle possibilit offerte da Xojo.

Il mio problema attuale riguarda il ridimensionamento delle finestre Window. Chiaramente, quando si variano le dimensioni di partenza di una window, tutti i controlli in essa contenuti, la loro posizione nella window e le dimensioni del testo devono essere proporzionalmente ridimensionati. Attraverso semplici istruzioni inserite nella Action di un Timer, sono gi riuscito ottenere i fattori di correzione Wr = with / with-iniziale ed Hr= Height / Height-iniziale.

Con questi due fattori di correzione si possono modificare i valori degli controlli, ad esempio “BevelButton1.width” diventa “BevelButton1.width*Wr” e cos per tutti i valori e per tutti i controlli contenuti nella window.
La Window ridimensionatile l’ho gi sviluppata nella mia ultima applicazione e funziona perfettamente, solo che ho dovuto inserire i fattori di correzione Wr e Hr manualmente in tutti i controlli della mia Window che, nella mia ultima applicazione sono circa 160 tra TextFiel, BevelButton, Canvas, Label, ecc. Un lavoro assurdo che vorrei rendere automatico, in modo da poterlo utilizzare in tutte le mie future applicazioni.

Vengo al dunque, ho trovato nella documentazione Xojo il seguente esempio che ho trovato utile:

dim c As Control
dim x as integer
For x = 0 To Self.ControlCount - 1 step 1
c = Window.Control(x)
dim N as string = c.name
next

Ho verificato che questa routine restituisce il numero dei controlli esistenti nella Window ed il “Name” ciascuno di essi. Poich, oltre al “Name” del controllo, ho bisogno di ottenere anche “Width”, “Height”, “Left”, “Top” e “textsize” dei controlli, mi sono illuso di potere ottenere facilmente questi valori, dichiarando:

dim Width as integer = c.width
dim Height as integer = c.height
dim Top as integer = c.top
dim Left as integer = c.left

Neanche per idea, , esce fatalmente il messaggio di errore: “Questo metodo o propriet non esiste”

Ho tentato in ogni modo superare queste limitazioni, ma non ci sono riuscito e confido che qualcuno di voi mi possa darmi una mano per risolvere il problema.
Mi rammarico solo di non potere al momento contraccambiare perch, come ho potuto verificare sfogliando il blog, sono troppo scarso rispetto al vostro livello di conoscenza di Xojo.

Vi ringrazio per laiuto che vorrete darmi


dim x as integer
For x = 0 To Self.ControlCount - 1
  if WindowControl(x) isa RectControl then
    dim c As RectControl = RectControl(Window.Control (x))
    dim N as string = c.name
    dim Width as integer = c.width
    dim Height as integer = c.height
    dim Top as integer = c.top
    dim Left as integer = c.left
  end if
next

Tanks Norman for your quick reply
I tried the code you suggested, but Xojo gives errors:

SYNTAX ERROR
Line 5 “if WindowControl (x) isa RectControl then”
It seems that xojo doesn’t accept this statement and I can’t understand why

Of course, in all subsequent lines appears:
THIS METHOD OR PROPERTY DOES NOT EXIST

Do you have any other suggestions?

Thanks and best regards

Window.Control(x)

Grazie per avermi segnalato il “punto” che mi era sfuggito. Ora l’errore non c’ pi, ma questa routine suggerita da Norman Palardy non si comporta correttamente:

For x = 0 To Self.ControlCount - 1
if Window.Control(x) isa RectControl then
dim c As RectControl = RectControl(Window.Control (x)
dim N as string = c.name Non restituisce il nome del control (rimane un campo vuoto
dim Width as integer = c.width Restituisce la larghezza della Window e non quella del control
dim Height as integer = c.height. Restituisce l’altezza della Window e non quella del control
dim Top as integer = c.top Restituisce il valore 50 che non capisco cosa sia
dim Left as integer = c.left Restituisce il valore 10, anche questo che non capisco cosa sia
next

Se utilizzo il vecchio esempio che ho trovato nella documentazione Xojo, ecco cosa accade:

dim c As Control
dim x as integer
For x = 0 To Self.ControlCount - 1 step 1
c = Window.Control(x)
dim N as string = c.name OK Funziona e restituisce il nome del controllo
// dim Width as integer = c.width Se inserisco questa riga. Errore: QUESTO METODO O PROPRIETA’ NON ESISTE
// dim Height as integer = c.height Se inserisco questa riga. Errore: QUESTO METODO O PROPRIETA’ NON ESISTE
// dim Top as integer = c.top Se inserisco questa riga. Errore: QUESTO METODO O PROPRIETA’ NON ESISTE
// dim Left as integer = c.left Se inserisco questa riga. Errore QUESTO METODO O PROPRIETA’ NON ESISTE
TF1.text = N TF1 un TextFiield creato nella Window per verificare il nome del controllo
TF2.text = Str(x) TF2 un TextFiield creato nella Window per verificare l’indice del controllo
next

Purtroppo sono a un punto morto, posso solo sperare nell’aiuto del forum
Nedi ti ringrazio, ho sfogliato il forum costatando che sei tra i pi attivi ed esperti di Xojo e ti sarei grato se potessi togliermi la castagne dal fuoco.
Un cordiale saluto

Ti ringrazio per la fiducia, Giulio, ma non sono n tra i pi attivi n tantomeno tra i pi esperti (uso Xojo da un paio d’anni).
In Italia il nostro punto di riferimento Antonio Rinaldi: lui s che ne sa una pi del diavolo!
Dopo provo la routine di Norman e vedo se scopro qualcosa.

Allora, Giulio, ho provato sia il codice di Norman che il tuo.
Quello di Norman funziona correttamente, in quanto i valori che imposta (c.Name, c.width, c.height, c.top, c.left) sono esattamente quelli del control in esame, e non quelli della window.
Top la distanza in pixels del controllo dal bordo superiore della window (o del contenitore che lo contiene)
Left la distanza in pixels del controllo dal bordo sinistro della window (o del contenitore che lo contiene)

Il tuo codice non pu funzionare perch tu definisci c As Control, genericamente, e quindi molti controls non hanno alcune propriet (penso, ad esempio, al control Timer che non ha n Width n Height n Top n Left ecc. in quanto non ha un’interfaccia grafica). E’ per questo che non puoi usare c.Control, ma devi fare come ha fatto Norman, vale a dire testare se il control in esame un RectControl, nel qual caso definisci c come RectControl: allora s che tutte le propriet da te elencate esistono.

Se hai ancora dei dubbi fammelo sapere.

Grazie Nedi, in effetti quello che vedevo con il codice di Norman mi sembravano valori molto strani che non corrispondevano a quelli del Control di cui avevo impostato il tabindex. Tieni conto che nella mia applicazione di prova c’erano, ad esempio, alcuni textField . Per fare prima, ho duplicato il primo textFiel, modificando poi il tabindex degli altri, in modo da avere i controlli nella sequenza desiderata. In effetto Xojo non tiene conto del tabelindex che ho impostato, ma, a parte questo che devo capire, il codice di Norman FUNZIONA PERFETTAMENTE!

Per quanto riguarda i valori che vedevo della window erano dovuti ad un mio errore nel codice. Tieni conto che ho 77 anni e, inevitabilmente, il mio cervello ha perso concentrazione e faccio spesso errori di distrazione, quindi, grazie per la tua pazienza.

Ora finir una demo che, ritengo, possa essere utile a chiunque abbia la necessit di ridimensionare la propria window o di vederla a schermo intero. Quando l’avr finita di mander il mio sorgente per provarlo, se vorrai, nelle tue applicazioni.
Nella demo ho utilizzato TextField, Label, BevelButton e Canvas, ma non so se potr funzionare con tutti i tipi di control di Xojo disponibili nelle applicazioni desktop.

Ringrazio ancora te e Norman per il supporto che mi avete dato

Di nulla, Giulio, ben lieto di esserti di aiuto.

Complimenti per la voglia di impegnarti anche alla tua et (io ne ho 71, per cui siamo l!!)