Nel primo post, hai scritto:
Poi ho semplicemente aggiunto nella riga uses le unit: "fpspreadsheet, laz_fpspreadsheet, "
Dalle immagini che hai appena mandato, si vede che in quel percorso c'è "laz_fpspreadsheet", ma "fpspreadsheet" non c'è, quindi è normale che ti dia quell'errore in compilazione.
Ciao, Mario
Dalle immagini che hai appena mandato, si vede che in quel percorso c'è "laz_fpspreadsheet", ma "fpspreadsheet" non c'è, quindi è normale che ti dia quell'errore in compilazione.
Eh!, Eh!, Eh! :)
Sembra facile, ma non è come credi perchè, impostando la riga delle uses così':
unit frmmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DB, SQLDB, SQLite3Conn, Forms, Controls, Graphics, Dialogs,
StdCtrls, ComCtrls, ExtCtrls, laz_fpspreadsheet, Process;
type
. . .
ecco cosa succede in compilazione:
laz_fpspreadsheet.pas(11,3) Fatal: Impossibile trovare fpsallformats usato da laz_fpspreadsheet dell'Analizzatore Progetti.
e nel sorgente compare una unit creata automaticamente con la segnalazione della riga contenente l'errore, come risulta dall'immagine allegata.
Io non so più che prove fare.
Devi cercare, tra i sorgenti di del componente, dove risiede "fpspreadsheet", ed aggiungere quella directory alle altre.
Ho trovato un mio progetto dove lo uso: io nell'elenco delle directories, per quanto riguarda fpspreadsheet, ho solo questa
..\..\____Componenti\fpspreadsheet\source\common
Ciao, Mario
Devi cercare, tra i sorgenti di del componente, dove risiede "fpspreadsheet", ed aggiungere quella directory alle altre.
Ho trovato un mio progetto dove lo uso: io nell'elenco delle directories, per quanto riguarda fpspreadsheet, ho solo questa
..\..\____Componenti\fpspreadsheet\source\common
Qualcosa è cambiato.
Ammetto che non avevo capito dove andare a sistemare l'unzip di fpspreadsheet-1.12.zip. Ieri l'ho inserito in /usr/.../lazarus/component ed ho aggiunto stamani, nei Percorsi di ricerca di lazarus, come mi hai suggerto, la riga:
/usr/lib64/lazarus/components/fpspreadsheet/source/common/
Ora il programma contiene, relativamente a fpspreadsheet, le seguenti righe:
unit frmmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, DB, SQLDB, SQLite3Conn, Forms, Controls, Graphics, Dialogs,
StdCtrls, ComCtrls, ExtCtrls, fpspreadsheet, Process;
--- bla --- bla ---
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);
--- bla --- bla ---
procedure TForm1.PulsAvviaClick(Sender: TObject);
var
frm2: TForm;
areaFile: TsWorkbook;
foglioCorr: TsWorksheet;
. . .
begin
. . .
nuFogli:= areaFile.GetWorksheetCount - 1;
striMia:='il file-cartella corrente è' + nomeFilCorr +' e contiene n.' + IntToStr(nuFogli + 1) + ' fogli elettronici' + chr(10) + ' così denominati:';
foglioCorr:= areaFile.GetFirstWorksheet;
for ixFoglio:= 0 to nuFogli do
begin
numRg:= foglioCorr.GetCellCountInCol(0);
numCol:= foglioCorr.GetCellCountInRow(0);
--- bla --- bla ---
Dicevo che qualcosa è cambiato, grazie ai tuoi suggerimenti, ma ora compare, in compilazione, un nuovo messaggio di errore
fpstypes.pas(13,2) Fatal: Cannot open include file "fps.inc"
unit fpsTypes;
{$mode objfpc}{$H+}
{$include fps.inc}
Credo di avere cantato vittoria troppo presto.
Infatti, dopo aver potuto riprendere le prove interrotte per avanzamento programma, ieri ho ricominciato ed ecco la sorpresa:
Nella procedura riportata parzialmente qui sotto
procedure TForm1.PulsAvviaClick(Sender: TObject);
var
frm2: TForm;
areaFile: TsWorkbook;
foglioCorr: TsWorksheet;
--- bla --- bla ---
begin
n:= lsDir.Items.Count - 1 ;
areaFile:= TsWorkbook.Create;
ixFile:= lsDir.ItemIndex;
nomeFilCorr:= lsDir.Items[ixFile];
lun:= Length(nomeFilCorr) - 1;
nomeFilCorr:= dirFogli + RightStr(nomeFilCorr, lun);
areaFile.ReadFromFile(nomeFilCorr);
--- bla --- bla ---
l'ultima istruzione ("areaFile.ReadFromFile(nomeFilCorr); ") determina un'eccezione di classe per file NON trovato in lettura (vedi immagine allegata)
L'errore però non si manifesta in altro punto del programma dove eseguo un comando "cp" di salvataggio prudenziale del DBsqlite3 che dovrebbe essere aggiornato successivamente coi dati letti dal foglio di calcolo
Riporto, per completezza, anche il gruppo di istruzione relative al comando cp:
procedure TForm1.FormCreate(Sender: TObject);
const
dbCopia: String = '/media/dirdati/dativari/contabfam/ContabFamdb_prove';
dbOrig: String = '/media/dirdati/dativari/contabfam/ContabFamdb';
var
AProcess: TProcess; // classe dedicata ad eseguire comandi Shell (commad Line)
Esito: TSearchRec;
result: Boolean;
swAster: Boolean = False;
lun, totRecQry: Integer;
annata, dtIni, dtFin, sql, striMia: String;
dirDB, nomeDB: String;
begin
//-----------> avvio SALVATAGGIO intero DB -------------------
striMia:= 'cp ' + dbOrig + ' ' + dbCopia;
AProcess := TProcess.Create(nil);
AProcess.CommandLine:= striMia;
AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
AProcess.Free;
Per quello che sto soffrendo in questo periodo, in termini di malfunzionamenti di vario genere, non riesco più a capire se l'eccezione sollevata possa dipendere dal programma, dal S.O., dalla scheda madre, ...
Però, se il comando cp funziona (il file /media/dirdati/dativari/contabfam/ContabFamdb_prove viene creato), mentre l'accesso al foglio di calcolo NO, il problema potrebbe dipendere dal programma.
Se guardi i sorgenti, capisci che quell'errore non vuol dire che non trova il file, ma che non sa con quale "lettore" leggerlo.
In pratica , lui non sa capire per i fatti suoi se è un file Excel, Calc, o altro. Devi dirglielo tu.
Vado a memoria, dovrebbe essere qualcosa del genere:
areaFile.ReadFromFile(nomeFilCorr, sfOpenDocument);
Ciao, Mario
Se guardi i sorgenti, capisci che quell'errore non vuol dire che non trova il file, ma che non sa con quale "lettore" leggerlo.
In pratica , lui non sa capire per i fatti suoi se è un file Excel, Calc, o altro. Devi dirglielo tu.
Quindi, mi stai dicendo che "reader not found for file" sta a significare "lettore non trovato" , cioè ReadFromFile non capisce il formato da utlizzare per leggere il file.ods da me indicato?
Ripeto che ho già provato questa parte del programma e funzionava.
Non è che non voglio accettare il tuo suggerimento, infatti quando chiedo aiuto nel forum, indosso sempre la veste di apprendista di scarso livello ed accetto qualsiasi indicazione mi viene data.
In questo caso però è necessario che riporti quanto indicato nella relativa guida (https://wiki.lazarus.freepascal.org/FPSpreadsheet):
Reading of spreadsheet files is accomplished (among others) by the workbook methods
procedure ReadFromFile(AFileName: string):
Reads the file with the given name and automatically determines the correct file format.
In fatti per ottenere ciò, ho capito che basta aggiungere la seguente riga nei type del programma
type
TsSpreadsheetFormat = (sfExcel2, sfExcel5, sfExcel8, sfExcelXML, sfOOXML,
sfOpenDocument, sfCSV, sfHTML, sfWikiTable_Pipes, sfWikiTable_WikiMedia, sfUser);
Perciò dovrebbe bastare richiamare la classe ReadFromFile, semplicemente con l'istruzione indicata nella guida, che nel mio programma diventa, come ho scritto:
areaFile.ReadFromFile(nomeFilCorr)
, dove nomeFilCorr contiene il percorso completo del file.ods.
Io credo, pertanto, di avere applicato correttamente le indicazioni trovate nella guida e continuo a NON capire la comparsa della segnalazione d'errore.