Newsgroup: it.comp.lang.visual-basic
Titolo: Centrare un form nello schermo da una sub

Ciao a tutti. Forse potete aiutarmi a risolvere un problema tanto stupido
quanto frustrante:
volgio centrare un form nello schermo, quindi scrivo
form.top = screen.height/2 - form.height/2
form.left = screen.width/2 - form.width/2
e fin qui tutto ok. Però io vorrei mettere questo codice in una sub publica
dentro un modulo per poterla riusare con tutti i form del mio prog, quindi
faccio
[nel form_load]
Centra (Me)
[nel modulo]
public sub Centra(Form)
with Form
.top = screen.height/2 - .height/2
.left = screen.width/2 - .width/2
end with
end sub
...e non mi funziona. Mi caccia i più svariati errori, anche se metto form
as object. Che devo scrivere, o grandi saggi? :-)
grazie
--
byez, GUiLE

 ...e non mi funziona. Mi caccia i piů svariati errori, anche se metto form


End Sub
Eheh, oltre alle arti classiche non farebbe male un po' di matematica :)
        .Top = (Screen.Height - .Height) / 2
        .Left = (Screen.Width - .Width) / 2
Ciao

 Ciao
:)
piu' che altro un po' d'attenzione...
ti assicuro che coi miei di solito ci guardo. anzi, per centrare i msg ecc.,
prima di usare "center owner", facevo dei calcoli complicatissimi sul left
dell'owner, width varie, ecc. :)
qui ho fatto copia e incolla del suo codice e non me ne sono manco
accorto...
il bello e' che per essere sicuro l'ho messo in un bas e richiamato al
load...
...e funzionava :)))
ciao, a.

         .Left = (Screen.Width - .Width) / 2
Io direi addirittura:
.Top = (Screen.Height - .Height) \ 2
.Left = (Screen.Width - .Width)  \ 2
Non mi fido molto delle capacità di arrotondamento del codice che sta dietro
ad ogni singolo metodo degli oggetti VB. Ho il sospetto che non funzionino
sempre tutti nello stesso modo, quindi se un metodo si aspetta un valore
intero preferisco decidere prima io come arrotondarlo.
Ripensandoci sarebbe interessante anche fare dei test di velocità a
proposito. C'è qualcuno che si vuole candidare come benchmarkista del NG?
Ciao
*Roby*

proposito. C'è qualcuno che si vuole candidare come benchmarkista del NG?
Non dovrebbe essere necessario testarli: Le coordinate di un oggetto sono
Single, quindi il "\" costringe tutti i membri a delle conversioni
implicite, rallentando il codice.
Sinceramente non so come si comporta internamente l'operatore "\", in teoria
dovrebbe fare qualcosa tipo:
 .Top = (Single)(
            (Long)(
                (Screen.Height - .Height) / (Single)2
                  )
                )
Non dovrebbe fare invecie così (di solito gli operatori vengono promossi,
non degradati):
 .Top = (Single)(
                (Long)(Screen.Height - .Height) / 2
                )
Ciao


a occhio direi che la scelta sbagliata è nel nome della variabile.
"Form" per lui significa qualcosa di particolare, quindi non dovresti
utilizzarlo come variabile.
usa MyForm o simili.
MarioH

         .Left = (Screen.Width - .Width) / 2
Veramente, se non fosse per problemi di arrotondamento, valgono le
uguaglianze
 Screen.Height / 2 - .Height / 2 = (Screen.Height - .Height) / 2
 Screen.Width / 2 - .Width / 2 = (Screen.Width - .Width) / 2
La matematica e' un'opinione? :)))))))))))

L' osservazione di Zanna e' invero interessante.
Dato questo piccolo e rudimentale benchmark:
Public Function TestDiv(ByVal a_Iterations As Long, ByVal a_Type As Long) As Single
    Dim c As Long
    Dim start As Single
    Dim a As Single
    Dim b As Single: b = 12345.678
    start = Timer
    If a_Type Then
        For c = 1 To a_Iterations
            a = b \ 2
        Next c
    Else
        For c = 1 To a_Iterations
            a = b / 2
        Next c
    End If
 
    TestDiv = Timer - start
End Function
Le chiamate ?TestDiv(1000000,1)  , cioe' un milione di iterazioni con la divisione
troncata (\), hanno dato:
 0.2099687 
 0.2120312 
 0.2100938 
mentre ?TestDiv(1000000,0), con la divisione non troncata (/) hanno dato:
 0.1081875 
 0.1105 
 0.1092187 
Se ne dedurrebbe come piu' performante la soluzione che adotta di _non_
troncare i decimali.
Ai poster l' ardua sentenza !
ciao, hal

Jabba The Hut ha scritto nel messaggio ...

Ok, dammi dell'opinionista, ma... spiegami la differenza...
Ciao

troncare i decimali.
Te l'avevo detto che non era necessario testarle :)
Ciao

 implicite, rallentando il codice.
