Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Febbraio 17, 2021, 05:03:58 pm

Titolo: [Risolto] fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 17, 2021, 05:03:58 pm
Non capisco perchè, dopo un aggiornamento di sitema, ahimè obbligato, non funzionino più le componenti fpspreadsheet.

Ricordo di non averlo installato. L'ho scaricato da qui (https://sourceforge.net/projects/lazarus-ccr/files/FPSpreadsheet/)
Poi ho semplicemente aggiunto nella riga uses le unit: "fpspreadsheet, laz_fpspreadsheet, "

Ora ciò non funziona più e, in compilazione, ricevo il messaggio d'errore
Citazione
frmmain.pas(9,33) Fatal: Impossibile trovare fpspreadsheet usato da frmmain dell'Analizzatore Progetti.
.
Ho anche guardato in IDE -> progetto -> opzioni progetto -> Percorsi  -> Altri File unit
Lì dentro ho aggiunto il percorso relativo alla cartella ottenuta con l'estrazione dal file fpspreadsheet-1.12.zip:
(../../fpspreadsheet-1.12/fpspreadsheet).

Ho riprovato a compilare, ma non è cambiato niente. Il programma non riesce più a ritrovare le unit pertinenti.
Titolo: Re:fpspreadsheet non funziona più
Inserito da: Stilgar - Febbraio 17, 2021, 06:30:46 pm
Prova ad installare il pacchetto attraverso l'online package manager.
Titolo: Re:fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 18, 2021, 05:02:47 pm
Ma perchè devo installarlo?
Un mese fa sono riuscito a farlo funzionare già senza installarlo. Anche qui (http://www.lazaruspascal.it/index.php?topic=404.msg2860#msg2860) ho letto che funziona senza installarlo, dovrei riuscirci anche questa volta. Probabilmente non seguo lo stesso procedimento dichiarativo della volta scorsa e purtroppo non lo ricordo più.  :o :-[ :'(
Titolo: Re:fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 18, 2021, 06:06:15 pm
Ho anche guardato in IDE -> progetto -> opzioni progetto -> Percorsi  -> Altri File unit
Lì dentro ho aggiunto il percorso relativo alla cartella ottenuta con l'estrazione dal file fpspreadsheet-1.12.zip:
(../../fpspreadsheet-1.12/fpspreadsheet).

Torna in
Ho anche guardato in IDE -> progetto -> opzioni progetto -> Percorsi  -> Altri File unit
Se guardi, su quella riga, sulla destra c'è un bottone con 3 puntini.
Se ci clicchi sopra, ti fa vedere i percorsi che hai aggiunto "incolonnati", e colora con un colore differente i percorsi che fanno riferimento a directories che non esistono (visto che lavori in Linux, potrebbero anche esistere, ma il tuo utente non hai i permessi per usarle).
Eventualmente, le puoi anche cancellare tutte, ed aggiungerle non a mano, ma usando la casella che c'è sotto all'elenco.

Trattandosi di Linux, magari hai scritto i percorsi a mano, ed hai invertito maiuscolo/minuscolo di qualche lettera.

Ciao, Mario
Titolo: Re:fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 18, 2021, 06:42:29 pm
@ bonmario

Ho verificato tutto. Non ci sono errori. Anche i permessi sono tutti aperti a tutto.
Per completezza, allego l'immagine dei percorsi relativi ad "Altri file unit".
Allego anche l'immagine delle sottodirectory corrispondenti.
Titolo: Re:fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 18, 2021, 06:56:05 pm
Nel primo post, hai scritto:
Codice: [Seleziona]
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
Titolo: Re:fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 18, 2021, 10:11:56 pm
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ì':
Codice: [Seleziona]
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:
Citazione
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.



Titolo: Re:fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 19, 2021, 07:57:24 am
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
Codice: [Seleziona]
..\..\____Componenti\fpspreadsheet\source\common

Ciao, Mario
Titolo: Re:fpspreadsheet non funziona più
Inserito da: xinyiman - Febbraio 19, 2021, 08:30:19 am
Ma perchè devo installarlo?

Per evitare situazioni come questa. Installalo con Online package manager e ti togli il fastidio.
Poi basta che nei tuoi progetti lo usi come risorsa aggiuntiva e metti le unit che ti servono.
Titolo: Re:fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 19, 2021, 11:18:48 am
Per evitare situazioni come questa. Installalo con Online package manager e ti togli il fastidio.
Poi basta che nei tuoi progetti lo usi come risorsa aggiuntiva e metti le unit che ti servono.

MAh, è anche questione di abitudine e di organizzazione soggettiva.
Io se non mi servono gli "oggetti visuali", preferisco non installare. Questo è uno dei componenti che non ho mai installato !

Ciao, Mario
Titolo: Re:fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 19, 2021, 11:50:25 am
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
Codice: [Seleziona]
..\..\____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:
Codice: [Seleziona]
/usr/lib64/lazarus/components/fpspreadsheet/source/common/

Ora il programma contiene, relativamente a fpspreadsheet, le seguenti righe:
Codice: [Seleziona]
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
Citazione
fpstypes.pas(13,2) Fatal: Cannot open include file "fps.inc"
Codice: [Seleziona]
unit fpsTypes;

{$mode objfpc}{$H+}
{$include fps.inc}

Titolo: Re:fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 19, 2021, 12:04:48 pm
Stessa logica di prima: guarda dove risiede quel file, ed eventualmente aggiungi la directory
Titolo: Re:fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 19, 2021, 04:38:21 pm
Ho concluso,
ma purtroppo non come volevo io perchè, dopo tante prove e tentativi fatti, ogni piccolo passo fatto, non era un passo avanti, ma un passo verso un nuovo ostacolo.
Perciò, alla fine, ho deciso di installare fpspreadsheet, limitatamente alle funzioni non visuali.
Ora il programma ha superato il livello della compilazione. Non so ancora se riuscirò a leggere le celle dei fogli di calcolo candidati. Infatti la lettura di detti fogli è subordinata a determinati valori riscontrati in una delle tabelle del mio DB. Però ora devo riadattare il programma ai criteri interni a SQLConstructor.
Grazie per la paziente guida.
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 21, 2021, 04:51:53 pm
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
Codice: [Seleziona]
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:
Codice: [Seleziona]
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.
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 21, 2021, 06:43:44 pm
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:
Codice: [Seleziona]
      areaFile.ReadFromFile(nomeFilCorr, sfOpenDocument);

Ciao, Mario
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 22, 2021, 12:37:21 pm
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):
Citazione
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
Codice: [Seleziona]
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:
Codice: [Seleziona]
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.
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 22, 2021, 01:11:54 pm
Vado a memoria, perché sono oramai passati anni da quando ci avevo guardato.
- Se fai come hai fatto tu, lui cerca di capire qual è il lettore più adatto. Se non ci riesce, ti da quell'errore.
- Se fai come ti ho suggerito io, gli dici direttamente tu con quale lettore leggerlo. Lo svantaggio di questo metodo è che se un domani salvi il file con un altro formato, avresti un errore.
Io all'epoca, avevo scelto la seconda strada.

