Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Marzo 22, 2024, 04:39:56 pm

Titolo: [Risolto] Run Error (216) - General protection fault
Inserito da: petrusic - 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.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: xinyiman - 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.

Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Marzo 22, 2024, 09:08:30 pm
Fpc user guide dice:

https://www.freepascal.org/docs-html/user/userap4.html#x189-196000D (https://www.freepascal.org/docs-html/user/userap4.html#x189-196000D)

Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 23, 2024, 12:48:40 pm
Fpc user guide dice:
https://www.freepascal.org/docs-html/user/userap4.html#x189-196000D (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.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - 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
Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - 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
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - 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.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - 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
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - 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.
 :-[
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - 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?
Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - 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.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - 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?
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - 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;
Titolo: Re:Run Error (216) - General protection fault
Inserito da: Stilgar - 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
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - 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 !
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 26, 2024, 06:33:33 pm
Guardando il codice mi sembra manchi la properties msg alla form di attesa.

Si, con tutte le prove ed i tentativi fatti per aggiungere una Form di Attesa, ho cancellato il campo msg. Ora l'ho ripristinato, ma non cambia niente.
Citazione da: Stilgar
L'errore sembra dovuto a file residui sul disco.
Suggerisco di cancellare qualche .o e .pp e riprovare la compilazione.

Ma così, a caso?

Ho dato una guardata alla directory relativa ai file.o ed visto una marea di file. Andare ad individuare quelli giusti mi sembra un'impresa. Così, a polso, potrei cancellare
Citazione
/home/petrus/.lazarus/units/x86_64-linux/gtk2/componentpalette_options.o
/home/petrus/.lazarus/units/x86_64-linux/gtk2/componentpalette.o
/home/petrus/.lazarus/units/x86_64-linux/gtk2/componentlist.o

mentre degli innumerevoli file.pp trovasti quelli che mi sembrano strettamente legati a Lazarus sono
Citazione
/usr/share/lazarus/2.2.6/components/fpreport/design/fpreportdesignreportdata.pp
/usr/share/lazarus/2.2.6/components/fpreport/design/fpreportdesignobjectlist.pp
/usr/share/lazarus/2.2.6/components/fpreport/design/fpreportdesigner.pp
/usr/share/lazarus/2.2.6/components/fpreport/design/fpreportdesignctrl.pp

Purtroppo, per la mia scarsa conoscenza di Lazarus, non mi sento di avventurarmi ad intraprendere percorsi a me assolutamente ignoti.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: Stilgar - Marzo 26, 2024, 06:40:03 pm
Pardon .. non PP ma PPU, mi son perso una lettere mentre scrivevo.
Ad occhio e croce pp sono i sorgenti. (uso .pas come estensione, per abitudine).
Eventualmente Lazarus permette di fare la "clean up and build" da menu.
Così non si incorre in errori di cancellazione.
Si presenta una finestra di conferma (così si vede cosa verrà pulito e ricompilato)


Fa tutto Lazarus.


Stilgar
Titolo: Re:Run Error (216) - General protection fault
Inserito da: Stilgar - Marzo 26, 2024, 07:05:13 pm
@slapshot
[/size]
Pompa dei messaggi è il mio modo di descrivere il meccanismo che permette di inviare messaggi alle applicazioni.
Come sistema operativo e anche come applicazione.


Il sistema operativo conosce le finestre che ha visibili.
Se nascondi tutte le finestre e liberi il desktop, poi selezioni l'applicazione che ti interessa, il sistema operativo manda dei messaggi per riattivare le finestre che devono essere visualizzate.
Lazarus rimappa questi messaggi, nel caso d'esempio LM_SHOW (vado a memoria, potrei ricordare male la costante)
Internamente viene fatto il routing del messaggio verso la finestra interessate che riceva il messaggio. TForm gestiste tutto questo in modo trasparente.
Se crei la finestra fuori dal contesto applicativo, hai si la form attiva e visibile, ma in caso di "Update" o metodi legati ai messaggi da so/app, potresti avere comportamenti non attesi. Devi controllare tutto tu. Anche l'aggiornamento.


E' corretto, lecito e intelligente, non creare 150 form, di cui al massimo solo 1 o due sono attive contemporaneamente, 150 sono veramente tante. Basta creare e distruggere in modo corretto le istanze. Stiamo parlando di un caso limite però.


Lazarus creata di default tutte le form. Quando crei una nuova form dal designer, aggiunge il codice per la creazione. Il pattern comportamentale proposto è questo.


Le TForm sono classi "particolari" che hanno bisogno di qualche attenzione in più.  ;)


