Newsgroup: it.comp.lang.visual-basic
Titolo: [?] VB6 e Resize del progetto

Ciao... forse mi potete consigliare...
ecco che mi sono deciso ad abbellire un po' una mia applicazione multiform 
che tiro avanti da qualche anno e vorrei rivederlo ed abbellirlo adattandolo 
ai tempi.... senza stravolgerlo....
RESIZE:
Uso un po' di tutto, dalle linee sstab, combobox, image, scrollbar varie, 
check e option button, picturebox, button vari, listbox, frame, data, 
textbox richtextbox... ecc... ecc... tabelle varie...mshflexgrid e grid 
varie... insomma un po' di tutto in una decina di form separati.
Per  FARE UN RESIZE ai vari form posizionati sullo schermo che si adattino 
alla grandezza bene o male, cosa consigliate di FREE per non aver problemi 
di distribuzione ed uso?
Qualche ocx o altro?  grazie mille per un qualche link di riferimento... Ho 
trovato anhe una class ma mi da problemi con alcune sstab... e alcuni 
bottoni a margine che poi escono dal progetto...
Avevo anche pensato di mettere i vari frm in una MDI ma poi non potrei 
spostare facilmente i frm su due schermi, meglio lasciarli "esterni" 
separatamente, memorizzare la posizione per il prossimo riavvio e lavorare 
sul resize per un bel posizionamento/e ingrandimento personalizzato?
BOTTONI:
Per abbellire bottoni colori ecc... qualche dritta?
Sto facendo il giro di zioGoogle ma volevo sincerarmi anche sui vostri 
PREZIOSI CONSIGLI prima di lavorare disperatamente con qualche cosa che poi 
potrebbe crearmi problemi!
GRAZIE MILLE!
Anto


' 
======================================================================================== 
'
' Component : clsResize 
Created : 01/05/1999 '
' File Name : clsResize.cls                                           Author 
: A D Moss   '
' 
'
' Purpose   : Resize and Reposition all controls on a Form. 
'
cerca questa classe e poi adattala ai tuoi scopi
-- 
Greg 

 cerca questa classe e poi adattala ai tuoi scopi
Ciao Gregg
grazie mille per l'info... ma questa classe l'avevo già verificata da un tuo 
msg del 2007....
ed appunto è quella che mi crea diversi problemi... anche perchè ho dei form 
con oltre 30/40 oggetti e sarebbe veramene impensabile doverli riadattare o 
cambiare.
Inoltre questa classe ho visto che non funziona correttamente nei frame di 
una sstab e ne uso diverse... lavora male con la grafica e così al volo ho 
notato che non tutto viene visualizzato correttamente tagliando i textbox a 
margine.... e altre cosette che mi complicano un po' il tutto...
Mi sa che devo trovare qualche componente ocx free,,,
Ho vsito la free lite activeresizelite.ocx... veramente stupenda ma la lite 
free accetta solo una quindicina di oggetti... e poi fa pubblicità a tutto 
spiano... :-()
GRAZIE dell'info, altri consigli benvengano...
ciao
Anto

 margine.... e altre cosette che mi complicano un po' il tutto...
Il bug dell'sstab si risolve in 3minuti.
In pratica l'sstab sposta la proprietà left dei controlli nascosti.
Alla barbara (ma funziona) puoi correggere come segue:
Private m_clMsFlexGrid As Collection                  'collection
IndexControl delle msflexgrid
Private Sub SaveInitialStates()
[cut]
        On Error Resume Next
          m_Controls(i).OriginalLeft = .Left
          ' gestione x sstab
          If .Left < 0 Then m_Controls(i).OriginalLeft = .Left + 75000   
          m_Controls(i).OriginalTop = .Top
          m_Controls(i).OriginalWidth = .Width
          Select Case LCase(TypeName(m_SourceForm.Controls(i)))    'per il
resize delle colonne, salvo gli indici
            Case "msflexgrid"
              m_clMsFlexGrid.Add CStr(i), CStr(i)
          End Select
