* * * *

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 27, 2024, 09:31:07 am

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

327 Visitatori, 0 Utenti

Autore Topic: [RISOLTO] Eccezione non gestita  (Letto 254 volte)

sanric

  • Newbie
  • *
  • Post: 20
  • Karma: +0/-0
    • RiccardoSantato.net
[RISOLTO] Eccezione non gestita
« il: Marzo 12, 2024, 04:22:49 pm »
Salve a tutti,

chiedo scusa per la banalità della domanda ma sono un 'niubbo' alle prime armi con Lazarus/FPC.
In una dbGrid che mostra solo il codice cliente e la sua anagrafica, provo appositamente a modificare il valore del codice rendendolo uguale a quello di un altro cliente. Chiaramente tale codice è UNIVOCO per definizione e la mia routine deve generare un'eccezione che provo a gestire.
Tuttavia non riesco nell'intento:

Codice: [Seleziona]
procedure TmainWind.aggiornaClienti(Sender: TObject);
begin
 
     if SQLTrans.Active then  // Controllo che la transaction sia attiva
        try
          SQLQuery.ApplyUpdates();  // Questa procedura non dovrebbe andare a buon fine...
        except
          on E: ESQLDatabaseError do  // ... sollevando questa eccezione che tuttavia non riesco ad intercettare
          begin
             ShowMessage(E.Message);
             Exit();
          end;
        end;
end;

Convinto che mi sto perdendo in un bicchiere d'acqua, vi chiedo se potete farmi capire meglio dove sbaglio.
Grazie mille per tutti gli aiuti!
« Ultima modifica: Marzo 13, 2024, 11:55:12 am da sanric »

slapshot

  • Jr. Member
  • **
  • Post: 85
  • Karma: +1/-0
Re:Eccezione non gestita
« Risposta #1 il: Marzo 12, 2024, 04:47:07 pm »
Citazione
Chiaramente tale codice è UNIVOCO per definizione e la mia routine deve generare un'eccezione che provo a gestire.

Ciao, credo che in ciò che affermi ci sia un errore concettuale. Se il codice è univoco non dovrebbe esserci la possibilità per l'operatore di modificare tale codice. La chiave primaria di una tabella di un db sql non può essere violata e l'eccezione (ma qui attendo la smentita dei più esperti) è gestita nel componente di accesso al db che la intercetta e la manifesta.

sanric

  • Newbie
  • *
  • Post: 20
  • Karma: +0/-0
    • RiccardoSantato.net
Re:Eccezione non gestita
« Risposta #2 il: Marzo 12, 2024, 05:33:55 pm »
Comprendo che ci sia un errore concettuale ma la mia piccola applicazione è costruita per imparare ad usare il linguaggio ed il suo ecosistema, non certo per un utilizzo professionale.
Mi sono dimenticato di specificarlo.  ;D

slapshot

  • Jr. Member
  • **
  • Post: 85
  • Karma: +1/-0
Re:Eccezione non gestita
« Risposta #3 il: Marzo 12, 2024, 06:01:45 pm »
Siamo tutti principianti, non ti preoccupare. Io per primo LOL :D

Allora se hai un id univoco nella tabella che identifica un record univocamente, questo deve essere, generalmente, un campo che ha poco senso per l'utente e prevalentemente nascosto. Per cui un campo di autoincremento, un GUID ecc..

Se la modifica che devi effettuare è necessariamente su una dbgrid potresti usare l'evento ondbediting. Ho interrogato al volo chatgpt, verifica se quanto scrive è corretto:
----------------------------------
Per gestire la modifica di un campo in una DBGrid in Free Pascal Lazarus per impedire all'utente di inserire un codice che è già presente in altre righe della tabella del database, puoi utilizzare l'evento OnEditingDone della DBGrid. In questo evento, puoi controllare se il valore inserito dall'utente esiste già nel database e, in caso affermativo, annullare la modifica o mostrare un messaggio di avviso.

Ecco un esempio di codice che mostra come gestire questa situazione:

Codice: [Seleziona]
procedure TForm1.DBGrid1EditingDone(Sender: TObject);
var
  FieldValue: string;
  i: Integer;