Il design a messaggi, è utilizzato anche da SDL (videogiochi/multimediale). Giusto per non sembrare Winzozo oriented.


Stilgar.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 26, 2024, 07:06:29 pm
Eventualmente Lazarus permette di fare la "clean up and build" da menu.
Così non si incorre in errori di cancellazione.
Si presenta una finestra di conferma (così si vede cosa verrà pulito e ricompilato)
Fa tutto Lazarus.

Purtroppo non riesco a seguirti al volo.

Se ho capito bene la tua indicazione, il menù di cui parli è quello riportato come allegato, solo che lì dentro i file .o e .ppu non sono riportati secondo la propria dipendenza dal progetto principale, quindi io potrei soltanto cancellare gli unici file che riesco a riconoscere (frmattesa.o e frmattesa.ppu).

Titolo: Re:Run Error (216) - General protection fault
Inserito da: Stilgar - Marzo 26, 2024, 07:12:20 pm
Volendo potresti cancellare solo quei due file.
Se il compilatore ti indica form8 e quella variabile non esiste più, magari è un'altra la unit che non viene aggiornata. Per il "refactory" in genere si usa il Crtl+Shift+E . Ci pensa lazarus a cambiare i nomi delle classi/variabili per te e le dovrebbe modificare tutte. Uso "dovrebbe" perché ogni tanto mi scazza.
Prendi i file intermedi (o e ppu) e cancellali tutti. Così sei sicuro che non ci siano problemi.
Tanto il compilatore li ricrea in poco tempo.


Giusto per fare la prova.


Stilgar.



Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 27, 2024, 05:20:36 pm
Volendo potresti cancellare solo quei due file.
Se il compilatore ti indica form8 e quella variabile non esiste più, magari è un'altra la unit che non viene aggiornata. Per il "refactory" in genere si usa il Crtl+Shift+E . Ci pensa lazarus a cambiare i nomi delle classi/variabili per te e le dovrebbe modificare tutte.

Non ho eseguito il Crtl+Shift+E, perchè ho capito  che quello si occupa solamente della ricostruzione, mentre io dovevo ripulire e ricostruire.

Sono entrato dall'IDE in Esegui -> Ripulire e costruire e dentro le finestre "Cartelle sorgenti del pacchetto" ho selezionato solamente "*.ppu;*.o;", quindi ho premuto il pulsante "Ripulisci e Costruisci".

dopo la ricostruzione è partita in automatico la compilazione e:
L'Errore sulla Form8 è scomparso, mentre erano rimasti gli altri.

Guardando meglio dentro la Form9, in cui si trovano le righe:
Codice: [Seleziona]
  Application.CreateForm(TFormAttendi, FormAttendi);
  FormAttendi.msg:= 'Ricerca   MOVIMENTI AMMORTIZZABILI  in corso' + lineending + lineending + '-----  A T T E N D I  -----';
  FormAttendi.Show; 

e mi sono accorto che fra gli uses mancava il nome del file FrmAttendi. Ho provveduto allora ad inserirlo ed a ricompilare.

La compilazione si è completata senza errori. Ora, però è l'esecuzione a segnalare un Errore, quello riportato come allegato.

Sembra che debba usare il costruttore CreateNew, ma io non trovato niente del genere.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Marzo 27, 2024, 05:53:30 pm
Probabilmente ha sempre a che fare con le risorse della form:
Citazione
TCustomForm.Create raises an exception if resource is not found
Reason: Each form created by the IDE should have a resource, so if resource is not found there is something wrong with either a resource or the unit which contains the faulty form. Therefore the application should inform the developer that the form can't function correctly without the resource. This change is also Delphi compatible and compatible with TFrame and TDataModule components.
Remedy: If you need a resourceless form you have 3 options:
Create a TForm class (not a descendant)
Construct your form using the CreateNew() constructor.
It is also possible to disable the exception by setting the global variable RequireDerivedFormResource to False.