End Sub
Io ho aggiunto la possibilità di settare un font size massimo e il resize
del font (non so se c'era già questo). Perchè una form a 800*600 vista a
1600*1200 avrebbe caratteri troppo grandi.
Inoltre per le griglie ho aggiunto del codice per fare il resize anche
delle colonne in modo proporzionale. Mi salvo in una collection a parte i
Controlli dei vari tipi (sopra uno spunto), e al resize assegno le nuove
ColumnsWidth (distinguo per tipo di griglia, non tutte hanno tutte le
stesse property es. griglia.ColWidth(i)= o griglia.Columns(i).Width=)
Il fatto che ti taglia le textbox è che banalmente vai troppo vicino ai
margini di standard, quindi il resize può essere che tagli. Basta
distanziare meglio gli oggetti.
In conclusione basta che capisci un po' come lavora e ci metti le mani come
vuoi.

 vuoi.
Aggiungo che io per semplicità, dalle opzioni di programma faccio scegliere
la risoluzione orizzontale delle maschere.
E quindi sono io che fisso il rapporto base/altezza sempre uguale.

 vuoi.
Il problema è appunto capire... sarà l'età ma soprattutto la non conoscenza 
di base che mi limita in queste modifiche "canibalizzate".... :-)))
GRAZIE in anticipo per le dritte.
Anto

 Alla barbara (ma funziona) puoi correggere come segue:
Ho provato al volo ma la SSTAB mi va in confusione totale...
Un po' come prima.... ora la SSTAB (0) va sopra alla (1) e la 2 e la 3 non 
escono...
è che nel programma ho diverse SStab e i riferimenti e link e modifiche 
varie alle stesse sono troppe da sostituirle... ma forse ho cannato 
nel'inserire queste righe che mi hai dato... anche se è differente rispetto 
al resize che ho io... forse sono due cose già modificate e diversi sono i 
moduli classe?
infatti prima del tuo END SUB non vedo il
          m_Controls(i).OriginalWidth = .Width
e alcuni altri nel finale che ho:
---cut---
[cut] ' che poi il ON error è dopo la metà del sub.
[...]    On Error Resume Next
          m_Controls(i).OriginalLeft = .Left
                    ' gestione x sstab
                    If .Left < 0 Then m_Controls(i).OriginalLeft = .Left + 
75000
          m_Controls(i).OriginalTop = .Top
          m_Controls(i).OriginalWidth = .Width
'                    'per il resize delle colonne, salvo gli indici
'                    Select Case LCase(TypeName(m_SourceForm.Controls(i)))
'                        Case "msflexgrid"
'                        m_clMsFlexGrid.Add CStr(i), CStr(i)
'                    End Select
          m_Controls(i).OriginalHeight = .Height
        On Error GoTo 0
      End If
    End With
  Next
  'Notify the class that the form has been resized.
  m_IsFirstResize = False
End Sub
---cut---
Mi sa che meglio sia una OCX o simile e meglio se free...  qualche dritta da 
provare?
Ho cercato sul sito comune ma c'e' solo il modulo classe...
ciao e grazie ancora!
Anto

 Ho provato al volo ma la SSTAB mi va in confusione totale...
Niente... ho provato un po' di tutto ma credo proprio che il modulo classe 
non funziona correttamente. Come uso poi l'exe mi si impalla la grafica 
sulle sstab che usano dei frame di contenenza... ed escono sovrapposte 
ancghe se seleziono delle altre.
O è un casino o canno io qualche cosa con la modifica della classe.
CERCASI QUINDI OCX!!!!
Non c'e' qualche ocx free??? non trovo nulla su ziogoogle a parte le solite 
a pagamento con licenze per la distribuzione che vorrei evitare... GRAZIE 
PER UN AIUTO!!!!!
grazie mille!
Anto

 evitare... GRAZIE PER UN AIUTO!!!!!
La classe č 100 volte meglio dell'ocx, devi perderci un poco di tempo dietro 
per capire come funziona, fatto questo cerca di aggiungere le tue necessita 
che non sono state previste. Anche se trovi l'ocx non č mica detto che 
riesca a gestire bene tutti i controlli di questo mondo, e per giunta č 
chiuso e non puoi metterci mano!
Fa cosi: lavora con un progetto vuoto e mettici solo la mstab con  frame e 
cerca di farla andare cosi da sola, una vola superato questo passa a 
metterci due button e vedi dove li va a mettere, tu poi agisci di 
conseguenza.
-- 
Greg 

 E quindi sono io che fisso il rapporto base/altezza sempre uguale.
Uhm, questo è interessante. Infatti pur limitando la granzezza del font, 
vengono fuori delle combobox o textbox un poco sgraziate con certe 
risoluzioni perchè troppo alte. Vedro di provare un'altezza "rapportata" 
ancche se bene controllare sempre di non uscire dal monitor visto certi 
mnitor larghissimi e poco alti che girano oggi
-- 
Greg 

 conseguenza.
