* * * *

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.
Dicembre 03, 2024, 06:07:46 pm

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

50 Visitatori, 0 Utenti

Autore Topic: [Risolto] Run Error (216) - General protection fault  (Letto 73554 volte)

petrusic

  • Hero Member
  • *****
  • Post: 630
  • Karma: +0/-0
[Risolto] Run Error (216) - General protection fault
« il: Marzo 22, 2024, 04:39:56 pm »
Ieri ho ricevuto un augurio di Buon divertimento.
Sembra però che io debba divertirmi passando da un tipo di Errore ad un altro.

Dopo l'ultima correzione ed il completamento della compilazione, mi si presenta per la prima volta un Errore a me completamente sconosciuto ed assolutamente nuovo, durante l'esecuzione di una riga di codice che funzionava eccellentemente fino a prima dell'ultima modifica
l'istruzione è l'ultima della serie seguente:
Codice: [Seleziona]
procedure TForm1.Panel1Enter(Sender: TObject);
var
. . .
begin
  Menu2.Enabled:= False;
  if not FileExists(dbOrig) then    // l'ASSENZA del file ContabFamdb, potrebbe significare che il programma sta lavorando per la prima volta e bisogna dare vita al DB
  begin
   ShowMessage('DB ' + dbOrig + ' INESISTENTE - il Programma verra'' chiuso');
    Halt;   // Halt interrompe BRUTALMENTE l'esecuzione del programma e restituisce il controllo al chiamante
  end;
  i:= 0;
  sql:= 'select * from (select "causalifreq" AS nomeTbx, count(*) AS totRecTbx from causalifreq';
  sql:= sql + ' UNION select "ggaperte" as nomeTbx, count(*) as totRecTbx from ggaperte';
  sql:= sql + ' UNION select "movimgg" as nomeTbx, count(*) as totRecTbx from movimgg';
  sql:= sql + ' UNION select "partmovv" as nomeTbx, count(*) as totRecTbx from partmovv';
  sql:= sql + ' UNION select "piancont" as nomeTbx, count(*) as totRecTbx from piancont';
  sql:= sql + ' UNION select "prestmom" as nomeTbx, count(*) as totRecTbx from prestmom';
  sql:= sql + ' UNION select "racodvoci" as nomeTbx, count(*) as totRecTbx from racodvoci';
  sql:= sql + ' UNION select "restacassagg" as nomeTbx, count(*) as totRecTbx from restacassagg';
  sql:= sql + ' UNION select "riepmovg" as nomeTbx, count(*) as totRecTbx from riepmovg';
  sql:= sql + ' UNION select "componfam" as nomeTbx, count(*) AS totRecTbx from componfam';
  sql:= sql + ' UNION select "riepnewrecdb" as nomeTbx, count(*) as totRecTbx from riepnewrecdb) as contaRecDB';
  DataModule1.ZConnection1.Database:= dbOrig;

Questa volta non so pproprio da dove cominciare. Ho provato a togliere l'ultima modifica, ma non è cambiato niente.
« Ultima modifica: Aprile 02, 2024, 09:50:34 am da petrusic »
ciao ciao

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3285
  • Karma: +12/-0
Re:Run Error (216) - General protection fault
« Risposta #1 il: Marzo 22, 2024, 04:55:10 pm »
Consiglio spassionato. Hai verificato che la query funzioni? Visto che si tratta di una query non parametrizzata fai anche abbastanza veloce. Copy e incolli nel DBMS che usi e vedi se il problema è li.

Ieri è passato, domani è futuro, oggi è un dono...

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0

petrusic

  • Hero Member
  • *****
  • Post: 630
  • Karma: +0/-0
Re:Run Error (216) - General protection fault
« Risposta #3 il: Marzo 23, 2024, 12:48:40 pm »
Fpc user guide dice:
https://www.freepascal.org/docs-html/user/userap4.html#x189-196000D
Consiglio spassionato. Hai verificato che la query funzioni? Visto che si tratta di una query non parametrizzata fai anche abbastanza veloce. Copy e incolli nel DBMS che usi e vedi se il problema è li.

