* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 19, 2024, 11:02:03 am

Inserisci il nome utente, la password e la durata della sessione.

398 Visitatori, 0 Utenti

Autore Topic: Problema con cella vuota Stringgrid  (Letto 9374 volte)

carmelo81

  • Newbie
  • *
  • Post: 48
  • Karma: +0/-0
Problema con cella vuota Stringgrid
« il: Agosto 05, 2013, 01:31:21 pm »
Buondi.
Con questo codice aggiungo un numero di righe nel componente stringgrid.

Codice: [Seleziona]
 
procedure TForm1.Edit1Change(Sender: TObject);
var
i,v : integer;
begin
   v:=strtoint(edit1.Text);
   stringgrid1.RowCount:=v+1;
   for i:=1 to stringgrid1.RowCount-1 do
   stringgrid1.Cols[0][i]:=inttostr(i);
end;
 

Quando scrivo un numero in una cella e passo alla cella successiva, esce il messaggio di errore - " " is an invalid float - evidentemente perchè la cella successiva è ancora vuota. E cosi per ogni cella.

Suggerimenti per poter risolvere?

Grazie mille
Carmelo
Carmelo

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Problema con cella vuota Stringgrid
« Risposta #1 il: Agosto 05, 2013, 02:35:42 pm »
Rileggi meglio l'errore ;)
Secondo me, il problema sta nel codice :
Codice: [Seleziona]
v:=strtoint(edit1.Text);
La cella centra poco o nulla in questi casi.
Avresti al massimo un errore sulla colonna o sulla riga inesistenti.
Qui il problema, sempre secondo me, è che nel campo edit1 non c'è nulla da convertire, quindi stringa non valida (nel senso che non ha caratteri validi per la conversione).

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

carmelo81

  • Newbie
  • *
  • Post: 48
  • Karma: +0/-0
Re:Problema con cella vuota Stringgrid
« Risposta #2 il: Agosto 05, 2013, 02:52:39 pm »
grazie per la risposta.
Però se non converto il valore dell'edit e lascio
Codice: [Seleziona]
v:=(edit1.Text)
mi da quest'altro errore:
Codice: [Seleziona]
unit1.pas(49,12) Error: Incompatible types: got "TTranslateString" expected "LongInt"

Carmelo

bonmario

  • Hero Member
  • *****
  • Post: 1300
  • Karma: +10/-1
Re:Problema con cella vuota Stringgrid
« Risposta #3 il: Agosto 05, 2013, 04:25:17 pm »
Ciao,
Stilgar intendeva dire che quando fai la conversione con StrToInt, la cesella Edit1 contiene qualcosa che non è un numero, quindi la conversione sbaglia.

Potresti provare a sostituire StrToInt con TryStrToInt che è spiegata qui http://delphi.about.com/library/rtl/blrtlTryStrToInt.htm in modo da potere emttere un errore se l'utente ha scritto nella casella qualcosa che non è un numero.
In alternativa, ma la cosa è un po' più complicata, potresti testare ogni tasto premuto dall'utente nell'edit, e fare in modo si accettare solo i numeri.

Ciao, Mario

brunello

  • Jr. Member
  • **
  • Post: 83
  • Karma: +0/-0
Re:Problema con cella vuota Stringgrid
« Risposta #4 il: Agosto 05, 2013, 05:06:00 pm »
per evitare che nel tedit vengano inseriti dati diversi puoi usare questo codice
Codice: [Seleziona]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (key in ['0'..'9', #08, #13]) then
    key := CHR(0);
end;
ciao Brunello

carmelo81

  • Newbie
  • *
  • Post: 48
  • Karma: +0/-0
Re:Problema con cella vuota Stringgrid
« Risposta #5 il: Agosto 05, 2013, 05:38:24 pm »
Mi chiedo,
ma cosa centra il valore che inserisco nell'edit se il problema nasce nel componente stringgrid?
L'edit mi serve solo per inserire un tot num di righe.
Il messaggio di errore esce fuori durante la digitazione all'interno della cella del componente stringgrid.
Forse mi sono spiegato male...?


Per Brunello:
Grazie, quel codice lo uso già nell'editi per controllare che non si digiti il punto ma la virgola per i valori decimali.
Carmelo

El Salvador

  • Visitatore
Re:Problema con cella vuota Stringgrid
« Risposta #6 il: Agosto 05, 2013, 06:19:27 pm »
Ma come mai usi il codice nell'evento OnChange del TEdit (lo deduco dal nome della procedura Edit1Change)? Cosi facendo richiami codice ogni volta che viene modificato il contenuto del TEdit (e per ogni volta intendo ogni volta che l'utente scrive o cancella anche una singola lettera o numero). Il che non è il massimo della ottimizzazione. :)