Si vero anche se personalmente non saprei adattarla o modificarla dato che è 
un po' arabo.. :-))),
è che questo modulo classe anche senza immettere info sulla sstab mi 
modifica la visione della stessa anche senza ingrandire nulla... spariscono 
le pagine interne o si sovrappongono, dovrei forse sostituire tutte le sstab 
con un qualche cosa di similare e con lo stesso nome....
Infatti sulle SSTAB vedo che tutti hanno qualche problema... ma ho un bel 
problemino nel toglierle, sono una decina, ho dei riferimenti da tutte le 
parti verso le sstab stesse con una ventina di "cartelle" e link di quà e di 
là, textbox contenuti, richtextbox.. ecc... che doverle togliere per 
metterci dei frame.. sarebbe un "suicidio"... calcola che l'exe compresso 
arriva a 3MB!!!!
:-))) azz a queste sstab...
se hai consigli o un codice classe già modificato agli scopi e migliorato... 
benvenga! il mio email nel caso è apipapip su hotmail punto com 
(GRASSSSIE!)
ciao e ancora grazie a tutti per i preziosi consigli!
Anto

 spariscono le pagine interne o si sovrappongono
Ho fatto una prova e non mi sparisce nulla; unico problemino i controlli 
messi sulla pagina dversa dalla prima non si vedono, sono stati spostati 
oltre i bordi della pagina probabilmente perche nel'assegnazione delle nuove 
top e left si fa riferimento alla finestra e non al tab
-- 
Greg 

 :-))) azz a queste sstab...
anxche loro sono ocx da prendere con le pinze, la classe è sempre meglio 
perche alla fine è codice e puoi farci quello vuoi.
Veniamo a noi
- progetto vuoto, + controllo sstatab da 3 tab, in ogni tab in basso a 
sinistra un commandbutton, tutti a occhio sullo punto, qundi uguale left e 
top;
- senza nessuna classe resize di mezzo, voglio prima cercare di capire come 
gestisce il posizionamento dei controlli questo sstab;
sulla finestra un solo pulsante che visualizza top e left di ciascun 
pulsante e il risultato è illuminante:
Private Sub Command4_Click()
k = Command1.Name & " " & Command1.Left & "-" & Command1.Top & vbCrLf
k = k & Command2.Name & " " & Command2.Left & "-" & Command2.Top & vbCrLf
k = k & Command3.Name & " " & Command3.Left & "-" & Command3.Top
Text1 = k
End Sub
Questo è il risultato di k:
Command1 -74970-1680
Command2 -74940-1650
Command3 60-1650
la proprietà left è corretta solo per la tab visibile al momento di mandare 
in esecuzine il tutto (la terza), ma le altre sembrano sballate.
Mettendo poi sulla form un secondo pulsante con questo codice:
command2.left= 120
e piagiandolo mentre è visualizato il tab3 con il su command3 visibile in 
basso a sinistra, ecco che appare anche il command2 spostato di 60 twips a 
destra.
Quindi sti stronzoni... a design-time con qualche trucco ti illudono che 
stai lavorando su 3 tab diversi, ma in realta è sempre uno e uno solo, solo 
che loro un attimo prima del clik sul tab spostano tutti i controlli a 
destra di un kilomentro.
Alla fine è molto meglio e piu trasparente per me stesso il controllo Tab 
che mi sono fatto in casa, alla barbara.
Tanti pulsanti in fila al posto delle linguette e a ogni clik il frame 
richiamato in posizione 0,0 che si posta dietro e dentro tutti i cavoli di 
controlli che a design time gli ho cacciato dentro senza occuparmi delle 
loro posizioni perche seguono il frame
solo:
Coomand(1).clik
frame(index).left=o
frame(index).top=0
end
e funziona tutto bene, sia da solo che con la classe cRresize, con qualche 
riga di codice in piu e senza un altro ocx da portarmi dietro, registrare, 
eccc...
ti consiglio di fare lo stesso, una matrice di pulsanti e una di frame e 
vivi tranquillo. Si lo so, i miei pulsanti non hanno gli angoli tagliati, 
però.... per esempio a quelo selzionato gli cambio il backcolor, con l'sstab 
fischia :)
greg
-- 
Greg 

 di base che mi limita in queste modifiche "canibalizzate".... :-)))
