Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: gianpa - Gennaio 19, 2013, 07:02:57 pm

Titolo: messaggio econvertitor
Inserito da: gianpa - Gennaio 19, 2013, 07:02:57 pm
perchè quando lancio il programma e provo una divisione mi dice che 10,00 non è un float valido ???
l'ho dichiarato come currency e ho appurato che è compatibile con strToFloat !!!
il currency non è un valore decimale ?


ciao e grazie in anticipo!!!
Titolo: Re:messaggio econvertitor
Inserito da: nomorelogic - Gennaio 19, 2013, 08:19:45 pm
puoi postare codice e messaggio d'errore?

così non è facile, viene solo da chiedere se hai scritto il numero con la virgola anziché col punto :)
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 20, 2013, 10:05:18 am
sì il numero è scritto con la virgola !
però io ho inserito i dati nel database usando sqliteAdmin ; io ho messo solo il 10 e quando salvo viene visualizzato così: 10,00 !

ciao
Titolo: Re:messaggio econvertitor
Inserito da: nomorelogic - Gennaio 20, 2013, 11:20:36 am
immagino che l'altro topic si riferisca allo stesso problema
comunque:
se hai inserito un valore in un database con sqliteAdmin e l'istruzione è andata a buon fine, vuol dire che nel database il valore è giusto.

probabilmente nell'interrogare il database ti viene restituito formattato con la virgola
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 20, 2013, 11:32:13 am
mi spiego:
se ho una variabile spesa:currency;
quando cerco di usare la conversione strToFloat:
spesa:=strtofloat(dbedit1.Text);

mi dice che 10,00 che si trova nel dbedit1 non è un valore FLOAT valido e mi genera un'eccezione!

ciao
Titolo: Re:messaggio econvertitor
Inserito da: nomorelogic - Gennaio 20, 2013, 12:01:19 pm
nella proprietà Text del TDbEdit ci trovi il numero formattato con le regole della localizzazione: cioè con il separatore decimale che è a virgola.
dovresti valorizzare 'spesa' con il valore contenuto nel campo del dataset, lo stesso campo che è specificato in TDbEdit e che gli da il valore.

Se devi usare il valore inText, devi prima convertire la "," in "." e poi usi StrToFloat, ma l'approccio giusto è quello sopra.
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 20, 2013, 12:45:03 pm
valorizzare spesa in che modo ? usando editMask ?
esiste una proprietà che assegna al dbEdit un formato predefinito ?

oppure intendevi altro ?

ciao
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 20, 2013, 12:51:01 pm
veramente ho già provato e vedo che quello che intendevo io non si può fare perchè gestito dal campo abbinato al db : è già vincolato al tipo di dato e non mi lascia inserire un valore di 10.00 ,ma solo 10 e poi mette la virgola oppure 10,00 che accetta così

ciao
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 22, 2013, 01:40:35 pm
secondo voi se cambio il valore del campo da currency a FLOAT non otterrei più quel problema ?

ciao
Titolo: Re:messaggio econvertitor
Inserito da: nomorelogic - Gennaio 22, 2013, 05:06:07 pm
non credo cambi molto

devi valorizzare la variabile "spesa" leggendo il valore da: dataset.nomecampo.Asfloat
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 22, 2013, 06:19:22 pm
allora io ragionavo così : per fare le operazioni che mi interessano tra i vari campi del dataset trasformo la stringa contenuta nella casella in FLOAT (spesa1:=strtofloat(dbedit1.Text);) quindi penso di usare un float ! quando invece faccio ad es. l'operazione spesa1+spesa2=spesaTotale
l'eccezione mi dice che quel 10,00 che trova in dbedit1 non è un float valido!
è sicuro che sbaglio qualcosa IO ,il computer esegue e basta, ma non riesco a capire cosa !?

ciao e grazie per la pazienza!
p.s.:per evitare di riscrivere tutto ho copiato un po' di codice dal mio progetto in delphi dove avevo già lavorato parecchio per far funzionare il tutto e mi aspettavo che andasse bene anche in lazarus!
c'è qualcosa che mi sfugge...forse è nel diverso db!!!!!!!
Titolo: Re:messaggio econvertitor
Inserito da: nomorelogic - Gennaio 22, 2013, 06:28:37 pm
allora:

in TDBEdit.Text c'è un valore (o meglio la rappresentazione in stringa di un valore) perchè hai una proprietà DataSource che è collegata ad una query su un database. Non solo: c'è anche l'indicazione di quale campo del dataset deve fornire il valore al TDBEdit.

