Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [Delphi] try....except

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16

    [Delphi] try....except

    Salve,

    Non riesco a fare i calcoli, appena premo sul bottone calcola mi esegue sempre:

    codice:
    ShowMessage('Assicurarsi di aver inserito correttamente i valori');
    ma i valori sono corretti se avete tempo ci date un occhio?

    Vi ringrazio

    codice:
    procedure TForm1.BCalcolaClick(Sender: TObject);
    var
      n1, n2, n3, n4, n5, n6, n7, n8, c, a, b: real;
    
    begin
    
      try
    
    
        n1 := strtoFloat(Km_Percorsi.Text);    //converto da stringa a real
        n2 := strtoFloat(Consumo_Auto.Text);    //converto da stringa a real
        n3 := strtoFloat(Costo_Carburante.Text); //converto da stringa a real
        n4 := strtofloat(Spese_Viaggio.Text);   //converto da stringa a real
        n5 := strtofloat(ristorante.Text);   //converto da stringa a real
        n6 := strtofloat(albergo.Text);      //converto da stringa a real
        n7 := strtofloat(totale_rimborsi.Text); //converto da stringa a real
        n8 := strtofloat(Spese_auto.Text);       //converto da stringa a real
        c := (n1 / n2) * n3 + n4 + n7 + n8; //eseguo il calcolo e lo assegno a c
        a := (n1 / n2) * n3;                 //eseguo il calcolo e lo assegno in a
        b := n5 + n6 + n4;                   //eseguo il calcolo e lo assegno in b
        totale_rimborsi.Text := floattostr(b);
        //Assegno la variabile a totalerimb... e la rinconverto 
        Spese_Auto.Text := Floattostr(a);
        //Assegno la variabile a spese... e la rinconverto 
        Totale.Text := Floattostr(c);
        //Assegno la variabile a totale... e la rinconverto 
    
    
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
        on EDivByZero do
          ShowMessage('Attenzione stai dividendo per zero!');
    
      end;
    
    end;

  2. #2
    Se modifichi la riga except in "Except on e: Exception" e poi metti ShowMessage(e.message)
    vedi dove stà l'errore..

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    Ciao Denis,

    ho fatto come mi hai consigliato:


    codice:
    except
        on e: Exception do
    
          ShowMessage(e.message);
    
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
        on EDivByZero do
          ShowMessage('Attenzione stai dividendo per zero!');
    
      end;
    Mi esce : '''' is invalid float

    Le uniche caselle che non vengono scritte sono :


    codice:
        totale_rimborsi.Text := Floattostr(b);
        //scrivo nella casella di testo e riconverto la variabile
        Spese_Auto.Text := Floattostr(a);
        //scrivo nella casella di testo e riconverto la variabile
        Totale.Text := Floattostr(c);
        //scrivo nella casella di testo e riconverto la variabile
    Ma aspettano il risultato

    Vi ringrazio

  4. #4
    Attenzione alla virgola oppure punto come valore...

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    La metto giusta la virgola, ma non ne vuole sapre

    forse sto sbagliando la sequenza delle righe?

  6. #6
    Prova ad usare Extended anziché Real.

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    niente è uguale

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    codice:
    n1 := strtoFloat(Km_Percorsi.Text);    //converto da stringa a real
        n2 := strtoFloat(Consumo_Auto.Text);    //converto da stringa a real
        n3 := strtoFloat(Costo_Carburante.Text); //converto da stringa a real
        n4 := strtofloat(Spese_Viaggio.Text);   //converto da stringa a real
        n5 := strtofloat(ristorante.Text);   //converto da stringa a real
        n6 := strtofloat(albergo.Text);      //converto da stringa a real
        //n7 := strtofloat(totale_rimborsi.Text); //converto da stringa a real
        //n8 := strtofloat(Spese_auto.Text);         //converto da stringa a real
    
        c := (n1 / n2) * n3 + n4 + n6 + n5 + n7 + n8; //eseguo il calcolo e lo assegno a c
        a := (n1 / n2) * n3;                 //eseguo il calcolo e lo assegno a a
        b := n5 + n6 + n4;
        //scrivo nella casella di testo e riconverto la variabile
        Spese_Auto.Text := Floattostr(a);
        //scrivo nella casella di testo e riconverto la variabile
        totale_rimborsi.Text := Floattostr(b);
        //scrivo nella casella di testo e riconverto la variabile
        Totale.Text := Floattostr(c);
    
    
    
      except
    
        on e: Exception do
    
          ShowMessage(e.Message);
    
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
        on EDivByZero do
          ShowMessage('Attenzione stai dividendo per zero!');
    
      end;
    
    end;
    Ciao commentando n7 e n8 mi esegue il calcolo cosa sto sbagliando in n7 e n8?

    Ringrazio

  9. #9
    Utente bannato
    Registrato dal
    Dec 2012
    Messaggi
    679
    La logica non è esattamente... quella che sceglierei.
    Se utilizzi componenti che possono contenere qualsiasi valore, devi incapsulare i cast espliciti, ogni volta, in un blocco try...except

    try
    converti
    except
    scrivi "non va bene"
    end

    try
    converti
    except
    scrivi "non va bene2"
    end

    e così via, un unico blocco come fai non ha un gran senso (anzi, diciamocelo, nessuno).

    riguardo poi alla pre-conversione, ovvero essere sicuro di passare una stringa che sia un float a strtofloat, ci sono vari approcci.
    il più banale è quello di definire una funzione
    purgafloat cui passi una stringa e che ti ritorna il float, con qualcosa del tipo
    s:='';
    i_stringa:=trim(i_stringa);

    for i:=1 to length(i_stringa) do
    begin
    if (i_stringa[i]='.') then
    s:=s+DECIMALSEPARTOR
    else
    if (i_stringa[i]=',' then
    s:=s+DECIMALSEPARATOR
    else
    if (i_stringa[i] in ['0'..'9']) then
    s:=s+i_stringa;
    end;

    puoi "condire" con un test sul segno (iniziale), potrebbe essere + e -, e sull'esistenza di uno (e un solo) separatore decimale o comunque carattere non numerico

    Poi passi alla conversione

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2012
    Messaggi
    16
    Ciao franzauker2.0,

    Quando hai tempo puoi dirmi se va bene?

    codice:
    procedure TForm1.BCalcolaClick(Sender: TObject);
    var
      n1, n2, n3, n4, n5, n6, n7, n8, c, a, b: real;
    
    begin
    
      try
        n1 := strtoFloat(Km_Percorsi.Text);    //converto da stringa a real
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        n2 := strtoFloat(Consumo_Auto.Text);
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        n3 := strtoFloat(Costo_Carburante.Text);
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        n4 := strtofloat(Spese_Viaggio.Text);
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        n5 := strtofloat(ristorante.Text);
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        n6 := strtofloat(albergo.Text);
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        n7 := strtofloat(totale_rimborsi.Text);
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        n8 := strtofloat(Spese_auto.Text);
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
    
        c := ((n1 / n2) * n3) + n4 + n6 + n5 + n7 + n8;
    
    
      except
    
        on EDivByZero do
          ShowMessage('Attenzione stai dividendo per zero!');
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
      try
        a := (n1 / n2) * n3;
      except
        on EDivByZero do
          ShowMessage('Attenzione stai dividendo per zero!');
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
    
      try
        b := n5 + n6 + n4;
      except
        on ECONVERTERROR do
          ShowMessage('Assicurarsi di aver inserito correttamente i valori');
      end;
    
    
      //scrivo nella casella di testo e riconverto la variabile
      Spese_Auto.Text := Floattostr(a);
      //scrivo nella casella di testo e riconverto la variabile
      totale_rimborsi.Text := Floattostr(b);
      //scrivo nella casella di testo e riconverto la variabile
      Totale.Text := Floattostr(c);
    
    end;
    Per il resto non ho capito molto bene, anche perchè sono alle prime armi con il Delphi
    Se puoi spiegarmelo in maniera più semplice è meglio.(sempre se puoi)
    Ti ringrazio

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 © 2024 vBulletin Solutions, Inc. All rights reserved.