E' che un resize difficilmente funziona sempre e comunque.
La classe ci puoi mettere le mani.
Comunque io ti avevo postato la singola riga da aggiungere (quella col
75000). Il resto lasci com'è.
Poi ti avevo messo un abbozzo del resize delle colonne per le griglie, ma
per ora lasciamo perdere.
Ricontrollando, nella form che richiama la classe ho questo codice che
gestisce la/le sstab:
Private Sub Form_Resize()
      '##################################################
      ' Codice Standard x Resize
      '##################################################
      Dim ctl As Control, CtlCln As New Collection
      On Error Resume Next
      For Each ctl In Controls
         If ctl.Left < 0 Then CtlCln.Add ctl
      Next
      SSTab1.Visible = False
     ' Put the code here to resize the controls
      Resizer.ResizeControls
 
      For Each ctl In CtlCln
         If ctl.Left > 0 Then ctl.Left = ctl.Left - 75000
      Next
      SSTab1.Visible = True
      '##################################################
End Sub
Tutto il codice lato form che uso è questo (un po' incasinato forse, ma
va). Come ti ho detto il resize lo faccio io (forms Fixed Single), e non lo
permetto all'utente, se non dalle impostazioni di programma di scegliere la
risoluzione orizzontale SCREENWIDTH (e calcolo l'height con WH_Ratio come
puoi vedere sotto).
| '##################################################
| ' Codice Standard x Resize
| '##################################################
| Private Resizer As clsResize
| '##################################################
| 
| 
| Private Sub Form_Activate()
|   
|   '##################################################
|   ' Codice Standard x Resize
|   '##################################################
|   LoadFormLayout
|   '##################################################
| 
| End Sub
| 
| 
| Private Sub Form_Initialize()
|   
|   '##################################################
|   ' Codice Standard x Resize
|   '##################################################
|   
|   Set Resizer = New clsResize
| 
|   Resizer.SourceForm = Me
| 
|   Dim myFontSize As Single
|   
|   If Len(Dir$(App.Path & "\Layout.ini")) > 0 Then
|     myFontSize = CSng(Val(StrLeggiFileINI("FORM", "MAXFONTSIZE", App.Path & "\Layout.ini")))
|     If myFontSize > 0 Then
|       Resizer.MaxFontSize = myFontSize
|     End If
|   End If
|   '##################################################
| 
| End Sub
| 
| Private Sub LoadFormLayout()
| '---------------------------------------------------------------------------------------
| ' Procedure : LoadFormLayout
| ' DateTime  : 12/02/2008 14.17
| ' Author    : andrea
| ' Purpose   : Ridimensionamento form, funziona solo una volta (all'avvio)
| '---------------------------------------------------------------------------------------
| '
| Static JustPassed As Boolean
| Dim myWidth As Integer, WH_Ratio As Single
| 
|   '##################################################
|   ' Codice Standard x Resize
|   '##################################################
|   If Not JustPassed Then
|     JustPassed = True
|     If Len(Dir$(App.Path & "\Layout.ini")) > 0 Then
|       myWidth = CLng(Val(StrLeggiFileINI("FORM", "SCREENWIDTH", App.Path & "\Layout.ini")))
|       If myWidth > 800 Then
| 
|         
|         WH_Ratio = Me.Width / Me.Height
|         
|         'Da qui viene fatto il resize automaticamente
|         Me.Width = Me.ScaleX(myWidth, vbPixels, vbTwips)
|         Me.Height = Me.ScaleY(myWidth / WH_Ratio, vbPixels, vbTwips)
|         
| 
|       End If
|     End If
|   End If
|   '##################################################
| End Sub
| 
| 
| Private Sub Form_Resize()
| 
|       '##################################################
|       ' Codice Standard x Resize
|       '##################################################
|       Dim ctl As Control, CtlCln As New Collection
|       On Error Resume Next
|       For Each ctl In Controls
|          If ctl.Left < 0 Then CtlCln.Add ctl
|       Next
|       SSTab1.Visible = False
| 
|      ' Put the code here to resize the controls
|       Resizer.ResizeControls
|             
|       For Each ctl In CtlCln
|          If ctl.Left > 0 Then ctl.Left = ctl.Left - 75000
|       Next
|       SSTab1.Visible = True
|       '##################################################
| End Sub
Spero ti possa aiutare.

 mnitor larghissimi e poco alti che girano oggi