Questo passo di programma, come tanti altri che accedono al databse è stato testato ancor prima dell'ultima modifica e funzionava perfettamente. E' inoltre mia abitudine provare sempre le query che compilo con l'applicazione DB Browser for SQLite e posso, per certo affermare che, a parte l'aggiunta di una form di avviso per l'utente, non ho apportato altre modifiche.
Nel mio post d'apertura ho anche detto che ho reso inattive le ultime modifiche , ma riprovando, l'Errore 216 si ripresenta ugualmente.

Prima di aprire questa discussione ho anche letto le note sull'Errore 216, l'istruzione segnalata si trova all'interno della Form1, mentre io ho aggiunto la Form8 che viene creata ed avviata dentro la Form9.
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1415
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Run Error (216) - General protection fault
« Risposta #4 il: Marzo 23, 2024, 01:40:17 pm »
L'errore 216 è un errore abbastanza comune e l'indicazione così come è stata data è troppo generica.

E' necessario identificare il blocco di codice dove avviene ciò.
Il fatto che avvenga in una Form o in un'altra non toglie che le ultime modifiche non ne siano la causa. Una variabile globale, un evento, o altro possono essere influenzati anche da altri componenti / classi / moduli.

Metti diversi Breakpoint per delimitare la zona di ricerca, in alternativa occorre leggere i "map files" per vedere a cosa corrisponde l'indirizzo incriminato.

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1415
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Run Error (216) - General protection fault
« Risposta #5 il: Marzo 23, 2024, 01:59:08 pm »
Chiedo a chi è più avvezzo all'uso di Lazarus o chi ha esperienza su ciò: è possibile rilevare da un errore runtime con o senza debugger (con il debugger dovrebbe essere banale perchè dovrebbe portarti al sorgente che genera l'errore tramite la call stack) l'indirizzo  "dell'errore" e da qualche parte riuscire a capire in quale zona quest'errore viene generato ?

Vedere l'allegato dove l'indirizzo dell'errore è all'interno dei due indirizzi mappati, e quindi nel metodo Button1Clik ...

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 630
  • Karma: +0/-0
Re:Run Error (216) - General protection fault
« Risposta #6 il: Marzo 23, 2024, 04:46:28 pm »
L'errore 216 è un errore abbastanza comune e l'indicazione così come è stata data è troppo generica.

E' necessario identificare il blocco di codice dove avviene ciò.
Il fatto che avvenga in una Form o in un'altra non toglie che le ultime modifiche non ne siano la causa. Una variabile globale, un evento, o altro possono essere influenzati anche da altri componenti / classi / moduli.

Metti diversi Breakpoint per delimitare la zona di ricerca, in alternativa occorre leggere i "map files" per vedere a cosa corrisponde l'indirizzo incriminato.

Fino a quando parliamo di mettere sotto controllo l'esecuzione del programma per capire qual'è l'istruzione che provoca l'Errore, ti seguo. É un metodo di ricerca usato sempre quando voglio individuare un Errore. L'ho fatto anche questa volta e l'istruzione incriminata è proprio quella segnalata nel messaggio d'Errore. Allego il messaggio

Ho provato il programma in 3 S.O. diversi: Ubuntu, LinuxMint e Manjaro. Tutti danno lo stesso Errore. L'immagine allegata è proprio quella generata dal mio programma in ambiente Manjaro, quello su cui sto  orientando recentemente.

