Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Usare l'edit

    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
    codice:
    EDITTEXT        TN,67,56,18,12,ES_AUTOHSCROLL | ES_NUMBER
    e questo static
    codice:
    LTEXT           "0",IDC_STATIC,40,20,11,11
    e una dialog procedure
    codice:
    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
    Peppe

  2. #2
    Intanto devi dare un nome univoco a quello STATIC... questo codice vale ammettendo che tu l'abbia chiamato IDC_DN:
    codice:
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    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
    codice:
    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
    Peppe

  4. #4
    Ma LPTSTR non è uguale a const char*? A cosa serve convertirlo?
    printf("Programmazione in C!");
    cout<<"Programmazione in C++!";

  5. #5
    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:
    codice:
    char str[256]; //era: LPTSTR str;
    .
    Leggiamo le descrizioni dei parametri:
    codice:
    int GetWindowText(HWND hWnd,
        LPTSTR lpString,
        int nMaxCount
    );
    hWnd
    [in] Handle to the window or control containing the text.
    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):
    codice:
    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:
    codice:
    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:
    codice:
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.