Ciao, Mario
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 22, 2021, 04:42:24 pm
@binmario
Ho potuto provare il tuo suggerimento soltanto ora.
Sono  :o
ma ha funzionato.
Vista che ha funzionato, rinunzio a capire perchè la mia vecchia prova funzionava ed ora non funziona più. Boh???

Purtroppo, con la peripezie che sto soffrendo per via dei blocchi continui del mouse e della tastiera, non riesco nemmeno a seguire i dovuti percorsi logici e pratici sul programma in stesura.
Per la cronaca, oggi ho dovuto forzare lo spegnimento del pc e riavviare ben 6 volte. Cosa succede dopo ogni spegnimento forzato?

Comunque, pare che finalmente abbia potuto fare un piccolo passo avanti .

Grazie!
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 22, 2021, 04:48:23 pm
Ripeto: ci avevo guardato parecchio tempo fa', e magari nel frattempo le cose sono cambiate.
Provo a rispiegarmi, perché magari prima mi sono espresso male.
Se non gli passi il secondo parametro, fpspreadsheet cerca di capire qual è il lettore più adatto. Non sempre ci riesce. A volte, anche lo stesso file, se lo risalvi, potrebbe darti o non darti più quell'errore, anche se fino a prima faceva il contrario.

Ciao, Mario
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: petrusic - Febbraio 23, 2021, 06:58:20 pm
Se non gli passi il secondo parametro, fpspreadsheet cerca di capire qual è il lettore più adatto. Non sempre ci riesce. A volte, anche lo stesso file, se lo risalvi, potrebbe darti o non darti più quell'errore, anche se fino a prima faceva il contrario.
Quindi, mi stai dicendo che in una sequenza come quella indicata qui sotto
Citazione
ContDom2004.ods
ContDom2005.xls
ContDom2006.xls
ContDom2007.xls
ContDom2008.ods
ContDom2009.ods
dovrei riconoscerlo io e, di volta in volta indicargli il formato corretto per il foglio di calcolo corrispondente.
Ma come faccio a sapere. per il suffisso .xls , quale sia il formato corretto fra "sfExcel2, sfExcel5, sfExcel8"?
Titolo: Re:[Risolto] fpspreadsheet non funziona più
Inserito da: bonmario - Febbraio 24, 2021, 08:00:29 am
Non lo so, io ti ho raccontato la mia esperienza.
Nel mio caso, il mio programma doveva aprire sempre lo stesso file, e sapevo che tutti gli utenti lo modificavano con OpenOffice Calc alla stessa versione.

Così, al volo, mi viene in mente che potresti andare a tentativi: li provi tutti fino a quando non trovi quello che non da errore. Il tutto, naturalmente, in un blocco try ... except, in cui verifichi l'eventuale errore di ritorno.

Ciao, Mario