L'istruzione in cui si genera l'Errore fa parte del seguente gruppo:
Codice: [Seleziona]
begin
  Menu2.Enabled:= False;
  if not FileExists(dbOrig) then    // l'ASSENZA del file ContabFamdb, potrebbe significare che il programma sta lavorando per la prima volta e bisogna dare vita al DB
  begin
   ShowMessage('DB ' + dbOrig + ' INESISTENTE - il Programma verra'' chiuso');
    Halt;   // Halt interrompe BRUTALMENTE l'esecuzione del programma e restituisce il controllo al chiamante
  end;
  i:= 0;
  sql:= 'select * from (select "causalifreq" AS nomeTbx, count(*) AS totRecTbx from causalifreq';
  sql:= sql + ' UNION select "ggaperte" as nomeTbx, count(*) as totRecTbx from ggaperte';
  sql:= sql + ' UNION select "movimgg" as nomeTbx, count(*) as totRecTbx from movimgg';
  sql:= sql + ' UNION select "partmovv" as nomeTbx, count(*) as totRecTbx from partmovv';
  sql:= sql + ' UNION select "piancont" as nomeTbx, count(*) as totRecTbx from piancont';
  sql:= sql + ' UNION select "prestmom" as nomeTbx, count(*) as totRecTbx from prestmom';
  sql:= sql + ' UNION select "racodvoci" as nomeTbx, count(*) as totRecTbx from racodvoci';
  sql:= sql + ' UNION select "restacassagg" as nomeTbx, count(*) as totRecTbx from restacassagg';
  sql:= sql + ' UNION select "riepmovg" as nomeTbx, count(*) as totRecTbx from riepmovg';
  sql:= sql + ' UNION select "componfam" as nomeTbx, count(*) AS totRecTbx from componfam';
  sql:= sql + ' UNION select "riepnewrecdb" as nomeTbx, count(*) as totRecTbx from riepnewrecdb) as contaRecDB';
//  WriteLn('sql= |' + sql + '|');
  WriteLn('dbOrig= |' + dbOrig + '|');
  DataModule1.ZConnection1.Database:= dbOrig;            <--  riga 337
  DataModule1.ZConnection1.Connected:= True;
  DataModule1.ZReadOnlyQuery1.Active:= False;
  DataModule1.ZReadOnlyQuery1.SQL.Text:= sql;
  DataModule1.ZReadOnlyQuery1.Active:= True;
  DataModule1.ZReadOnlyQuery1.First;           
     
map files è un termine per me assolutamente nuovo. Non lo conosco. Ci strudio su e vi faccio sapere.
« Ultima modifica: Marzo 23, 2024, 04:51:56 pm da petrusic »
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1415
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Run Error (216) - General protection fault
« Risposta #7 il: Marzo 23, 2024, 09:05:42 pm »
Mi vengono in mente solo 3 opzioni:

1) DataModule1 non è stato istanziato;
2) ZConnection1 non è stato istanziato;
3) ZConnection1  è ATTIVO quando assegni il dato.

Ciao
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 630
  • Karma: +0/-0
Re:Run Error (216) - General protection fault
« Risposta #8 il: Marzo 24, 2024, 03:50:46 pm »
Il fatto che avvenga in una Form o in un'altra non toglie che le ultime modifiche non ne siano la causa.

Sono perfettamente d'accordo, ma io ho cercato in tutti i modi a me noti di eliminare la condizione che abbia potuto determinare un Errore a me incomprensibile. Il più semplice, ma anche quello proprio radicale è stato di contrassegnare come commenti tutte le nuove righe inserite ultimamente, ma è stato tutto inutile.

Purtroppo non sono in grado di individuare l'anomalia.

Ho rimesso in vita, a questo punto, la versione funzionante a prima delle ultime modifiche e l'anomalia è scomparsa. Dovrei ora ripartire da questo punto.