Quindi non devi fare:
spesa1:=strtofloat(dbedit1.Text)
ma
spesa1:=dataset.fieldname.AsFloat

Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 23, 2013, 08:39:34 am
il mio dbEdit1 noin ha una proprietà "text" ,ma solo una "datafield" !
indicare il dataset mi riusciva immediato in delphi ,ma ora in lazarus mi trovo in difficoltà !!!
infatti non riesco a indicarlo in nessun modo ... lo identifico come la tabella che uso?
nell'object inspector non lo trovo in alcun componente ;
se sostituisco pari pari le due espressioni di SPESA1 mi trovo subito nel classico errore di identifier not found (ovvio)

mi sento perso in un bicchiere d'acqua e sì che mi DIVERTO a programmare dal turbo pascal al delphi2007 ,non da ieri

ciao e grazie per la pazienza
Titolo: Re:messaggio econvertitor
Inserito da: nomorelogic - Gennaio 23, 2013, 10:03:42 am
prova
Codice: [Seleziona]
spesa1 := DBEdit1.Datasource.DataSet.FieldByName(DBEdit1.FieldName).AsFloat;
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 23, 2013, 10:31:18 am
ho messo :
DBEdit1.Datasource.DataSet.FieldByName(DBEdit1.DataField).AsFloat;

per identificare il nome del campo perchè fieldname non lo riconosce e non ammette il nome del campo della mia tabella (costo1)

però ,pur funzionando,mi ritorna lo stesso errore che mi dava all'inizio perchè forse i metodi si equivalgono ma quando trova il valore 10,00 (o altro con la virgola) mi dice "10,00 is an invalid float"

ciao
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 23, 2013, 10:37:23 am
forse non c'entra la conversione ,ma è un errore del db !!!
io ho creato un campo assegnando un valore CURRENCY cioè monetario
però nel dbEdit non mi appare il valore € 10,00 ,ma il valore ? 10,00 !
come mai ?
non è che dice INVALID perchè trova quel ? "punto di domanda" ???

ciao
Titolo: Re:messaggio econvertitor
Inserito da: nomorelogic - Gennaio 23, 2013, 11:29:45 am
forse sono incasinati i campi persistenti (fields editor) controlla quelli
poi se non viene fuori nulla potresti allegare db di prova + progetto?

così quando abbiamo modo proviamo a dare un'occhiata
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 23, 2013, 03:56:16 pm
ho controllato la proprietà fieldDefs della sqlQuery1 dove mi dice che spesa1 è ftCurrency e oggetti è ftInteger;
dovendo dividere la spesa per il numero oggetti per ottenere il costo del singolo oggetto mi sembra tutto ok!

in sqliteAdmin una volta creata la tabella non riesco a vedere più come sono le definizioni dei campi! o forse non ne sono capace?!?

voglio provare a creare una nuova tabella mettendo FLOAT al posto di CURRENCY per vedere se mi dà lo stesso errore!

ciao
Titolo: Re:messaggio econvertitor
Inserito da: Stilgar - Gennaio 23, 2013, 10:36:06 pm
Con sqliteAdmin puoi chieder di vedere "l'sql" della tabella.
In pratica puoi farti dare le istruzioni ddl con cui hai creato la tabella. Anche se le hai create con il wizard le estrae comunque.
Se vuoi avere una seconda tabella non ci sono problemi, cambi il nome | run e sei a cavallo.
Per eliminare le tabelle, ti ricordo, che il comando ddl è
Codice: [Seleziona]
drop table {nome_tabella}
Stilgar

EDIT:
Per vedere da wizard come hai definito la tabelle:
Tasto DX sulla tabella d'interesse.
Modifica.

;)
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 24, 2013, 07:45:55 pm
Ti ringrazio ! in effetti ci ero arrivato provando e riprovando!
comunque ancher mettendo campo1:FLOAT (invece di currency)
l'errore INVALID FLOAT mi esce comunque !
boh...mi sento un po' perso!

ciao
Titolo: Re:messaggio econvertitor
Inserito da: Stilgar - Gennaio 24, 2013, 08:57:12 pm
Riposta il progetto ... come l'ultima volta.
Vediamo cosa si è rotto.

Stilgar
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 24, 2013, 10:58:01 pm
va bene!
eccoti :

e grazie
Titolo: Re:messaggio econvertitor
Inserito da: Stilgar - Gennaio 26, 2013, 01:45:09 am
Prova a seguire il consiglio di nomore fino in fondo ;)
Avevi iniziato bene :è
Codice: [Seleziona]


procedure TForm1.BitCalcolaClick(Sender: TObject);