La classe mi pare possa gestire anche il solo resize di lato, e comunque ci
si può lavorare in qualche modo.
Io da programma ho messo un Opzioni volante in cui faccio mettere la
risoluzione orizzontale. Se dovesse andare fuori  tirano indietro lo
slider.
Comunque ho del codice che dovrebbe funzionare per trovare la risoluzione
orizzontale, o almeno non mi ha mai chiamato alcun cliente per dirmi che il
programma va fuori dai margini.
|     If Len(Dir$(App.Path & "\Layout.ini")) = 0 Then
|       Dim ResX As Long, shft As Long
|       If Me.ScaleX(Screen.Width, vbTwips, vbPixels) / Me.ScaleY(Screen.Height, vbTwips, vbPixels) > 1.5 Then
|            'monitor wide, i normali 1.33 gli altri 1.77 o 1.6
|           shft = 10  'tolgo pixel per andare nello step inferiore di risoluzione
|       End If
|       
|       Select Case Me.ScaleX(Screen.Width, vbTwips, vbPixels) - shft
|         Case 0 To 1023: ResX = 800
|         Case 1024 To 1151: ResX = 1024
|         Case 1152 To 1279: ResX = 1152
|         Case 1280 To 1599: ResX = 1280
|         Case Is > 1600: ResX = 1600
|       End Select
|       ScriviFileINI "FORM", "SCREENWIDTH", ResX, App.Path & "\Layout.ini"
|       ScriviFileINI "FORM", "MAXFONTSIZE", "11.5", App.Path & "\Layout.ini"
|     End If
Se non trova il file lo crea come sopra.
Credo che tu possa fare tranquillamente una risoluzione ad hoc per la
risoluzione.

 l'sstab
Inoltre effettivamente con questi puoi impostare anche due belle "button 
image" e renderlo bellino al click...
si devo decidermi ma i collegamenti alle sstab ho verificato e sono 
effettivamente tanti tanti, ma il resize è quasi prioritario.... prevedo 
notti insonni.... perchè infatti volevo portare i vari frm che prima 
seguivano il principale, , posizionabili a piacere sullo schermo 
indipendentemente tra loro e non dentro un frm principale, memorizzarli 
quindi  in un .ini per il riavvio nella stessa posizione/grandezza ecc... 
ecc...
grazie mille per i consigli preziosissimi.... io ramasso qualsiasi 
consiglio... Tanks!
Anto

 consiglio... Tanks!
Hai provato il codice che ti ho postato ieri.
Ti posso dire che ho 5/6 form con resize ed SSTab e non ho problemi.
Prova prima a fare un progetto vuoto, mettere la classe, quel codice lato
form, un po' di textbox, command, e una SSTab e vedi se funziona.
Deve farlo perchè a me va senza problemi (con le restrizioni che mi sono
imposto).

 consiglio... Tanks!
Hai provato il codice che ti ho postato ieri?


 Hai provato il codice che ti ho postato ieri?
Scusami per la mancata risposta ma mi sono accorto solo oggi del tuo 
messaggio/codice nella risposta in quanto il mio newreader non � riuscito a 
prelevare/vedere e me lo sono ritrovato attraverso google con la tua domanda 
qua sopra.. come se fossi stato plonckato dal mio `provider di newreader... 
che strano...
Ho allora cancellato tutti i messaggi del mio newreader ed eccoti 
riapparso... boh...
GRAZIE MILLE PER LE SPECIFICHE sei stato molto gentile!
Proprio in questo week end lungo del 1 maggio mi sono deciso a sostituire 
tutte le SSTAB con dei frame e la cosa funziona perfettamente... � stato un 
lavoraccio... dopo 48 ore quasi non stop... quasi tutto funziona.... con le 
sstab era tropppo un casino, anche con il tuo codice ogni tanto non uscivano 
le finestre o restava quella identica alla precedente... boh... comunque 
grazie e con i frame ci sono riuscito anche a gi� modificare parzialmente 
quasi tutto.
Ho anche dovuto reimpostare tutte le posizioni con l'ottimo sistema per i 
file .ini che non usavo prima e che ora con 4 INIREAD e 4 INIWRITE carico 
e/o salvo tutte le posizioni all'entrata e all'uscita per ogni form
Sopra son ripartito con una domanda sui fonts... e sulla mshflex che non 
gestisce la classe clsresize.cls e onestamente non sono proprio in grado di 
farlo.. :-(((
ciao e GRAZIE MILLE scusandomi per la mancata risposta che era "difetto 
newsreader".
ciao

 GRAZIE MILLE PER LE SPECIFICHE sei stato molto gentile!
A me non ha mai dato problemi, ma non credo di avere pi� di 1 sstab per
form.
Comunque figurati, � che c'hai dovuto lavorare abbastanza.