Altro non so fare.
 :-[
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 630
  • Karma: +0/-0
Re:Run Error (216) - General protection fault
« Risposta #9 il: Marzo 24, 2024, 07:14:41 pm »
Ripartendo da una condizione di programma funzionante, ho capito quando si manifesta l'anomalia Run Errore (216).

Non riesco ad inserire la Form8 con Unit="FrmAttendi".

Per arrivare a produrla correttamante, ho eliminato la vecchia Form8, sia come Frm8.pas, sia come Frm.lfm. Poi ho creato un nuovo file di tipo Form a cui ho subito attribuito come nome frmAttendi. Ho completato l'inserimento confermando la creazione nell'IDE ed ho avviato la compilazione.
Però, a questo punto, si manifesta sempre l'Errore fatidico.

Francamente NON capisco, perchè non posso attribuire ad una Form qualsiasi, un file unit con un nome di fantasia. Ci sono vincoli sintattici?
ciao ciao

DragoRosso

  • Scrittore
  • Hero Member
  • *****
  • Post: 1415
  • Karma: +44/-0
  • Prima ascoltare, poi decidere
Re:Run Error (216) - General protection fault
« Risposta #10 il: Marzo 24, 2024, 10:20:24 pm »
La risposta è in un mio post nel tuo precedente topic, ma te lo ripeto con qualche chiarimento in più.

La FORM la puoi chiamare come vuoi, ma ciò che tu chiami nome della form dovrebbe essere il valore dell'attributo NAME del componente a desgin time.
Quello è il nome della Form, e quando la cambi l'IDE automaticamente aggiorna i riferimenti della classe (non però i riferimenti usati nel codice fatto da te).

Quindi se una Form la chiami FormMia, verrà creato il seguente codice::

Codice: [Seleziona]
type
TFormMia := Class(TForm)
.......
......
end;

Var FormMia: TFormMia;
Alterare quel codice a mano si può fare ma richiede attenzione.

Altra cosa è il nome della UNIT che contiene la FORM, ossia il file ".pas": il file lo salvi eseguendo il "SALVA COME" dal menu dell'IDE, e solo da li lo puoi rinominare.

L'operazione "SALVA COME" genera i riferimenti nel progetto (file .LPR e .LPI) e il file ".pas" e eventualmente il file ".lfr".

IL NOME DELLA FORM e i suoi antenati diretti, quindi ad esempio FormMia e TFormMia NON DEVONO ESSERE USATI COME NOME DELL'UNITA': non devono esserci file "FormMia.pas" o "TFormMia.pas".

Spero di essere stato più chiaro e d'aiuto.
:) Ogni alba è un regalo, ogni tramonto è una conquista :)

petrusic

  • Hero Member
  • *****
  • Post: 630
  • Karma: +0/-0
Re:Run Error (216) - General protection fault
« Risposta #11 il: Marzo 25, 2024, 04:24:49 pm »
Un pò sono andati avanti, ma molto poco, perchè il compilatore mi da sempre Errore:
Impostazione nome per la nuova Form (Form8) e pa corrispondente Unit
Codice: [Seleziona]
unit FrmAttendi;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs;

type
  TFormAttendi = class(TForm)
  private

  public

  end;

var
  FormAttendi: TFormAttendi;

implementation

{$R *.lfm}

end.               

Impostazioni dentro il file .lpr
Codice: [Seleziona]
program DomusRatio;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, datetimectrls, memdslaz, runtimetypeinfocontrols, lazreportpdfexport,
  zcomponent, zcore, pack_powerpdf, FrmMain, Frm2, Frm3, Frm4, Frm5, utilmie,
  Frm7, Frm6, UModuloDatiDB, Frm9, Frm10, FrmAttendi;

{$R *.res}

begin
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TDataModule1, DataModule1);
  Application.Run;
end.                         

chiamata della Form dentro la Form9
Codice: [Seleziona]
 Application.CreateForm(TFormAttendi, FormAttendi);
  FormAttendi.msg:= 'Ricerca   MOVIMENTI AMMORTIZZABILI  in corso' + lineending + lineending + '-----  A T T E N D I  -----';
  FormAttendi.Show;         

