L'ostacolo di oggi si chiama
frm2.pas(227,16) Error: Identifier not found "tbMovv"
tbMovv è una matrice che penso di avere dichiarata come globale.
unit frmmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls,
ExtCtrls, fpspreadsheet, laz_fpspreadsheet, Process, ZConnection, ZDataset,
fpstypes; // , flcDynArrays; dovrebbe permettere di riordinare la seuenza degli elementi di un vettore
type
{ TForm1 }
TForm1 = class(TForm)
DataSource1: TDataSource;
leInfoMov: TLabeledEdit;
PulsFine: TButton;
PulsAvvia: TButton;
Label1: TLabel;
lsDir: TListBox;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
procedure PulsFineClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PulsAvviaClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
uses
frm2;
// frm2, tbComuni;
type
TsSpreadsheetFormat = (sfExcel2, sfExcel5, sfExcel8, sfExcelXML, sfOOXML,
sfOpenDocument, sfCSV, sfHTML, sfWikiTable_Pipes, sfWikiTable_WikiMedia, sfUser);
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
const
dirFogli: string = '/media/dirdati/dativari/ContDom/';
var
// MyWorkbook: TsWorkbook; // dichiarazione necessaria per creare un'istanza della cartella di lavoro
tbMovv: TtbMovv;
tbResta: TtbResta;
tbRiep: TtbRiep;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
L'errore l'ho ricevuto all'interno della Unit "frm2".
Ieri però ho scritto tante righe dentro la frm2 ed ho anche avviato la compilazione del programma più volte, senza mai ricevere messaggi d'errore. Quindi non ho capito più se verament5e c'è un problema.
Riporto qui sotto il gruppo di istruzioni dove il compilatore ha segnalato l'errore:
procedure TForm2.FormCreate(Sender: TObject);
var
frmain: TForm;
i, n, nuRec, totRecQry: Integer;
ixTbMovv, ixTbResta, ixTbRiep: Integer;
nuRgTbMovv, nuRgTbResta, nuRgTbRiep: Integer;
begin
--- bla --- bla ---
//-------------------------------------------- Verifica presenza di righe in "tbMovv", "tbResta" e in "tbRiep" ------------------------------------------
nuRgTbMovv:= tbMovv.Count/5; // )
nuRgTbRiep:= tbRiep.Count/4; // ( Righe segnalate con l'errore NOT found
nuRgTbResta:= tbResta.Count/5; // )
if (nuRgTbMovv > 0) then
begin
ixTbMovv:= 0;
end
???
Non è visibile.L'hai dichiarata nell'implementation e non nell'interface del modulo che la esporta.
Ah!
Io avevo capito che tutti i miei type e var andassero scritti dopo l'implementation.
Ora ho spostato le mie dichiarazioni nella sezione Interface della Unit frmmain, così:
unit frmmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls,
ExtCtrls, fpspreadsheet, laz_fpspreadsheet, Process, ZConnection, ZDataset,
fpstypes; // , flcDynArrays; dovrebbe permettere di riordinare la seuenza degli elementi di un vettore
type
{ TForm1 }
TForm1 = class(TForm)
DataSource1: TDataSource;
leInfoMov: TLabeledEdit;
PulsFine: TButton;
PulsAvvia: TButton;
Label1: TLabel;
lsDir: TListBox;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
procedure PulsFineClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PulsAvviaClick(Sender: TObject);
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
end;
var
Form1: TForm1;
tbMovv: TtbMovv;
tbResta: TtbResta;
tbRiep: TtbRiep;
implementation
{$R *.lfm}
uses
frm2;
type
TsSpreadsheetFormat = (sfExcel2, sfExcel5, sfExcel8, sfExcelXML, sfOOXML,
sfOpenDocument, sfCSV, sfHTML, sfWikiTable_Pipes, sfWikiTable_WikiMedia, sfUser); // sfOpenDocument è il tipo di formato valido per OpenOffice/LibreOffice.ods
const
dirFogli: string = '/media/dirdati/dativari/ContDom/';
var
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
...
Ebbene, in quest'ultima, come in altre prove di posizionamento dei type nella sezione Interface, ricevo sempre ERRORE, un errore diverso ma, pur sempre errore:
frmmain.pas(30,4) Error: Fields cannot appear after a method or property definition, start a new visibility section first
Insomma, tirando le somme, non ho capito nè trovato, come mi capita quasi sempre, un esempio calzante per i miei errori di codifica.
Ma allora dove vanno scritte le dischiarazioni globali (type, const e var) ?
Esiste una guida testuale chiara, possibilmente in italiano, che accompagni passo dopo passo il principiante?
Capisco che certe domande non dovrebbero fare parte della vita di un forum. Sono dispiaciuto e privo di mordente.
::)
l'errore ti spiega cona non va:
ti dice che un campo non può essere definito dopo un metodo od una proprietà
per ovviare puoi definire un'altra sezione di visibilità
ovvero puoi fare come segue:
TForm1 = class(TForm)
DataSource1: TDataSource;
leInfoMov: TLabeledEdit;
PulsFine: TButton;
PulsAvvia: TButton;
Label1: TLabel;
lsDir: TListBox;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
procedure PulsFineClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PulsAvviaClick(Sender: TObject);
private // <- nuova sezione di visibilità, si può usare anche "public" o altra definizione di visibilità
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
end;
oppure
TForm1 = class(TForm)
DataSource1: TDataSource;
leInfoMov: TLabeledEdit;
PulsFine: TButton;
PulsAvvia: TButton;
Label1: TLabel;
lsDir: TListBox;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
// field spostati prima dei metodi
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
procedure PulsFineClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PulsAvviaClick(Sender: TObject);
end;
Edit:
La sequenza, la puoi trovare qui:
https://freepascal.org/docs-html/ref/refse34.html#x69-910006.1 (https://freepascal.org/docs-html/ref/refse34.html#x69-910006.1)
capisco che c'è da farci l'occhio... :)
per ovviare puoi definire un'altra sezione di visibilità
Purtroppo non funzionano nemmeno i tuoi suggerimenti. Il secondo l'avevo già provato prima del mio precedente post.
Ho provato ora anche questo:
type
{ TForm1 }
TForm1 = class(TForm)
DataSource1: TDataSource;
leInfoMov: TLabeledEdit;
PulsFine: TButton;
PulsAvvia: TButton;
Label1: TLabel;
lsDir: TListBox;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
procedure PulsFineClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PulsAvviaClick(Sender: TObject);
private
// public
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
Ed ecco cosa ne pensa il compilatore:
frmmain.pas(31,11) Fatal: Syntax error, ":" expected but "=" found
private o public è la stessa medesima cosa. Lo stesso errore mi viene fornito se metto in campo il tuo 2° esempio.
prova a portare la dichiarazione di "array of array" prima di TForm1
type
TAoA = array of array of String;
TForm1
...
private
TtbMovv : TAoa;
...
end;
Ho il sospetto che tu stia usando "tbMovv", e non "Form1.tbMovv".
Puoi eventualmente postare il codice della dichiarazione attuale di TForm1, e quello che hai scritto per usare "tbMovv" dal Fom2?
Quello che succede è esattamente il contrario di quanto sospetti tu. Infatti, usandoi tbMovv soltanto non da errore, mentre Form1.tbMovv da errore.
L'errore si è manifestato infatti sulle righe che avevo modificato prima dell'ultima modifica suggerita da nomorelogic e che avevo dimenticato di ripristinare (senza Form1.)
Ecco le righe di Form1 che mi avete chiesto, tu e nomorelogic :
unit frmmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DB, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls,
ExtCtrls, fpspreadsheet, laz_fpspreadsheet, Process, ZConnection, ZDataset,
fpstypes; // , flcDynArrays; dovrebbe permettere di riordinare la seuenza degli elementi di un vettore
type
{ TForm1 }
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
TForm1 = class(TForm)
DataSource1: TDataSource;
leInfoMov: TLabeledEdit;
PulsFine: TButton;
PulsAvvia: TButton;
Label1: TLabel;
lsDir: TListBox;
ZConnection1: TZConnection;
ZQuery1: TZQuery;
procedure PulsFineClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PulsAvviaClick(Sender: TObject);
end;
var
Form1: TForm1;
tbMovv: TtbMovv;
tbResta: TtbResta;
tbRiep: TtbRiep;
implementation
ecoo anche del passo di Form2, dove si verificava l'errore:
procedure CarRgTbMovv(ixTab, rgCorr, n: Integer);
var
coVoce: Integer;
coVoceEdt, dtprec, sql, voCassa: String;
begin
if (tbMovv[ixTab, 5] <> 'TOTALE') THEN
begin
Form2.GridMovv.Cells[1,rgCorr]:= tbMovv[ixTab, 5]; // Descrizione del movimento contabile
coVoce:= StrToInt(tbMovv[ixTab, 1]);
coVoceEdt:= EdtCoVo(coVoce);
Form2.GridMovv.Cells[2,rgCorr]:= coVoceEdt; // Es.:'1.01.600.005';
coVoce:= coVoce div 1000;
coVoce:= coVoce * 1000;
sql := 'SELECT NomeVoce FROM piancont WHERE NumVoce = ' + IntToStr(coVoce);
Form1.ZQuery1.SQL.Text := sql;
Col codice modificato, come riportato sopra, non da più errore.
Facendo riferimento ai nomi che hai usato tu nel codice che hai postato:
- (se tbMovv la devi usare SOLO nelle procedure che hai nella "implementation", la puoi dichiarare nella implementation)
- se tbMovv la devi usare nei sorgenti che usano la unit dove la stai dichiarando, la DEVI dichiarare prima della implementation. Occhio però: in questo modo avrai una sola variabile di nome tbMovv. Se nella unit di Form2, usi 2 variabili, Pippo e Pluto, entrambe di tipo TForm1, entrambe punteranno alla stessa tbMovv
il 1° criterio d'uso è chiaro.
il 2° è proprio quello che devo mettere in pratica.
Però mi viene difficile capire il perchè, oltre alla sezione var, devo tenere conto di una strana posizione, a mio avviso, dei type relativi alle variabili. Nei type dichiaro le classi di appartenenza delle variabili. Allora non dovrei scrivere tali dichiarazioni pure sotto il type TForm1?
Es.:
type
{ TForm1 }
TForm1 = class(TForm)
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
DataSource1: TDataSource;
leInfoMov: TLabeledEdit;
...
var
Form1: TForm1;
tbMovv: TtbMovv;
tbResta: TtbResta;
tbRiep: TtbRiep;
implementation
Invece, per fare funzionare il riconoscimento da parte del compilatore, ho dovute scrivere:
type
{ TForm1 }
TtbMovv = array of array of String;
TtbResta = array of array of String;
TtbRiep = array of array of String;
TForm1 = class(TForm)
...
:o