Prelevato da qui: https://wiki.lazarus.freepascal.org/Lazarus_1.0_release_notes#TCustomForm.Create_raises_an_exception_if_resource_is_not_found: (https://wiki.lazarus.freepascal.org/Lazarus_1.0_release_notes#TCustomForm.Create_raises_an_exception_if_resource_is_not_found:)

Però a questo punto cercherei di mettere ordine nel progetto e nel numero delle form e unit da usare.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 27, 2024, 05:55:39 pm
Niente da fare. NON funziona!

Ho chiuso Lazarus  e poi ho riavviato.

L'Errore sulla Form8 è ricomparso.
 ??? e  :o
Titolo: Re:Run Error (216) - General protection fault
Inserito da: nomorelogic - Marzo 27, 2024, 05:59:58 pm
nel messaggio di errore c'è scritto che non trova il file .lfm di quel form
puoi verificare la presenza?
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Marzo 27, 2024, 06:21:01 pm
Niente da fare. NON funziona!

Ho chiuso Lazarus  e poi ho riavviato.

L'Errore sulla Form8 è ricomparso.
 ??? e  :o

Ci fai anche uno screenshot della dir dove sono contenuti i file di unit ed i relativi .lfm ? Ricordati che sotto Linux c'è differenza tra maiuscole e minuscole, probabilmente deve essere un problema del genere. Se disegni la form tramite la IDE di Lazarus, necessariamente deve esserci il .lfm .
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 27, 2024, 10:36:55 pm
nel messaggio di errore c'è scritto che non trova il file .lfm di quel form
puoi verificare la presenza?
Mi dispiace, ma non sono più in condizione di farlo. Ho eliminato tutto ed ho ricreato la Form8 come default.
Chiedo vivamente scusa a tutti, ma mi sono ... stancato.
Va bene così.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - Marzo 28, 2024, 12:18:11 pm
.... ma mi sono ... stancato.
Non prendertela, ci vuole molta pazienza per programmare.

E più "vai avanti" con la programmazione, che diventa più complessa, e più pazienza ci vuole.
Quando c'è un problema, o presunto tale, occorre munirsi di santa pazienza e pian piano procedere alla ricerca della causa, senza però mettere in atto cambiamenti radicali.