Ed ecco i messagi di Errore relativi alle tre suddette righe
Citazione
Application.CreateForm(TFormAttendi, FormAttendi);
  FormAttendi.msg:= 'Ricerca   MOVIMENTI AMMORTIZZABILI  in corso' + lineending + lineending + '-----  A T T E N D I  -----';
  FormAttendi.Show;         

Per dirla alla carlona:   BO?
ciao ciao

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Re:Run Error (216) - General protection fault
« Risposta #12 il: Marzo 26, 2024, 12:09:14 pm »
Credo tu abbia sbagliato a copiare i messaggi di errore. Se crei l'istanza di una form da un qualsiasi punto del tuo codice, mi sentirei di consigliarti di essere più metodico ed avere maggiore controllo sulla tua istanza.

Codice: [Seleziona]
myform := TfrmAttendi.Create
try
  //usa
finally
  myform.free //oppure freeandnil(myform)
end;
« Ultima modifica: Marzo 26, 2024, 01:43:35 pm da slapshot »

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2389
  • Karma: +10/-0
Re:Run Error (216) - General protection fault
« Risposta #13 il: Marzo 26, 2024, 02:21:47 pm »

Ciao Slapshot.Ni, messa così è possibile che la pompa dei messaggi non riesca ad inviare le notifiche alla form create come istanza di un oggetto generico.
Bisogna passare per forza attraverso l'aggancio all'istanza di Application. Il createForm serve a quello. Far sapere all'applicazione quali form deve controllare e utilizzare per l'invio delle notifiche dei messaggi. (La sto riducendo all'osso, scorticandolo)



Diciamo che il metodo classico, prevede che la form di attesa venga creata e nascosta.
Al momento del bisogno la si porta in primo piano visibile e poi la si nasconde nuovamente quando non è più utile.


In questo modo si evita qualche casino.


Guardando il codice mi sembra manchi la properties msg alla form di attesa.


L'errore sembra dovuto a file residui sul disco.
Suggerisco di cancellare qualche .o e .pp e riprovare la compilazione.




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

slapshot

  • Jr. Member
  • **
  • Post: 89
  • Karma: +1/-0
Re:Run Error (216) - General protection fault
« Risposta #14 il: Marzo 26, 2024, 06:03:14 pm »

Ciao Slapshot.Ni, messa così è possibile che la pompa dei messaggi non riesca ad inviare le notifiche alla form create come istanza di un oggetto generico.
Bisogna passare per forza attraverso l'aggancio all'istanza di Application. Il createForm serve a quello. Far sapere all'applicazione quali form deve controllare e utilizzare per l'invio delle notifiche dei messaggi. (La sto riducendo all'osso, scorticandolo)

Diciamo che il metodo classico, prevede che la form di attesa venga creata e nascosta.
Al momento del bisogno la si porta in primo piano visibile e poi la si nasconde nuovamente quando non è più utile.

In questo modo si evita qualche casino.


Grazie, confesso che i miei ricordi mi dicono che la pratica di creare automaticamente le form all'avvio del software non era proprio ideale. Ad esempio, creare 150 form all'avvio dell'applicazione soltanto per visualizzarle in caso di necessità da parte dell'utente era una prassi da sconsigliare. Molto meglio istanziare l'oggetto a partire dalla classe necessaria quando se ne aveva bisogno per poi distruggerlo al termine del suo utilizzo. Poi se assegnare o meno un owner era da verificare in base alle esigenze del software.

La questione della pompa dei messaggi non riesco bene a comprenderla, ovvero: quale sarebbe il vantaggio di ricevere messaggi dalla coda di TApplication per form che sono inerti e che devono essere attivate ? Sicuramente ce ne sono, è per capire più a fondo.

Grazie mille @Stilgar !

 

Recenti

How To

Utenti
  • Utenti in totale: 802
  • Latest: maXim.FI
Stats
  • Post in totale: 19235
  • Topic in totale: 2294
  • Online Today: 77
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 50
Total: 50

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.