PDA

Visualizza la versione completa : [C++] Trasportare valore di una casella di testo in una variabile intera (int)


djpeppe
16-06-2007, 15:49
ciao,
qualcuno mi fa un esempio di come si trasporta un valore numerico da un camnpo edit di un dialog a una semplicissima variabile di tipo int?
facciamo che io ho questo edit

EDITTEXT TN,67,56,18,12,ES_AUTOHSCROLL | ES_NUMBER
e questo static

LTEXT "0",IDC_STATIC,40,20,11,11
e una dialog procedure


BOOL CALLBACK DlgProced(HWND hwndDlg,
UINT uMsg, WPARAM wParam, LPARAM lParam)
{int tn, risultato;
//punto 1
risultato=tn*2; //il fatto molto pi lungo ma...
//punto 2
}

mi servirebbe:
nel punto 1 un qualcosa che prenda il valore dell'edit e lo inserisca in tn;
nel punto 2 un qualcosa che inserisca il risultato nello static sopra espresso.

evitate di rispondermi con "vai a studiare" o " meglio se le fai tu stesso"... battetemi queste poche righe pleeeaaaseeeeeeee

MItaly
16-06-2007, 19:36
Intanto devi dare un nome univoco a quello STATIC... questo codice vale ammettendo che tu l'abbia chiamato IDC_DN:


BOOL bTranslated;
int tint = (int) GetDlgItemInt(hwndDlg, TN, &bTranslated, TRUE);
if (bTranslated)
{
SetDlgItemInt(hwndDlg, IDC_DN, tint, TRUE);
}
else
{
//la casella di testo non conteneva numeri, notifica l'errore
MessageBox(hwndDlg, "Inserire un numero.", "Errore", MB_ICONERROR);
}
.
Il dove piazzare questo codice dipende ovviamente da quando deve essere eseguito; non posso neanche dare un'ipotetica collocazione visto che quella window procedure non ha nessun senso. Studiati un po' la MSDN.

djpeppe
18-06-2007, 09:35
ok con i numeri ho risolto...
ora per ho un altro problema.
ho un edit dove c' testo.
con la funzione GetWindowText prendo il testo e lo inserisco nella variabile str in questo modo

LPTSTR str;
GetWindowText(hwndDlg, str, EOPEN);
spero che fin qui sia corretto. ora per devo converire la stringa di tipo LPTSTR in char. come faccio?
grazie

metal_prog
18-06-2007, 16:03
Ma LPTSTR non uguale a const char*? A cosa serve convertirlo?

MItaly
18-06-2007, 18:25
spero che fin qui sia corretto.
Al di l del fatto che, come ti gi stato detto, LPTSTR (compilando come non Unicode) uguale a char * (per cui non c' bisogno di convertire niente), quel codice sbagliato dall'inizio alla fine. Prima di chiamare una funzione leggi sulla MSDN cosa le devi passare, non passarle dati a caso!

The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.
Gi il testo evidenziato ti dovrebbe mettere in allarme: tu le hai passato nessun buffer, tu le hai passato un puntatore a char non inizializzato! Quindi, prima correzione:

char str[256]; //era: LPTSTR str;.
Leggiamo le descrizioni dei parametri:



int GetWindowText(HWND hWnd,
LPTSTR lpString,
int nMaxCount
);hWnd
Handle to the window or control containing the text.
[i]lpString
[out] Pointer to the buffer that will receive the text. If the string is as long or longer than the buffer, the string is truncated and terminated with a NULL character.
nMaxCount
[in] Specifies the maximum number of characters to copy to the buffer, including the NULL character. If the text exceeds this limit, it is truncated.
Ora, il secondo parametro l'abbiamo gi sistemato; passiamo agli altri. In primo luogo parliamo di nMaxCount: ti pare che nella documentazione dica che specifica l'ID del controllo di cui recuperare il testo? A me no... piuttosto, dovrai passargli le dimensioni del tuo buffer, per evitare buffer overflow, quindi devi passare sizeof(str). Quanto all'ID del controllo, in questa funzione non previsto, visto che si tratta di una funzione che opera genericamente con le finestre. Dovrai quindi ottenere un handle al controllo usando la GetDlgItem (ti rimando alla MSDN per informazioni su questa funzione):


char str[256];
GetWindowText(GetDlgItem(hwndDlg, EOPEN), str, sizeof(str));
.
Se guardiamo alla sezione "Return value" della documentazione leggiamo quanto segue:


If the function succeeds, the return value is the length, in characters, of the copied string, not including the terminating NULL character. If the window has no title bar or text, if the title bar is empty, or if the window or control handle is invalid, the return value is zero. To get extended error information, call GetLastError.; quindi, ad ogni buon conto, potremmo aggiungere un controllo per verificare se l'operazione andata a buon fine:

char str[256];
if(!GetWindowText(GetDlgItem(hwndDlg, EOPEN), str, sizeof(str)))
MessageBox(hwndDlg, "Impossibile recuperare il testo della finestra.", "Errore", MB_ICONERROR);
. D'altra parte nella maggior parte dei casi gestire anche questi errori cos improbabili fin paranoico: se non funziona una GetWindowText vuol dire che ci sono problemi ben pi gravi.
In ogni caso lavorando con i dialog c' un modo pi comodo per recuperare il testo di un controllo, ossia la GetDlgItemText, che funziona praticamente come la GetWindowText:


char str[256];
if(!GetDlgItemText(hwnDlg, EOPEN, str, sizeof(str)))
MessageBox(hwndDlg, "Impossibile recuperare il testo della finestra.", "Errore", MB_ICONERROR);.
Comunque, ribadisco: prima di scrivere codice a caso, leggi la documentazione.

Loading