Alle volte, come hai fatto, però ricostruire una data "cosa" da zero è una soluzione efficacie.
Sotto Linux tieni presente, come accennavano altri partecipanti al topic, che maiuscolo / minuscolo vengono gestiti in maniera differenziata e che quando si fanno delle operazioni di "RIDENOMINAZIONE" si possono avere effetti collaterali non indifferenti (ma d'altronde anche in Windows se si rinominano file con nomi simili ... e si dimentica qualche vecchio nome in qualche uses ...).

Banalmente quando salvi una UNIT con la sua FORM, o li rinomini, una scrittura del nomefile con maiuscolo / minuscolo non corretto e non conforme a quanto inserito nelle uses (a mano) può generare problemi come quelli che hai verificato tu.

Ciò a maggior ragione se magari rimane qualche "rimasuglio" di file compilato (tipo .o oppure .ppu) che corrisponde a quanto erratamente ancora presente nelle uses.

Sinceramente non sò il compilatore di FPC come si comporta precisamente, ma tutti i compilatori usano dei meccanismi di "hashing"e di cache basati molto spesso sulle date di modifica dei file per velocizzare la compilazione, per cui quando si rinomina una unità potrebbe essere che  rimangano i file vecchi compilati (che non vengono cancellati perche il sorgente non esiste più e quindi il compilatore non sà nemmeno che esiste il vecchio compilato) che se richiamati dal programma generano errori.

In pratica, quando tu inserisci il nome di una unit nelle USES, il compilatore cerca o il file .PAS o il file .PP o il file .PPU (poi ovviamente c'è anche tutta una serie di file collegati ...). Se non esistono file .PAS o .PP ma solo il .PPU e per il compilatore il file è valido, questo viene usato. E il .PPU senza .PAS (riferiti a file del tuo progetto, non a quelli di sistema o di altri di terze parti) è molto probabile che sia un residuo  che ti darà quei problemi.

Spero di avere chiarito la probabile situazione in cui ti sei venuto a trovare (e non sei solo).


Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 29, 2024, 09:29:40 am
E più "vai avanti" con la programmazione, che diventa più complessa, e più pazienza ci vuole.
Quando c'è un problema, o presunto tale, occorre munirsi di santa pazienza e pian piano procedere alla ricerca della causa, senza però mettere in atto cambiamenti radicali.
Tutta la pazienza che un vecchio programmatore, come me può mettere, ha sempre un limite e stare una settimana appresso ad un problema legato ad una scelta non necessitata, diventa pesante ed ha superato ogni limite di sopportazione.

Mi sarebbe piaciuto modificare il nome mnmonico della Form per intuirne al molo lo scopo nel futuro, quando avessi bisogno di sfruttarne l'utilizzo in altri programmi, ma credo di non avere ancora capito qualche meccanismo nell'ingranaggio logico dell'impiego di una Form.
Citazione da: DragoRosso
Alle volte, come hai fatto, però ricostruire una data "cosa" da zero è una soluzione efficacie.
Sotto Linux tieni presente, come accennavano altri partecipanti al topic, che maiuscolo / minuscolo vengono gestiti in maniera differenziata e che quando si fanno delle operazioni di "RIDENOMINAZIONE" si possono avere effetti collaterali non indifferenti.
Anche tu mi fai presente una peculiarità di Linux che ho appreso ed assimilato venti anni fa. Questa riflessione nei miei confronti è alquanto irrispettosa. Vi salva soltanto il fatto di non conoscere la persona con la qualke state dialogando.

Citazione da: DragoRosso
Banalmente quando salvi una UNIT con la sua FORM, o li rinomini, una scrittura del nomefile con maiuscolo / minuscolo non corretto e non conforme a quanto inserito nelle uses (a mano) può generare problemi come quelli che hai verificato tu.
Ciò a maggior ragione se magari rimane qualche "rimasuglio" di file compilato (tipo .o oppure .ppu) che corrisponde a quanto erratamente ancora presente nelle uses.
Sinceramente non sò il compilatore di FPC come si comporta precisamente, ma tutti i compilatori usano dei meccanismi di "hashing"e di cache basati molto spesso sulle date di modifica dei file per velocizzare la compilazione, per cui quando si rinomina una unità potrebbe essere che  rimangano i file vecchi compilati (che non vengono cancellati perche il sorgente non esiste più e quindi il compilatore non sà nemmeno che esiste il vecchio compilato) che se richiamati dal programma generano errori.
In pratica, quando tu inserisci il nome di una unit nelle USES, il compilatore cerca o il file .PAS o il file .PP o il file .PPU (poi ovviamente c'è anche tutta una serie di file collegati ...). Se non esistono file .PAS o .PP ma solo il .PPU e per il compilatore il file è valido, questo viene usato. E il .PPU senza .PAS (riferiti a file del tuo progetto, non a quelli di sistema o di altri di terze parti) è molto probabile che sia un residuo  che ti darà quei problemi.
Spero di avere chiarito la probabile situazione in cui ti sei venuto a trovare (e non sei solo).
Ecco, questo concetto è sicuramente prezioso, perchè formativo e ti ringrazio moltissimo.
 :)
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Marzo 29, 2024, 10:02:27 am
Citazione
Anche tu mi fai presente una peculiarità di Linux che ho appreso ed assimilato venti anni fa. Questa riflessione nei miei confronti è alquanto irrispettosa. Vi salva soltanto il fatto di non conoscere la persona con la qualke state dialogando.

Ciao, non devi prendertela per questo. Dietro un forum siamo tutti più o meno sconosciuti, i nostri background sono relativi e, a volte, le cose più semplici sono quelle che sfuggono, proprio come modificare il nome delle form da Lazarus. Facendolo da terminale, magari, sarebbe stato più lampante. Oppure il file .res che non si trova più ecc..

Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - Marzo 29, 2024, 10:33:43 am
Anche tu mi fai presente una peculiarità di Linux che ho appreso ed assimilato venti anni fa. Questa riflessione nei miei confronti è alquanto irrispettosa. Vi salva soltanto il fatto di non conoscere la persona con la qualke state dialogando.
Non era mia intenzione offenderti o essere irrispettoso in alcun modo. Ciò che ho commentato è a favore di chiunque legga, altrimenti non ha senso che esista il forum. Le cose devono essere dette e ripetute, affinchè chiunque possa prenderne spunto.
Ciao
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 30, 2024, 05:31:28 pm
@ DragoRosso e  @ slapshot.
Chiedo umilmente scusa per il tono della mia ultima Rispo.
In questo periodo sto soffrrendo problematiche varie coi S.O Linux installati: In Ubuntu la settimana scorsa è saltata pure la risoluzione del monitor e, solo grazie all'aiuto ricevuto nel relativo Forum, ho potuto, finalmente, oggi, ripristinare la configurazione corretta.

Per le difficoltà incontrate nella denominazione della Form8, sono più che contrariato perchè non riesco a capire come fare per riuscire a mettere in pratica quello che ho in mente.
La mia scelta mi sembra utile, per far sì che possa ripeterla anche in altri programmi, allo scopo di mantenere un nome di Form autoesplicativo, anche se la Fom, potrebbe essere una volta la Form8, un'altra la Form3, e così via.

Ma, dato che ho perso troppo tempo, senza venirne a capo, mi sono più che irritato e mi sono sentito desolatamente umiliato. Così ho deciso di lasciare perdere, almeno per ora.

Anche se il sapore della sconfitta è ancora amaro, sono tranquillo. Non ne parliamo più.

Vi chiedo ancora scusa.
 :)

Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - Marzo 30, 2024, 05:55:36 pm
In questo periodo sto soffrrendo problematiche varie coi S.O Linux installati....

Tranquillo, non devi scusarti ... io invece voglio farti una proposta risolutiva:  :) :) :) :) PASSA A WINDOWS  :) :) :) :)

 ;) ;D
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Marzo 30, 2024, 08:37:04 pm
La penso come @DragoRosso, non occorre scusarsi. Non ti preoccupare e non mollare, mai ! Se te lo dico io che ancora uso delle Arch Based come Manjaro. Può succede con qualunque sistema di avere problemi, con Ubuntu è davvero difficile ma capita anche con quello. Linux si ama e si odia allo stesso tempo, io non ci rinuncerei mai anche se confesso che a volte le comodità di Windows fanno .. bene :D.