var
  costopalle, palle, costopalla, costoinneschi, inneschi, costoinnesco, costochilopolvere, polvere, costopolvere, costograno, costobossolo,
  spesabossolo, spesa, spesa2, spesa3, spesa4,(*spesa5,*)spesa6: double;
  riutilizzi: integer;

begin
  // costopalle:=sqlquery1.DataSource.dataset.fieldname.AsFloat;
  //    DBEdit1.Datasource.DataSet.FieldByName(DBEdit1.DataField).AsFloat;
  if DBEdit1.DataSource.State in dsEditModes then
    DBEdit1.DataSource.DataSet.Post;
  costopalle := dbedit1.DataSource.DataSet.FieldByName(DBEdit1.DataField).AsFloat;
  palle := dbedit2.DataSource.DataSet.FieldByName(DBEdit2.DataField).AsFloat;
  costopalla := costopalle / palle;
  costoinneschi := dbedit3.DataSource.DataSet.FieldByName(DBEdit3.DataField).AsFloat;
  inneschi := dbedit4.DataSource.DataSet.FieldByName(DBEdit4.DataField).AsFloat;
  costoinnesco := costoinneschi / inneschi;
  costochilopolvere := dbedit5.DataSource.DataSet.FieldByName(DBEdit5.DataField).AsFloat;
  // if checkboxlibre1.Checked=true then costochilopolvere:=strtofloat(dbedit5.Text)*2.2;
  costograno := costochilopolvere / 15432;
  polvere := dbedit6.DataSource.DataSet.FieldByName(DBEdit6.DataField).AsFloat;
  costopolvere := costograno * polvere;
  costobossolo := dbedit7.DataSource.DataSet.FieldByName(DBEdit7.DataField).AsFloat;
  spesabossolo := 0;
  try
    riutilizzi := dbedit8.DataSource.DataSet.FieldByName(DBEdit8.DataField).AsInteger;
    spesabossolo := costobossolo / riutilizzi;
  except
    //gestiscierrori;
    ShowMessage('Divisione per zero non consentita');
  end;
  spesa := costopalla + costoinnesco + costopolvere + spesabossolo;
  spesa2 := spesa * 100;
  spesa3 := spesa * 1936;
  spesa4 := spesa * 50;
  (*   spesa5:=spesa2*50;            *)
  spesa6 := spesa3 * 50;

  lblresult1.Caption := AnsiToUTF8(format('La Palla Costa  %m', [costopalla]));
  lblresult2.Caption := format('L''innesco Costa  %m', [costoinnesco]);
  lblresult3.Caption := format('La Polvere Costa  %m', [costopolvere]);
  lblresult4.Caption := format('Il Bossolo Costa  %m', [spesabossolo]);

  (* risultato.Caption:=format('      %m     ',[spesa]);      *)
  risultatoCent.Caption := format('  Centesimi di  %m  ', [spesa2]);
  risultatoLire.Caption := format('  Vecchie Lire  %f ', [spesa3]);
(*
lblresult1.Caption:='la palla ti costa € '+FloatToStr(costopalla);
lblresult2.Caption:='l''innesco ti costa € '+FloatToStr(costoinnesco);
lblresult3.Caption:='la polvere ti costa € '+FloatToStr(costopolvere);
lblresult4.Caption:='il bossolo ti costa € '+FloatToStr(spesabossolo);

 risultato.Caption:='  '+ floattostr(spesa)+' in €uro';
 risultatoCent.Caption:='  '+Floattostr(spesa2)+' centesimi';
 risultatoLire.Caption:='  '+Floattostr(spesa3)+' vecchie £ire'
 *)
  euro50.Caption := format('      %m     ', [spesa4]);
  (*  Cent50.Caption:=format('  Centesimi di  %m  ',[spesa5]);   *)
  Lire50.Caption := format('  Vecchie Lire  %f ', [spesa6]);

end;
     

Titolo: Re:messaggio econvertitor
Inserito da: Stilgar - Gennaio 26, 2013, 01:48:43 am
Poi mi spiegherai a cosa serve questo calcolatore di spese per la lupara... ;)
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 26, 2013, 08:36:59 pm
ahahahah....intanto grazie !!!!!
non preoccuparti ...il programma non spara a nessuno!
è solo una parte di programma che calcola le spese dei tiratori del tiro a segno !


ciao
Titolo: Re:messaggio econvertitor
Inserito da: gianpa - Gennaio 27, 2013, 07:21:16 pm
Funziona perfettamente !
Ora me lo studio per capire cosa non andava!

intanto grazie !

CIAOoooooooooooo