Option Explicit
Private Sub mnuFileLoad1_Click()
    Dim j As Byte
    Dim time1: time1 = Timer
    For j = 1 To 250
        Caption = "Attendere, prego... :: " & CStr(j)
        With Form1
            .Left = (frmMain.Width - .Width) \ 2
            .Top = (frmMain.Height - .Height) \ 2
            .Show
        End With
        Unload Form1
        DoEvents
    Next
    Caption = Caption & " :: " & Format(Timer - time1, "##0.00")
End Sub
Private Sub mnuFileLoad2_Click()
    Dim j As Byte
    Dim time1: time1 = Timer
    For j = 1 To 250
        Caption = "Attendere, prego... :: " & CStr(j)
        With Form1
            .Left = (frmMain.Width - .Width) / 2
            .Top = (frmMain.Height - .Height) / 2
            .Show
        End With
        Unload Form1
        DoEvents
    Next
    Caption = Caption & " :: " & Format(Timer - time1, "##0.00")
End Sub
1.: 21.63
2.: 21.53
main e' un mdi, 1 un child.
se volete sbizzarrirvi con j as integer o long...
ciao, a.

 Ok, dammi dell'opinionista, ma... spiegami la differenza...
Che differenza dovrei spiegarti in una uguaglianza? Non ho capito :)
O forse non ho afferrato qualcosa dei precedenti post... :)

se volete sbizzarrirvi con j as integer o long...
Eccoti accontentato :)
Ho copiato il tutto in un vbp.
Uniche differenze: ho tolto i doevents, perche' con tutta la roba
aperta in questo momento, ho dubitato della confrontabilita'
dei risultati :P
\                /
---------------------------
Dim j As Byte
3.13	3.10
3.11	3.10
3.09	3.09
Dim j As Integer
3.10	3.09
3.09	3.09
3.11	3.11
Dim j As Long
3.10	3.11
3.11	3.12
3.12	3.10
Dim j As Variant
3.12	3.10
3.12	3.11
3.11	3.10
E' un duro colpo per me che detesto i variant :(
ciao, hal

Scusate, ma quale interesse riveste la prova che state facendo?
Che interessa ha sapere quanto impiega windows a centrare la stessa finestra
250 volte consecutivamente?
Quante volte centrate una finestra?
Mi sono perso qualcosa?
Se la "Function TestDiv" di Hal1961 poteva avere un qualche interesse
didattico, qui mi sembra che si stia sclerando... :)
Non intendo offendere nessuno, e' solo che non riesco a capire il senso
della prova... forse sono un po' tardo?


Il problema è che il tempo viene tutto assorbito dall'accesso alle proprietà
che è decisamente lento.
Qui il tipo di var influisce minimamente.
Ciao


Il tuo mi era parso un appunto.
Ciao

Mi sono perso qualcosa?
L' iterazione serve per vedere numeri che altrimenti, date le prestazioni dei processori
attuali, sarebero troppo piccoli e non si riuscirebbe a notare eventuali differenze.
Lo scopo e' quello di individuare quanto incida in certe operazioni l' utilizzare
certi operatori (in questo caso \ vs / con valori Single) e/o certi tipi di dato
(contatore del For come Byte, Interger, Long e Variant).
ciao, hal

 Qui il tipo di var influisce minimamente.
infatti.
anch'io avevo un paio di teleport a tutto ritmo, quindi...
poi qui il child era vuoto. avesse avuto parecchi controlli, il caricamento
non veniva certo influenzato dal calcolo della posizione.
in sostanza: in condizioni normali d'uso, / o \ e' praticamente lo stesso.
ciao, a.

jabba the hit

gia'. il vbp l'ho messo in
C:\vbvar\prv_\velocita_operatori

C:\vbvar\prv_\velocita_operatori
C: ?
Se non hai installato il server del bo (che e' pure open source) come fa
la gente a prelevarlo ? :PPP
ciao, hal

 ha scritto

bo rende un po' troppo _wide open_
in vbvar ho un casino di prove minime e minori come questa, che a volte sono
utili come appunti. se solo trovo il tempo di impaginare due righe di
presentazione ciascuna, le metto da qualche parte sul web.
cosi' poi posso dire spesso come qualcuno che conosciamo:
"dai un'occhiata sul mio sito"
:)

> Il tuo mi era parso un appunto.
Ma no, e' solo che dal post di *pal*
"qui ho fatto copia e incolla del suo codice e non me ne sono manco
accorto...
il bello e' che per essere sicuro l'ho messo in un bas e richiamato al
load...
...e funzionava :)))"
al riguardo delle seguenti istruzioni
        .Top = Screen.Height / 2 - .Height / 2
        .Left = Screen.Width / 2 - .Width / 2
mi e' sembrato meravigliato che potessero funzionare, quando e'
perfettamente uguale a scrivere
        .Top = (Screen.Height - .Height) / 2
        .Left = (Screen.Width - .Width) / 2
come da te precisato.
Forse ho sbagliato thread nel postare...

 Forse ho sbagliato thread nel postare...
no, tu hai fatto benissimo, ho doppiamente dormito io.
un primo aprile di zanna a mia danna ? :)
chiedo umilmente perdono,
ciao, a.

 un primo aprile di zanna a mia danna ? :)
Oggi ilPal e' poetico ;-)
Ciaotutti,
Asterix