Buona Pasqua !
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 31, 2024, 12:05:05 pm
Tranquillo, non devi scusarti ... io invece voglio farti una proposta risolutiva:  :) :) :) :) PASSA A WINDOWS  :) :) :) :)

Windows? Stai scherzando!
L'ho abbandonato più di 20 anni fa, quando ho potuto cambiare menù, con Linux.  NO, grazie, preferisco questo Paradiso

Auguri anche a te.
[/quote]
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 31, 2024, 12:10:05 pm
non mollare, mai ! Se te lo dico io che ancora uso delle Arch Based come Manjaro.
. . .
Linux si ama e si odia allo stesso tempo, io non ci rinuncerei mai.

Anch'io ho installato recentemente Manjaro, ma lo conosco ancora quasi niente. Vi ho installato Lazarus. Ho intenzione di approfondirne le conoscenze, perchè vorrei falo diventare il mio S.O principe. Già mil suo Grub mia ha più che entusiasmato.

Buona Pasqua anche a te!
 ;)

Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Marzo 31, 2024, 12:16:34 pm
Assolutamente consigliato ! Più semplice da gestire di Arch Linux, ma comunque ne mantiene le caratteristiche rolling release, ma meno bleeding edge ;). Scarica fpcupdeluxe come eseguibile, dagli i permessi ed usa questo sia per scaricare la versione che ti più ti aggrada di fpc che di lazarus. Da fpcupdeluxe puoi anche decidere di installare comodamente dei framework, tipo mormot 1 e mormot 2 (che sto studiando da un pò), e poi comododamente aggiornarli tramite git ma sempre da interfaccia fpcupdeluxe. Assolutamente consigliato.

Per Manjaro, pamac fa il suo come front end ad AUR, ma io ho trovato che a volte pecca. E quindi ti consiglio anche di installare YAY (Yet Another Y .. qualcosa) che è in grado di interrogare da shell anche i repository AUR (snap non lo so e infatti lo uso poco. Anche per installare una semplice cazzata scarica mezzo giga di roba, direi che non mi piace granché).

A presto !
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Marzo 31, 2024, 12:37:21 pm
Assolutamente consigliato ! Più semplice da gestire di Arch Linux,
Ti ringrazio per i consigli che mi hai dato su Manjaro, ma non andiamo fuori tema. Eventualmente, aprimao un'altra discussione.  ;)
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Aprile 01, 2024, 10:34:15 pm
E' inutile, NON riesco ad andare avanti, se non supero l'ostacolo..
Ho trovato un'altra soluzione: La Form dinamica.

