Newsgroup: it.comp.programmare.win32
Titolo: Ottenere handle

Sto scrivendo un programmino che utilizza una listbox. Questa listbox sta in
un piccolo dialog. In un altro dialogo ho messo un pulsante. E' possibile
fare in modo che premendo il pulsante sul dialog, si aggiungano voci nella
listbox sull'altro dialog? Pensavo di utilizzare il messaggio LB_ADDSTRING
però mi servirebbe uttenere l'handle alla listbox che non riesco ad
ottenere. Ho pensato allora di utilizzare la funzione GetDlgItem, ma mi
manca comunque l'handle dell'altro dialog. C'è una soluzione?
Grazie e ciao a tutti.
Luca Carlon

 Luca Carlon
ciao

 altrimenti le dialog sono child di una finestra principale?
si.
Grazie.
Luca

 che è sconsigliato utilizzare variabili globali (perchè?).
Perchè occupano memoria che non verrà mai liberata (essendo appunto globali
e quindi anche sempre disponibili) e poi perchè alla fine (nei grandi
progetti) non ci capisci più niente!!!
Kiuhnm

 Kiuhnm
Lo immaginavo, ma non è che alle volte possa convenire una scelta di quel
tipo al fine di velocizzare magari operazioni particolari? Cioè, tra
l'occupare meno memoria ed il rendere più veloce il codice si preferisca
utilizzare variabili globali? Non ho un esempio pratico al momento, però
alle volte mi è venuta in mente una cosa di questo tipo. In quella
situazione la cosa non potrebbe risultare invece consigliabile?
Grazie per la tua risposta.
Luca

 del programma.
La situazione non cambia: quella memoria resterà allocata per l'intera
esecuzione del programma.
Invece quelle locali a una funzione vengono liberate quando questa termina.
Comunque è un'inezia (specialmente oggi che la RAM te la tirano dietro).
Direi che il problema principale è il caos creato da troppe variabili
globali, ma se prevedi che il codice non supererà le 2000/3000 righe allora
non dovrebbero dare problemi, IMHO.
Kiuhnm

 consigliabile? Grazie per la tua risposta.
Ovviamente sì. Magari se ne hai molte è consigliabile metterle tutte in una
struttura.....per centralizzare le cose.
--[Nei processori Intel e compatibili]--
In pratica il prob. è che le var. globali si trovano a un determinato
indirizzo di memoria e quindi il codice per accedervi sarà simile a:
mov    eax, [0x440008]
mov    edx, [0x44000C]
mov    ecx, [0x440010]
La prima istruzione è lunga 5 bytes, mentre le seguenti 6 bytes (EAX è
privilegiato!)
Le var. locali invece sono sullo stack puntato da ESP ed EBP.
E' sufficiente:
mov    eax, [ebp-4]
mov    edx, [ebp-8]
mov    ecx, [ebp-0xC]
Sono tutte lunghe 3 bytes.
Solitamente le versioni più corte sono anche più veloci (se si parla della
stessa istruzione...e qui si parla di MOV ovvero di assegnamento).
Comunque, se metti tutte le var. globali in una struttura, chissà che il
compilatore non ottimizzi come segue:
mov    edi, OFFSET GlobalStruct
mov    eax, [edi]
mov    edx, [edi+4]
mov    ecx, [edi+8]
La prima è 5 bytes, la seconda 2 e le altre 3.
Kiuhnm
P.S. Mettiamo di dover fare una libreria grafica e che quasi ogni sua
singola funzione utilizzi VideoMem (l'indirizzo della memoria video). In
questo caso io la definirei come globale.
Dimenticavo: le var. globali riducono notevolmente lo spazio utilizzato
dalle funzioni ricorsive (pensa se ogni funzione mettesse nello stack la sua
inutile copia di VideoMem).

 sconsigliato utilizzare variabili globali (perchč?).
problemi di manutenibilita'... ma credo che se stai sviluppando una 
piccola utility o comuque un progetto non complesso, puoi comunque 
usarle (al max le impacchetti in una struct ad hoc).
ciao

 Luca
ciao

 questo caso molto relativa,come l'occupazione di spazio)
Beh, era anche perchč visto che sto imparando, piů soluzioni mi interessano
per conoscere anche nuove funzioni.
Grazie.
Luca


In C puoi sempre fare così:
int a, b;
{
    int x, y......
    .
    .
    .
}
{
    int i;
    .
    .
    {
        int i, j;
        {
            .
            .
        }
    }
}
O si può solo in C++? Non ricordo...
Kiuhnm

 nello standard C, a breve.
No.
int i, j;
i = j = 0;
{
    in i, j;
    i = j = 1;
    {
        int i, j;
        i = j = 2;
    }
}
printf("%d %d\n", i, j);            // stampa "0 0"
Kiuhnm