begin
  // Otteniamo il valore modificato dalla colonna specifica
  FieldValue := DBGrid1.DataSource.DataSet.FieldByName('NomeCampo').AsString;

  // Controlliamo se il valore è già presente in altre righe della tabella
  for i := 0 to DBGrid1.DataSource.DataSet.RecordCount - 1 do
  begin
    // Saltiamo la riga attualmente modificata
    if i <> DBGrid1.DataSource.DataSet.RecNo - 1 then
    begin
      // Se troviamo un valore uguale, avvisiamo l'utente e annulliamo la modifica
      if DBGrid1.DataSource.DataSet.FieldByName('NomeCampo').AsString = FieldValue then
      begin
        ShowMessage('Il valore inserito è già presente nella tabella.');
        DBGrid1.DataSource.DataSet.Cancel;
        Exit;
      end;
    end;

    // Passiamo alla riga successiva
    DBGrid1.DataSource.DataSet.Next;
  end;

  // Riportiamo il cursore alla riga modificata
  DBGrid1.DataSource.DataSet.First;
  DBGrid1.DataSource.DataSet.MoveBy(DBGrid1.DataSource.DataSet.RecNo - 1);
end;

Assicurati di adattare il codice sostituendo 'NomeCampo' con il nome del campo effettivo della tabella che desideri controllare. Questo codice controlla se il valore inserito è già presente in altre righe della tabella e, in caso affermativo, annulla la modifica e avvisa l'utente.

sanric

  • Newbie
  • *
  • Post: 20
  • Karma: +0/-0
    • RiccardoSantato.net
Re:Eccezione non gestita
« Risposta #4 il: Marzo 13, 2024, 07:00:06 am »
Grazie mille slapshot per la routine che provvederò a controllare ed implementare quanto prima.
Tuttavia la domanda resta: perché non riesco a gestire l'eccezione che il programma solleva?
In quello scampolo di codice che ho mandato dove si annida l'errore?

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Eccezione non gestita
« Risposta #5 il: Marzo 13, 2024, 08:24:50 am »
Dovremmo avere il software completo e un db di test per fare le prove e capire cosa non va. Troppe variabili. Prova però iniziando a leggere questa guida e vedi se con la sintassi che trovi qui risolvi.

http://www.lazaruspascal.it/index.php?page=83

Facci sapere. Ciao
Ieri è passato, domani è futuro, oggi è un dono...

slapshot

  • Jr. Member
  • **
  • Post: 85
  • Karma: +1/-0
Re:Eccezione non gestita
« Risposta #6 il: Marzo 13, 2024, 09:25:52 am »
Grazie mille slapshot per la routine che provvederò a controllare ed implementare quanto prima.
Tuttavia la domanda resta: perché non riesco a gestire l'eccezione che il programma solleva?
In quello scampolo di codice che ho mandato dove si annida l'errore?

Posta almeno la struttura della tabella, per capire il campo che identifica la chiave primaria. Anche informazioni su quale db stai usando non sarebbero male. Potresti intanto sviscerare l'eventuale problema isolandoti dalla dbgrid che è un componente che esegue l'impossibile, probabilmente se c'è un'eccezione potrebbe essere sollevata e gestita direttamente da esso.


sanric

  • Newbie
  • *
  • Post: 20
  • Karma: +0/-0
    • RiccardoSantato.net
[RISOLTO] Eccezione non gestita
« Risposta #7 il: Marzo 13, 2024, 09:34:13 am »
Dovremmo avere il software completo e un db di test per fare le prove e capire cosa non va. Troppe variabili. Prova però iniziando a leggere questa guida e vedi se con la sintassi che trovi qui risolvi.

http://www.lazaruspascal.it/index.php?page=83

Facci sapere. Ciao

Ringrazio tutti per le cortesissime risposte ma il listato non conteneva errori: era solo il fatto che la gestione delle eccezioni si fa sentire se non si usa il debugger integrato ma solo la modalità "Release".
Non lo sapevo ed il link giratomi da xinyiman mi ha risolto il problema.
« Ultima modifica: Marzo 13, 2024, 09:37:55 am da sanric »

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Eccezione non gestita
« Risposta #8 il: Marzo 13, 2024, 10:45:46 am »
Per favore, [RISOLTO] mettilo nel testo del primo messaggio del 3d. Così in fase di ricerca le persone vedono già se è stato risolto!
Ieri è passato, domani è futuro, oggi è un dono...

 

Recenti

How To

Utenti
Stats
  • Post in totale: 18776
  • Topic in totale: 2234
  • Online Today: 326
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 327
Total: 327

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.