Ho allora costruito la Form via codice, senza quindi passare dal Designer.
Codice: [Seleziona]
  FormAvviso:=TForm.Create(nil);
  with FormAvviso do
  begin
    Height:= 130;
    Left:= 500;
    Top:= 50;
    Width:= 400;
    Position:= poScreenCenter;
    Caption:= 'MOVIMENTI AMMORTIZZABILI';
  end;

  Lmsg := TLabel.Create(FormAvviso);
  with Lmsg do
  begin
    Parent := FormAvviso;
    Height:= 80;
    Left:= 10;
    Top:= 20;
    Width:= 300;
    Caption:= 'Ricerca in corso' + lineending + ' ' + lineending + Space(30) + '  A T T E N D I';
    AutoSize:= False;
    Enabled:= True;
    Visible:= True;
  end;

   FormAvviso.Show;
   Sleep(200);     // Attendi 200 millesecondi (= 1/5 di secondo)
   Application.ProcessMessages;

Funziona tutto perfettamente, ma fino ad un certo punto, infatti la Form viene creata e visualizzata, ma al suo interno non sono riuscito a mostrare la Label col messaggio di Attesa.

Ho cercato in tutti i modi a me noti di venirne a capo, ma ancora una volta ho perso la battaglia.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Aprile 01, 2024, 10:49:29 pm
Se devi creare a runtime un componente visuale devi procedere alla stesso modo in cui hai creato la form. Non e' assolutamente necessario assegnare la form come owner anche se consigliato, tuttavia la proprietà parent diventa importante.

https://www.askingbox.com/tip/delphi-lazarus-dynamically-create-a-label-at-runtime
Titolo: Re:Run Error (216) - General protection fault
Inserito da: DragoRosso - Aprile 01, 2024, 11:06:47 pm
@petrusic

A me funziona.

Dove è che usi quel codice ? In un evento ? Quale ?
Titolo: Re:Run Error (216) - General protection fault
Inserito da: slapshot - Aprile 02, 2024, 07:40:31 am
Se devi creare a runtime un componente visuale devi procedere alla stesso modo in cui hai creato la form. Non e' assolutamente necessario assegnare la form come owner anche se consigliato, tuttavia la proprietà parent diventa importante.

https://www.askingbox.com/tip/delphi-lazarus-dynamically-create-a-label-at-runtime

Inopportuno, il tablet non aveva caricato il resto del tuo codice sorgente.
Titolo: Re:Run Error (216) - General protection fault
Inserito da: petrusic - Aprile 02, 2024, 09:46:27 am
@petrusic
A me funziona.
Dove è che usi quel codice ? In un evento ? Quale ?

Io eseguo il create e l'emissione della mia Form dinamica dentro una routine.

Però, Udite, Udite: Ora ce l'ho fatta!

Ho inserito le righe enabled  e visible  nel codice del gruppo di istruzioni TForm.Create ed ha funzionato.
Codice: [Seleziona]
procedure AmmortamentoCespiti();     
type
  TtbGrupCespiti = array [0..10, 0..1] of string;   
 . . .
var
  FormAvviso: TForm;
  Lmsg: TLabel;

  swFine: Boolean = False;   
. . .
begin
. . .
  FormAvviso:=TForm.Create(nil);
  with FormAvviso do
  begin
    Height:= 130;
    Left:= 500;
    Top:= 50;
    Width:= 400;
    Position:= poScreenCenter;
    Caption:= 'MOVIMENTI AMMORTIZZABILI';
    Enabled:= True;     <-- NUOVA
    Visible:= True;      <-- NUOVA
  end;

  Lmsg := TLabel.Create(FormAvviso);
  with Lmsg do
  begin
    Parent:= FormAvviso;
    Height:= 80;
    Left:= 10;
    Top:= 20;
    Width:= 300;
    Caption:= 'Ricerca in corso' + lineending + ' ' + lineending + Space(30) + '  A T T E N D I';
    AutoSize:= False;
    Enabled:= True;
    Visible:= True;
    ParentColor:= False;
  end;

   FormAvviso.Show;
   Sleep(200);
   Application.ProcessMessages;

Finalmente ho finito.   Grazie.