Sono perplesso: nel banalissimo programma vorrei convertire in stringa il valore di Pigreco (3,1415). So che dovrebbe esserci una specifica variabile per pigreco, ma il punto è un altro.
Nei tre screenshot viene segnalato un errore perché si aspetta una QWord. Ma anche dichiarando PiGreco come QWord il valore non viene accettato.
Ho provato (non si sa mai...) ad assegnare altri tipi, ma non funziona.
Come mai?
procedure TForm1.Button1Click(Sender: TObject);
// Elementi di una circonferenza
Var Raggio: Integer;
Var PiGreco: Double;
begin
PiGreco:= 3.1415;;
Raggio:= StrToInt(Edit1.text);
Begin
Label1.Caption:=('Circonferenza di raggio ' + Edit1.text + ' = ' + IntToStr(Raggio * PiGreco*2));
Label2.Caption:=('Diametro di raggio ' + Edit1.text + ' = ' + IntToStr(Raggio * 2));
Label3.Caption:=('Cerchio di raggio ' + Edit1.text + ' = ' + IntToStr(Raggio * Raggio * PiGreco));
end;
end;
Ancora... Attenzione al valore decimale eventualmente presente in un stringa: per convertirlo in valore numerico occorre che sia presente il carattere virgola (,) e non punto (.)
Qui di seguito il codice in cui ho usato una funzione cui passare un valore numerico "estratto" dalla stringa presente in un Edit.
Lo screenshot chiarisce ulteriormente il concetto.
Procedure circonferenza(Raggio:ValReal);
Var Pi:ValReal;
Var PiGreco: Double;
begin
Pi:= 3.141592653589793238462643383279502884197169399;
PiGreco:= 3.141592653589793238462643383279502884197169399;
Begin
Form1.Label1.Caption:=('Circonferenza di raggio ' + Form1.Edit1.text + ' = ' + FloatToStr(Raggio * PiGreco*2));
Form1.Label2.Caption:=('Diametro di raggio ' + Form1.Edit1.text + ' = ' + FloatToStr(Raggio * 2));
Form1.Label3.Caption:=('Cerchio di raggio ' + Form1.Edit1.text + ' = ' + FloatToStr(Raggio * Raggio * PiGreco));
Form1.Label6.Caption:=('Pigreco /ValReal): ' + FloatToStr(Pi));
Form1.Label5.Caption:=('Pigreco / (Double): ' + FloatToStr(PiGreco));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
// Elementi di una circonferenza
Var Raggio: ValReal;
Var Posizione: Integer;
Var Trovato:Boolean;
Var Carattere:String;
begin
Begin
Trovato:=False;
For Posizione:= 1 to Length(Edit1.Text) Do
Begin
Carattere:= Copy(Edit1.Text,Posizione,1);
If Carattere = '.' then
Begin
ShowMessage('Attenzione! Punto invece di Virgola!');
Trovato := True;
end;
End;
end;
If Trovato = True then exit;
Raggio:= StrToFloat(Edit1.Text);
Circonferenza (Raggio);
end;
end.
Ecco in allegato la demo. Scarica il progetto per capire il tutto. E' più facile a vedersi che a dirsi .... ;D
Posto piccola parte del codice ...
var Locale: TFormatSettings;
//Carica il formato locale
GetLocaleFormatSettings(SysLocale.DefaultLCID, Locale);
procedure TForm1.ED_EventoKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var tempObj: TEdit;
valuestr: string;
ValueFloat: double;
begin
if key = VK_RETURN then
begin
if Sender is TEdit then
begin
.......
Ciao
Approfitto della tua tradizionale(!) cortesia(!!) per chieder un'info "al volo": (cfr. Form del primo post) come devo fare per passare il contenuto dell'Edit1 - quando premo invio - ..............
...uhmm... ho scaricato e ho cercato(!) di capire, ma credo che non mi sia spiegato bene.
1) Anzitutto (IMHO) VK_Return dovrebbe essere una costante "riservata", ma a giudicare dal messaggio di errore non lo è (certo, il listato non è completo, ma...)
2) Il programma che mi hai mandato cambia colore all'Edit e agisce quindi solo all'interno dell'Edit stesso.
3) Il mio obiettivo (cfr. screenshot) è invece attivare automaticamente la sezione ButtonClick del programma quando si preme il pulsante invio nell'Edit, cioè come se si premesse Invio contemporaneamente nell'Edit e nel Button.
Sei comunque gentilissimo nel dedicare tanto tempo a un newbie! Conserverò gelosamente il programma ZIP per futuri sviluppi.
1) Non hai copiato bene ..... se vedi nel codice postato nelle USES c'è "LCLTYPE" .... c'è un motivo se c'è quell'unità.
2) Come descritto nel programma quel cambio colore serve solo a segnalare all'utente che il dato è stato acquisito. Commenta il codice se non ti piace.
3) Vedi in testa all'inizio del post, avevi richiesto come gestire il tasto INVIO nella TEDIT per passare i dati, quello è il codice. Dentro il codice, se vuoi anche fare premere il pulsante Button1 in automatico segui quanto scritto qui (ti posto solo un pezzo, il resto completalo tu, in pratica devi aggiungere Button1.Click anche sul secondo "CASE"):
//Distinguiamo il controllo tramite la proprietà TAG del controllo stesso
Case tempObj.tag of
1: // Perimetro
begin
//!!!!! PREMI ESC PER USCIRE DALLA SHOWMESSAGE .... NON E' CORRETTO FARE UNA SHOWMESSAGE QUI, E' SOLO PER ESEMPIO
ShowMessage('Il valore immesso del perimetro è: '+ FloatToStr(ValueFloat, Locale));
//Qui puoi fare quello che vuoi con il valore ValueFloat che corrisponde al PERIMETRO
//Ad esempio assegnarlo ad una variabile globale.
......................
......................
//Qui chiami l'evento "click" come se avvessi premuto il BUTTON1, ovviamente devi avere gestito l'evento OnCLick di Button1.
Button1.Click;
//Cambiamo il colore di fondo per segnalare all'utente che abbiamo ricevuto l'INPUT
tempObj.Color := clAqua;
end;
Ciao
1) Non hai copiato bene ..... se vedi nel codice postato nelle USES c'è "LCLTYPE" .... c'è un motivo se c'è quell'unità.
[... eccetera ...]
Ah... ecco perché! 👍
Ora tutto funziona. Per semplificare, riporto qui di seguito l'intero codice. Negli screenshot i dettagli più interessanti. C'è quel solo parametro Shift (non usato). Avrei voluto eliminarlo per rendere il listato ancora più "pulito" e ho provato a rimuovere "shift" un po' a casaccio ("così, di botto, senza motivo" cit.). Però Lazarus si arrabbiava e non me lo ha fatto togliere. Poco male: finalmente ORA HO LE IDEE PIU' CHIARE.
unit A_2022_11_14_Prog_240_Funzioni_A_pas;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,LCLTYPE;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
procedure Button1Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
Procedure circonferenza(Raggio:ValReal);
Var Pi:ValReal;
Var PiGreco: Double;
begin
Pi:= 3.141592653589793238462643383279502884197169399;
PiGreco:= 3.141592653589793238462643383279502884197169399;
Begin
Form1.Label1.Caption:=('Circonferenza di raggio ' + Form1.Edit1.text + ' = ' + FloatToStr(Raggio * PiGreco*2));
Form1.Label2.Caption:=('Diametro di raggio ' + Form1.Edit1.text + ' = ' + FloatToStr(Raggio * 2));
Form1.Label3.Caption:=('Cerchio di raggio ' + Form1.Edit1.text + ' = ' + FloatToStr(Raggio * Raggio * PiGreco));
Form1.Label6.Caption:=('Pigreco /ValReal): ' + FloatToStr(Pi));
Form1.Label5.Caption:=('Pigreco / (Double): ' + FloatToStr(PiGreco));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
// Elementi di una circonferenza
Var Raggio: ValReal;
Var Posizione: Integer;
Var Trovato:Boolean;
Var Carattere:String;
begin
Begin
Trovato:=False;
For Posizione:= 1 to Length(Edit1.Text) Do
Begin
Carattere:= Copy(Edit1.Text,Posizione,1);
If Carattere = '.' then
Begin
ShowMessage('Attenzione! Punto invece di Virgola!');
Trovato := True;
end;
End;
end;
If Trovato = True then exit;
Raggio:= StrToFloat(Edit1.Text);
Circonferenza (Raggio);
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if key = VK_RETURN then Button1.Click;
end;
end.
Invece di ciclare per tutta la stringa, esiste una funzione standard già presente in Pascal: "Pos(".
var i: integer;
i := Pos('.', Edit1.Text, 1);
if i > 0 then
trovato := true;
Ciao
Invece di ciclare per tutta la stringa, esiste una funzione standard già presente in Pascal: "Pos(".
Fatto! Ho aggiunto qualche riga di codice per evitare che l'utente rimanga basito in assenza di elaborazione o di messaggi di errore.
procedure TForm1.Button1Click(Sender: TObject);
// Elementi di una circonferenza
Var Raggio: ValReal;
Var Posizione: Integer;
begin
If Edit1.text <> '' then
Begin
Posizione:= Pos('.',Edit1.Text,1);
If Posizione > 0 then
Begin
ShowMessage('Attenzione!' + chr(13) +'Hai digitato punto (.) invece di virgola (,)');
Edit1.text:='';
exit;
end;
Raggio:= StrToFloat(Edit1.Text);
Circonferenza (Raggio);
end
Else ShowMessage('Nessun carattere in Edit1!');
end;
Rimane da spiegare la presenza di Hint: Parameter "Shift" not used e come eliminarla.