Citazione
Il messaggio di errore esce fuori durante la digitazione all'interno della cella del componente stringgrid.

Ovvero quando l'utente scrive in una determinata cella un valore?


A questo punto ci aiuteresti, dandoci un progetto (anche completamente vuoto ad eccezione del codice interessato) dove si presenta questo problema.
« Ultima modifica: Agosto 05, 2013, 06:27:14 pm da El Salvador »

carmelo81

  • Newbie
  • *
  • Post: 48
  • Karma: +0/-0
Re:Problema con cella vuota Stringgrid
« Risposta #7 il: Agosto 05, 2013, 06:45:59 pm »
Ma come mai usi il codice nell'evento OnChange del TEdit (lo deduco dal nome della procedura Edit1Change)? Cosi facendo richiami codice ogni volta che viene modificato il contenuto del TEdit (e per ogni volta intendo ogni volta che l'utente scrive o cancella anche una singola lettera o numero). Il che non è il massimo della ottimizzazione. :)
Eh lo so ma non mi piace l'idea di dover fare due operazioni, ovvero prima inserire un numero nell'edit e poi cliccare un tbutton per avviare il comando. :)

Citazione
Ovvero quando l'utente scrive in una determinata cella un valore?

Esattamente.

Allego l'intero progetto, grazie :)

http://www.mediafire.com/?ymdefmc1791ncjh
Carmelo

El Salvador

  • Visitatore
Re:Problema con cella vuota Stringgrid
« Risposta #8 il: Agosto 05, 2013, 06:49:24 pm »
Citazione
Eh lo so ma non mi piace l'idea di dover fare due operazioni, ovvero prima inserire un numero nell'edit e poi cliccare un tbutton per avviare il comando. :)
Cosi facendo si presentano due problemi:
- Il codice viene lanciato anche quando il TEdit.Text è vuoto (quando l'utente cancella il contenuto del text). Facilmente risolvibile con un if TEdit.Text <> '' then
- Se da te permesso, per i numeri formate da due cifre (es. 12), verrà richiamato quell'evento due volte (prima per 1 poi per 12).

Citazione
Esattamente.


Allego l'intero progetto, grazie :)
Il problema è in questo codice:
Codice: [Seleziona]
 procedure DisegnaLinea(GridOrigine: TstringGrid; out SerieGrafico:TlineSeries);
var
x,y: double;
n, i: integer;
begin
   SerieGrafico.clear;
   n:=GridOrigine.RowCount;
   if n>1 then
   begin
       for i:=1 to n-1 do
       begin
            x:=StrTofloat(GridOrigine.Cells[1,i]);
            y:=StrToFloat(GridOrigine.Cells[2,i]);
            SerieGrafico.AddXY(x,y,IntToStr(i));
       end;
   end;
end; 

Precisamente nei due StrTofloat. Infatti non controlli che nella cella ci sia scritto effettivamente qualcosa.


Hai due soluzioni:
A Prima di recuperare i valori x e y, effettui il controllo che ci sia effettivamente un numero nelle due celle celle dell'attuale riga (se nel caso non ci sia o prendi un valore di default o passi alla riga successiva segnalando l'errore all'utente), prima di disegnare il grafico
B Nel momento che crei le nuove righe, per ogni cella gli dai un valore di default (per es. 0)
« Ultima modifica: Agosto 05, 2013, 07:00:36 pm da El Salvador »

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Problema con cella vuota Stringgrid
« Risposta #9 il: Agosto 06, 2013, 08:44:49 am »
Ciao El Salvador,
  se serve impedire il data entry "ad pene segugiorum" con un controllo "forte" sul tipo di dato, puoi usare un MaskEdit o verificare a mano il contenuto del "tasto premuto". Se i caratteri da far passare sono pochi, meglio la seconda strada :D La prima usa un sistema simile alle espressioni regolari ...

Personalmente trovo fastidioso inserire 20 campi e tornare all'inizio per sistemare i dati che non sono conformi. Ma qui si parla di gusti personali ;)
Il fatto che venga richimato ad ogni pressione il filtro, non crea problemi di performance in termini assoluti (sempre che non ci attacchi il codice del calcolo del pi greco ;) per filtrare i caratteri :D ).
Presumibilmente ad ogni pressione dei tasti si ha:

1 jump.
n test e relativi jump(diciamo 12 nel caso dell'esempio?, e con nessun tipo di ottimizzazione del codice da parte del compilatore?)
e 1 mov .

L'ipotesi è di 26 istruzioni assembly.

Ora fare un azzardo sui cicli macchina mi sembra esagerato. (Dipende dall'architettura hw target della compilazione)
Cosa fanno i sistemi operativi tra la pressione di un tasto e l'altro?

I tempi di risposta del PC sono più rapidi del tempo in cui l'utente sposta le dita da un tasto all'altro? Allora la risposta è in real-time, come diceva il mio prof di automazione industriale.
(Lui diceva esattamente che il computer deve rispondere prima che l'utente provi il desiderio di suicidari o buttare il computer ... ma non proprio con queste parole, era un attimino più ruspante :D ).

Io punterei ad altri ambiti per l'ottimizzazione ;)
Punterei ad una gesione del disegno e delle animazioni in modo che siano fluide ;)
Se l'immagine va a scatti, non credo che all'utente interessi se l'applicazione ci mette 2 microsecondi in più a far vedere il numerino a video in fase di data entry :p
Che ne pensi?

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

El Salvador

  • Visitatore
Re:Problema con cella vuota Stringgrid
« Risposta #10 il: Agosto 11, 2013, 06:23:21 pm »
Citazione
se serve impedire il data entry "ad pene segugiorum" con un controllo "forte" sul tipo di dato, puoi usare un MaskEdit o verificare a mano il contenuto del "tasto premuto". Se i caratteri da far passare sono pochi, meglio la seconda strada :D La prima usa un sistema simile alle espressioni regolari ...
Ma infatti ho suggerito un controllo del contenuto del TEdit "a mano", dato che nel programma creato da Carmelo81 servono solo numeri (Brunello ha postato il codice).

Citazione
Il fatto che venga richimato ad ogni pressione il filtro, non crea problemi di performance in termini assoluti (sempre che non ci attacchi il codice del calcolo del pi greco ;) per filtrare i caratteri :D ).
Infatti non crea nessun problema, ma perchè richiamare due volte il codice (che sia il calcolo di due variabili Integer o il calcolo dell'equazione di Drake :D ), quando è possibile richiamarlo solo quando serve? :)

Poi naturalmente bisogna vedere anche il contesto del programma. Per la realizzazione di un semplice grafico si potrebbe utilizzare questo sistema real time, ma quando bisogna realizzare un complesso grafico con diversi numeri da prendere in considerazione per il calcolo?

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Problema con cella vuota Stringgrid
« Risposta #11 il: Agosto 11, 2013, 11:00:38 pm »
Mi sto perdendo ... aiuuuuuttttto (Come disse Seed in Era Glaciale 2).
Si parlava di far eseguire il controllo 2 volte ...?
Ma l'onchange (in genere) scatta una volta sola.
Come il keypress suggerito da Brunello.
Era su questo assunto che ho bastato le mie considerazioni.
Perchè il controllo dovrebbe essere eseguito 2 volte?
Sugli eventi della tastiera si possono fare 2 volte i controlli, ma in genere il primo "brucia" il secondo: KeyDown and KeyUp, ma li ho usati si è no 1 volta, tanto per vedere l'effetto che fa (Iannacci docet). Con pressed sei a posto. Viene eseguito una sola volta....
Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18772
  • Topic in totale: 2233
  • Online Today: 578
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 398
Total: 398

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.