Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: petrusic - Aprile 22, 2020, 06:02:08 pm

Titolo: [Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 22, 2020, 06:02:08 pm
Vorrei creare un pacchetto destinato a contenere classi di utility in formato sorgente da richiamare di volta in volta nei progetti per l'utilizzo.
Mi servirebbe un piccolo ragguaglio per la scrittura del codice e la successiva compilazione e salvataggio.
Dall'IDE Lazarus, cliccando su Pacchetto -> Nuovo pacchetto ->nomePacchetto.lpk

Ecco il nomePacchetto è il primo problema, perchè non ho capito se scrivere nomePacchetto o NomePacchetto o ...

poi dovrei preparare il suo salvataggio in una directory che, penso, potrebbe essere quella mia usuale per il salvataggio di tutti i miei progetti.

A questo punto si apre la finestra seguente dove dovrei scrivere, penso, il nome di una procedura o funzione
(http://www.lazaruspascal.it/home/petrus/Screenshot_2020-04-22_17-58-13.png)
E così? C'è una guida che ne faccia la descrizione, anche per il successivo utilizzo all'interno di un progetto?
 :)
Titolo: Re:creare un pacchetto utility
Inserito da: Otto - Aprile 22, 2020, 06:14:12 pm
Ciao petrusic.

https://wiki.lazarus.freepascal.org/How_To_Write_Lazarus_Component/it
https://wiki.lazarus.freepascal.org/IDE_Window:_Add_to_Package
Titolo: Re:creare un pacchetto utility
Inserito da: bonmario - Aprile 22, 2020, 06:37:25 pm
Vorrei creare un pacchetto destinato a contenere classi di utility in formato sorgente da richiamare di volta in volta nei progetti per l'utilizzo.

Tanto per essere sicuri, vuoi veramente creare un "pacchetto", oppure una "unit"?
Da quello che scrivi, credo che vada bene una unit.

Ciao, Mario
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 22, 2020, 09:56:39 pm
Tanto per essere sicuri, vuoi veramente creare un "pacchetto", oppure una "unit"?
Da quello che scrivi, credo che vada bene una unit.
Ho capito che unit  = class, quindi, scrivendo la mia utility in una unit  all'interno del progetto corrente, potrei richiamarla in qualsiasi altra unit dello stesso progetto.
Se, invece inserissi l'utility in una unit di un pacchetto esterno al progetto, potrei richiamarla in qualsiasi altro prossimo progetto.
Ecco perchè penso ad un pacchetto utilmie da salvare, credo e spero, nella stessa directory madre dei miei progetti.
Titolo: Re:creare un pacchetto utility
Inserito da: xinyiman - Aprile 22, 2020, 10:12:27 pm
Se crei una unit puoi usarla in qualsiasi progetto. Basta che la metti nella stessa cartella delle unit del singolo progetto e poi richiami la unit come fai sempre.
Titolo: Re:creare un pacchetto utility
Inserito da: bonmario - Aprile 23, 2020, 08:04:34 am
Basta che la metti nella stessa cartella delle unit del singolo progetto e poi richiami la unit come fai sempre.

Non è indispensabile: io ho tutte le unit "generiche" nella stessa directory, poi, quando apro un nuovo progetto, aggiungo quella directory nelle opzioni del progetto.
L'unica cosa particolare, è che metto il percorso relativo, e non quello assoluto. In questo modo, lo stesso progetto vede la unit sia su Linux, che su Windows

Ciao, Mario
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 23, 2020, 12:44:24 pm
Quindi, se non ho capito male, dovrei:
- aggiungere una nuova Unit con File -> Nuova Unit
  e rinominare la Unit con un nome identificatore;
- da Progetto -> Opzioni Progetto -> Percorsi:
   >  Altri File Unit (-FU):
                    inserire il percorso che porta alla directory contenente la nuova Unit
   >  Cartella di Output delle Unit (-FU):
                     inserire il percorso fino alla alla directory destinataria di nuove Unit

Tutto ciò però credo che valga per tutte le nuove Unit, non soltanto per le Unit, diciamo, di uso generale.

Titolo: Re:creare un pacchetto utility
Inserito da: bonmario - Aprile 23, 2020, 12:53:50 pm
- da Progetto -> Opzioni Progetto -> Percorsi:
   >  Altri File Unit (-FU):
                    inserire il percorso che porta alla directory contenente la nuova Unit

Io di solito faccio solo questa. Dopo averlo fatto e dato l'ok, aggiungo la unit alla "uses"

Ciao, Mario
Titolo: Re:creare un pacchetto utility
Inserito da: xinyiman - Aprile 23, 2020, 01:32:10 pm
Basta che la metti nella stessa cartella delle unit del singolo progetto e poi richiami la unit come fai sempre.

Non è indispensabile: io ho tutte le unit "generiche" nella stessa directory, poi, quando apro un nuovo progetto, aggiungo quella directory nelle opzioni del progetto.
L'unica cosa particolare, è che metto il percorso relativo, e non quello assoluto. In questo modo, lo stesso progetto vede la unit sia su Linux, che su Windows

Ciao, Mario
Ovviamente, era solo per semplificargli la cosa visto che è all'inizio
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 23, 2020, 04:56:11 pm
Ovviamente, era solo per semplificargli la cosa visto che è all'inizio
Grazie xinyiman, però credo sia meglio che mi abitui sin da subito ad affrontare i procedimenti corretti, anche se è più facile cadere.
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 23, 2020, 05:03:35 pm
- da Progetto -> Opzioni Progetto -> Percorsi:
   >  Altri File Unit (-FU):
                    inserire il percorso che porta alla directory contenente la nuova Unit
Io di solito faccio solo questa.
Dopo averlo fatto e dato l'ok, aggiungo la unit alla "uses"
Non capisco però come fai a trasferire poi solo la Unit nuova e funzionante nella directory di tutte le unit generiche.
Copi e incolla?
Titolo: Re:creare un pacchetto utility
Inserito da: bonmario - Aprile 23, 2020, 06:02:01 pm
Non sono sicuro di aver capito la domanda, comunque, se ho capito bene, le possibilità sono 2:
- o la sviluppo direttamente nel posto giusto
- o la sposto con "Esplora risorse", o simili

Ciao, Mario
Titolo: Re:creare un pacchetto utility
Inserito da: Stilgar - Aprile 23, 2020, 06:25:15 pm
Ciao petrusic.

Il pacchetto, per sua natura, va nella direzione che ti interessa (se ho capito correttamente).

Crei il pacchetto e poi lo rendi "visibile" all'ide, in modo che nei tuoi progetti devi solo indicare la dipendenza verso quel pacchetto.

Il pacchetto può contenere una o più unit che ti puoi scrivere.

Quando hai bisogno di una di queste unit, però, il progetto deve dichiarare che dipende dal pacchetto.

In altra parole.
Nel tuo progetto deve comparire
Codice: [Seleziona]

 <RequiredPackages Count="1">
      <Item1>
        <PackageName Value="il_fantasmagorico_pacchetto_di_petrusic"/>
      </Item1>
    </RequiredPackages>

Questo lo fa direttamente l'ide.


La rottura di scatole del preparare i pacchetti, consiste nel fatto che per compilarli devi utilizzare la finestrella farlocca che resta aperta.


Suggerimento.
Ti fai un progetto di sviluppo di queste unit che non dipende dal pacchetto ma include la tua/tue unit, così da poter viaggiare più speditamente nella codifica e debug.
Solo in una seconda fase crei il pacchetto.


Poi se vuoi giocare con i path per ogni progetto, puoi fare un progetto "tipo" e sistemate le cose (come il path) puoi dire l'ide che vuoi rendere di "default" per i progetti successivi quelle impostazioni.


Spero di averti reso le idee più chiare.


Stilgar


OT:
Una unit è un contenitore di cose.

La class è un modo per rappresentare la memoria e la gestione di questa.
Il record/tipo è un modo per mappare la memoria.


Il resto è codice quindi smandruppamento della memoria:)




Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 25, 2020, 10:35:33 am
Dopo i vostri ultimi post le mie idee sono un pò confuse. Vorrei perciò procedere per gradi.
Da quanto capito qui (http://www.lazaruspascal.it/index.php?topic=2300.msg14323#msg14323)
non è necessario creare un pacchetto. Basta creare una nuova Unit per ciascuna nuova propria utility, salvandola in una directory apposita.

Se ho capito bene come organizzare l'allocazione delle utility ed il sistema del richiamo in nuovi progetti successivi, mi resta ora da capire soltanto come procedere per il salvataggio della neo utility fuori dal progetto attuale, in modo da richiamarla anche in questo con le modalità dette sopra.

Allora, come prima cosa potrei impostare le opzioni del progetto nell'IDE. Nel progetto corrente creo una nuova unit dove trasferisco la procedurina di utility. Dovrei a questo punto salvare soltanto questo nuovo file nella directory preparata per le utilility. Fatto questo posso chiudere la Unit con la utyility appena creata ed aggiungerla fra le uses del progetto corrente.

Ho capito bene?
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 25, 2020, 12:29:33 pm
Ho fatto come ho detto prima, anzi avevo dimenticato di inserire il percorso della Unit nelle opzioni del progetto ed è stata la stessa procedura di salvataggio della Unit che me lo ha suggerito, pertanto ora mi trovo la seguente impostazione:
- Progetto -> Opzioni Progetto -> Percorsi:
   >  Altri File Unit (-FU): ../util_mie

Tuttavia, pur avendo aggiunto nelle uses del progetto progetto il nome della utility
Codice: [Seleziona]
unit cofamtrasf;   {Classe: tipo Form_Main}

{$mode objfpc}{$H+}

interface

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, db, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn,
  ExtCtrls, DBGrids, DBCtrls, ZConnection, ZDataset, Types, EditaCoVoce;

type
  { TForm1 }

  TForm1 = class(TForm)       
--- bla --- bla ---
coVoceEdt:=EditaCoVoce.EdtCoVo(coVoSeCor);
--- bla --- bla ---
il compilatore non riesce a trovare la funzione contenuta all'interno della Unit:
Citazione
cofamtrasf.pas(199,30)Error: identifier not found "EdtCoVo"

Titolo: Re:creare un pacchetto utility
Inserito da: Stilgar - Aprile 25, 2020, 12:50:56 pm
Ma quell'assegnazione, che evidenzi, dove l'hai messa?
Nella dichiarazione o nella implementazione?
Se è nella dichiarazione per forza ti da errore.
Le assegnazioni, se non sono per le costanti, devono andare nell'implementazione.

Stilgar
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 25, 2020, 04:47:57 pm
Ma quell'assegnazione, che evidenzi, dove l'hai messa?
Nella dichiarazione o nella implementazione?
Se è nella dichiarazione per forza ti da errore.
Le assegnazioni, se non sono per le costanti, devono andare nell'implementazione.

Ti riferisci a:
Citazione
--- bla --- bla ---
coVoceEdt:=EditaCoVoce.EdtCoVo(coVoSeCor);
--- bla --- bla ---
questa?

Certo che fa parte dell'implementazione:
Codice: [Seleziona]
procedure TForm1.VoSecPartSelect(Sender: TObject);
var
  i: integer;
  coVoSeCor: Integer;  // Codice voce secondaria corrente
  risult: integer;
  coVoceEdt: string;
begin
  writeln();
  writeln('proc.TForm1.VoSecPartSelect');
  i:= 0;
  while (VoSecPart.Text <> tbDBpiancont[i,1]) do
  begin
    i:= i + 1;
  end;
  VoSotCtoPart.Items.Clear;
  coVoSeCor:= StrToInt(tbDBpiancont[i,0]);   // codice voce legato alla ComboBox.Text(VoSecPart)
  if ((StrToInt(tbDBpiancont[i,0]) div 1000*1000) = coVoSeCor) then
    begin
      coVoceEdt:=EditaCoVoce.EdtCoVo(coVoSeCor);
      CoVoSecPart.Text:=coVoceEdt;
    end;
   VoSotCtoPart.Items.Clear;
   while ((StrToInt(tbDBpiancont[i,0]) div 1000)*1000 = coVoSeCor) do
   begin
     VoSotCtoPart.Items.Add(tbDBpiancont[i,1]);
      i:= i +1;
   end;
end;                                             
Allego comunque tutto il file .pas
Titolo: Re:creare un pacchetto utility
Inserito da: Stilgar - Aprile 25, 2020, 04:57:10 pm
La funzione che esporti  da EditaCoVoce,è' dichichiarate nell'interface dell'unit che importi?Se non lo vede mi viene da pensare sia quello il problema.Stilgar
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 25, 2020, 05:37:09 pm
Ho modificato la parte interface ed implementation così:
Codice: [Seleziona]
unit cofamtrasf;   {Classe: tipo Form_Main}

{$mode objfpc}{$H+}

interface

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, db, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn,
  ExtCtrls, DBGrids, DBCtrls, ZConnection, ZDataset, Types;

type
  { TForm1 }

  TForm1 = class(TForm)
    CoVoSecArri: TEdit;
    CoVoSecPart: TEdit;
    VoMasArri: TComboBox;
    VoMasPart: TComboBox;
    contabfamDB: TDataSource;
    pExit: TButton;
    DtFin: TDateEdit;
    DtIni: TDateEdit;
    Label5: TLabel;
    Label6: TLabel;
    pVia: TButton;
    CoVoSotCtoPart: TEdit;
    CoVoSotCtoArri: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    MovDest: TGroupBox;
    VoSotCtoPart: TComboBox;
    Label2: TLabel;
    SotCtoArri: TComboBox;
    VoSecPart: TComboBox;
    Label1: TLabel;
    MovTrasf: TGroupBox;
    VoSecArri: TComboBox;
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;
    procedure FormActivate(Sender: TObject);
    procedure pExitClick(Sender: TObject);
    procedure VoMasPartChange(Sender: TObject);
    procedure VoSecPartSelect(Sender: TObject);
    function EdtCoVo(coVoce:integer):String;

  public

    end;

  var
  Form1: TForm1;

implementation

{$R *.lfm}
uses
  EditaCoVoce;
  function EdtCoVo(coVoce:integer):String;
  begin

  end;

{ TForm1 }                             
--- bla --- bla ---
però non è cambiato niente. Ricevo sempre lo stesso errore, allo stesso punto.
Inoltre ecco il contenuto della directory util_mie:
Codice: [Seleziona]
petrus@petrus-pc /media/dirdati/dativari/lazarus_progetti/Lazarus_progetti_miei/
util_mie $ ls
EditaCoVoce.pas  backup  utilmie.lpk

Sicuramente non sono capace, perchè non ho capito come procedere.
Titolo: Re:creare un pacchetto utility
Inserito da: Stilgar - Aprile 25, 2020, 05:45:31 pm
Ma dentro
EditaCoVoce cosa c'è?

"Il compilatore si incazza in un punto, ma probailmente l'errore è da un'altra parte" (cit il mio prof di Sistemi d'automazione industriale).


Stilgar
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 25, 2020, 06:22:03 pm
Ma dentro
EditaCoVoce cosa c'è?


Ecco il contenuto di EditaCoVoce:
Codice: [Seleziona]
unit EditaCoVoce;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

implementation
function EdtCoVo(coVoce:integer):String;
var
  i: Integer= 0;
  coVoceStr: String;
  crt: char;
  StriEdit: string;
begin
  SetLength (coVoceStr, 9);
  coVoceStr:=IntToStr(coVoce);
  WriteLn();
  WriteLn('coVoceStr= ', coVoceStr);
  WriteLn();
  for i:= 1 to 9 do
  begin
    crt := coVoceStr[i];
    StriEdit:= StriEdit + crt;
    case i of
        1,3,6:
          StriEdit:= StriEdit + '.';
    end;
  end;
  WriteLn('StriEdit= ', StriEdit);
  Result:= StriEdit;
end;

end.
Titolo: Re:creare un pacchetto utility
Inserito da: Stilgar - Aprile 25, 2020, 06:27:37 pm
La funzione è nascosta in quel modo.
Codice: [Seleziona]
interface
....

function EdtCoVo(coVoce:integer):String;

....

implementation
...

 function EdtCoVo(coVoce:integer):String;
.....


Stilgar
Titolo: Re:creare un pacchetto utility
Inserito da: petrusic - Aprile 25, 2020, 06:55:12 pm
Ora infatti funziona.

Quindi il problema era dentro il file EditaCoVoce.pas.
Bisogna allora ripetere il rigo della funzione sotto le uses della Interface, in modo che possa essere agganciato attraverso i contenuti di uses e dei successivi nomi di procedure e function, presenti nella parte Implementation del progetto destinatario.

Non so se sono riuscito ad esprimere il concetto che mi sono fatto, in maniera comprensibile. Se ho capito male, ti prego di chiarirmelo bene tu.

Grazieeee!
Titolo: Re:creare un pacchetto utility
Inserito da: Stilgar - Aprile 25, 2020, 07:01:37 pm
In modo più preciso.Bisogna renderla visibile, esportandola, quella definizione che vuoi usare da fuori dal modulo.
:)
Stilgar
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 26, 2020, 09:39:48 am
Contento per la buona riuscita dell'import della nuova Unit nel progetto che sto portando avanti, ho pensato che la stessa Unit potrebbe ospitare più di una utililiy ed ho provato allora a duplicare quella, già pronta, cambiando ovviamente il nome e rispettando tutti gli agganci col progetto attuale.
Non l'avessi mai fatto: un vero disastro. Ho così fatto marcia indietro, però non sono convinto che non si possa fare.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: bonmario - Aprile 26, 2020, 12:39:10 pm
Certo che si può fare, io ho varie unit, suddivise per argomento: quella per la stampa, quella per i dialoghi, ecc. fino ad arrivare a quella "generica", dove c'è dentro roba che no ha senso mettere nelle altre.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: Otto - Aprile 26, 2020, 02:57:09 pm
Ciao petrusic.
Forse, questo esempio (https://wiki.freepascal.org/Unit#Detailed_unit_example) potrebbe esserti di aiuto.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 27, 2020, 05:33:28 pm
Da quanto letto attraverso i vostri suggerimenti, ho cercato di mettere dentro lo stesso file unit.pas
due function. Per la cronaca sono una l'opposto dell'altra.
Dopo la modifica, con l'aggiunta della seconda funcition, l'albero della directory
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei
contiene:
Codice: [Seleziona]
.
├── CoFamTrasf
│   ├── backup
│   │   ├── cofamtrasf.lfm
│   │   ├── cofamtrasflpi.lpi
│   │   ├── cofamtrasflpi.lpr
│   │   ├── cofamtrasflpi.lps
│   │   ├── cofamtrasf.pas
│   │   └── utilvarie.pas
│   ├── cofamtrasf.lfm
│   ├── cofamtrasflpi
│   ├── cofamtrasflpi.lpi
│   ├── cofamtrasflpi.lpr
│   ├── cofamtrasflpi.lps
│   ├── cofamtrasflpi.res
│   ├── cofamtrasf.pas
│   └── lib
│       └── x86_64-linux
│           ├── cofamtrasf.lfm
│           ├── cofamtrasflpi
│           ├── cofamtrasflpi.compiled
│           ├── cofamtrasflpi.o
│           ├── cofamtrasflpi.or
│           ├── cofamtrasflpi.res
│           ├── cofamtrasf.o
│           ├── cofamtrasf.ppu
│           ├── editacovoce.o
│           ├── editacovoce.ppu
│           ├── utilmie.o
│           ├── utilmie.ppu
│           ├── utilvarie.o
│           └── utilvarie.ppu
└── util_mie
    ├── backup
    │   ├── editacovoce.pas
    │   └── utilmie.pas
    └── utilmie.pas

CoFamTrasf è la directory contenente il progetto su cui sto lavorando;
util_mie è la directory contenente la unit utilmie.pas.

In: opzioni progetto -> percorsi -> altri file unit(-FU): ../util_mie  (la directory delle utility mi pare ben indirizzata)

Il file cofamtrasf.pas è così formato:
Codice: [Seleziona]
unit cofamtrasf;   {Classe: tipo Form_Main}

{$mode objfpc}{$H+}

interface

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, db, Forms, Controls, Graphics, Dialogs, StdCtrls, EditBtn,
  ExtCtrls, DBGrids, DBCtrls, ZConnection, ZDataset, Types;

type
  { TForm1 }

  TForm1 = class(TForm)
    CoVoSecArri: TEdit;
    CoVoSecPart: TEdit;
    VoMasArri: TComboBox;
    VoMasPart: TComboBox;
    contabfamDB: TDataSource;
    pExit: TButton;
    DtFin: TDateEdit;
    DtIni: TDateEdit;
    Label5: TLabel;
    Label6: TLabel;
    pVia: TButton;
    CoVoSotCtoPart: TEdit;
    CoVoSotCtoArri: TEdit;
    Label3: TLabel;
    Label4: TLabel;
    MovDest: TGroupBox;
    VoSotCtoPart: TComboBox;
    Label2: TLabel;
    SotCtoArri: TComboBox;
    VoSecPart: TComboBox;
    Label1: TLabel;
    MovTrasf: TGroupBox;
    VoSecArri: TComboBox;
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;
    procedure pExitClick(Sender: TObject);
    procedure VoMasPartChange(Sender: TObject);
    procedure VoSecPartSelect(Sender: TObject);
    procedure VoSotCtoPartSelect(Sender: TObject);

  public

    end;

  var
  Form1: TForm1;

implementation

{$R *.lfm}
uses
  utilmie;

  function DisEdtCoVo(coVoEdt:String):integer;
  function EdtCoVo(coVoce:integer):String;

  begin

  end;

{ TForm1 }
type
Ttbpiacon = array of array of string;

const
    ctiCassa: array[0..1, 0..1] of string = (('101001000', '101997999'),     // 1° range conti di Cassa (tabella piancont)
                                      ('101999000', '101999999'));       // ultimo range conti di Cassa (tabella piancont)


    ctiPart: array[0..2, 0..1] of string = (('102000000', '103999999'),  // 1° range conti di contropartita pertinenti a "partmovv" (tabella piancont)
                                            ('105000000', '203999999'),   // 2° range conti di contropartita pertinenti a "partmovv" (tabella piancont)
                                            ('205000000', '999999999')); // ultimo range conti di contropartita pertinenti a "partmovv" (tabella piancont)

    ctiPrest: array[0..1, 0..1] of string = (('104000000', '104999999'),     // 1° range conti di contropartita pertinenti a "prestmom" (tabella piancont)
                                             ('204000000', '204999999'));    // ultimo range conti di contropartita pertinenti a "prestmom" (tabella piancont)
var
  tbDBpiancont: Ttbpiacon;     {tabella di memoria coi dati letti dalla tabella DB.piancont
                                le colonne sono: |- NumVoce, NomeVoce, ContrPartSiNo, DtPrimoUso, DtUltimUso -|}
  indSotcto1: Integer= 0;    // Indice di tbDBpiancont per la 1.a voce di sottoconto, subordinata a quella secondaria corrente
  indSotCto9: Integer= 0;    // Indice di tbDBpiancont per l'ultima voce di sottoconto, subordinata a quella secondaria corrente
procedure TForm1.pExitClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.VoMasPartChange(Sender: TObject);
var
sql, sql2: String;
sql1: String= 'SELECT NumVoce, NomeVoce, ContrPartSiNo, DtPrimoUso, DtUltimUso ' +
              'FROM piancont WHERE ';
i, ii, n: integer;
totRecQry: integer;

begin
{  writeln();
  writeln('proc.TForm1.VoMasPartChange');}
  case VoMasPart.Text of
    'CASSA':
        sql2:= ('(NumVoce >= ' +  ctiCassa[0,0] + ' AND NumVoce <= ' + ctiCassa[0, 1] +
                ') OR (NumVoce >= ' + ctiCassa[1, 0] + ' AND NumVoce <= ' + ctiCassa[1, 1] + ')');

    'PARTMOVV':
        sql2:= '(NumVoce >= ' +  ctiPart[0,0] + ' AND NumVoce <= ' + ctiPart[0, 1] +
               ') OR (NumVoce >= ' + ctiPart[1, 0] + ' AND NumVoce <= ' + ctiPart[1, 1] +
               ') OR (NumVoce >= ' + ctiPart[2, 0] + ' AND NumVoce <= ' + ctiPart[2, 1] + ')';
    else //'PRESTMOM':
        sql2:= '(NumVoce >= ' +  ctiPrest[0,0] + ' AND NumVoce <= ' + ctiPrest[0, 1] +
               ') OR (NumVoce >= ' + ctiPrest[1, 0] + ' AND NumVoce <= ' + ctiPrest[1, 1] + ')';
  end;
  sql:= sql1 + sql2 + ' ORDER BY NumVoce';
{  WriteLn();
  WriteLn('sql= ', sql);}
  ZQuery1.SQL.Text := sql;
  ZQuery1.Open;
  totRecQry:= ZQuery1.RecordCount;
{  WriteLn();
  WriteLn('totRecQry= ', totRecQry);}
  SetLength(tbDBpiancont, totRecQry,5);
  n := -1;
  ZQuery1.First;
  while not ZQuery1.EOF do
  begin
    n:= n+1;
    tbDBpiancont[n,0]:= ZQuery1.FieldByName('NumVoce').AsString;
    tbDBpiancont[n,1]:= ZQuery1.FieldByName('NomeVoce').AsString;
    tbDBpiancont[n,2]:= ZQuery1.FieldByName('ContrPartSiNo').AsString;
    tbDBpiancont[n,3]:= ZQuery1.FieldByName('DtPrimoUso').AsString;
    tbDBpiancont[n,4]:= ZQuery1.FieldByName('DtUltimUso').AsString;
    if ((StrToInt(tbDBpiancont[n,0]) mod 1000) = 0) then
      VoSecPart.Items.Add(tbDBpiancont[n,1]);
    ZQuery1.Next;
  end;
  ZQuery1.Close;
{  WriteLn();
  WriteLn('n= ',n);}
  for i:= 0 to n do
  begin
    WriteLn();
    for ii:= 0 to 4 do
    begin
{      writeln('tbDBpiancont[', i,', ', ii,']= ', tbDBpiancont[i,ii]);}
    end;
  end;
end;

procedure TForm1.VoSecPartSelect(Sender: TObject);
var
  swFine: Boolean = False;
  i: integer;
  coVoSeCor: Integer;  // Codice voce secondaria corrente
  tEl: integer;
  coVoceEdt: string;
begin
{  writeln();
  writeln('proc.TForm1.VoSecPartSelect');}
  i:= 0;
  while (VoSecPart.Text <> tbDBpiancont[i,1]) do
  begin
    i:= i + 1;
  end;
  VoSotCtoPart.Items.Clear;
  coVoSeCor:= StrToInt(tbDBpiancont[i,0]);   // codice voce legato alla ComboBox.Text(VoSecPart)
  if ((StrToInt(tbDBpiancont[i,0]) div 1000*1000) = coVoSeCor) then
  begin
//    coVoceEdt:=EditaCoVoce.EdtCoVo(coVoSeCor);
    coVoceEdt:= utilmie.EdtCoVo(coVoSeCor);
    CoVoSecPart.Text:=coVoceEdt;
    i:= utilmie.DisEdtCoVo(coVoceEdt);
  end;
  VoSotCtoPart.Items.Clear;
  tEl:= Length(tbDBpiancont);
  indSotCto1:= 0;    // Indice di tbDBpiancont per la 1.a voce di sottoconto, subordinata a quella corrente
  indSotCto9:= 0;    // Indice di tbDBpiancont per l'ultima voce di sottoconto, subordinata a quella corrente
{  writeln();
  writeln('tEl= ', tEl);}
  i:= i + 1;
  while not swFine do
  begin
    if (i = 879) then
    begin
{      writeln();
      writeln('i= ', i);}
      write();
    end;
    if ((StrToInt(tbDBpiancont[i,0])) >= (coVoSeCor + 1)) and
        ((StrToInt(tbDBpiancont[i,0])) <= (coVoSeCor + 999)) then
    begin
    {-----------------------------------------------------------------------------------------------}
      VoSotCtoPart.Items.Add(tbDBpiancont[i,1]);
      indSotCto9:= i;
      if (indSotCto1 = 0) then
        indSotCto1:= i;
{      writeln('tbDBpiancont[', i,', ', 1,', ',0, ']= ', tbDBpiancont[i,1], ', ', tbDBpiancont[i,0]);}
      i:= i +1;
    end else
      if ((StrToInt(tbDBpiancont[i,0])) > (coVoSeCor + 999)) then
        swFine:= True;
    {-----------------------------------------------------------------------------------------------}
    if (i >= tEl) then
      swFine:= True;
  end;
end;

procedure TForm1.VoSotCtoPartSelect(Sender: TObject);
  var
    i: integer;
    coVoce: Integer;  // Codice voce secondaria corrente
    risult: integer;
    coVoceEdt: string;
  begin
{    writeln();
    writeln('proc.TForm1.VoSecPartSelect');}
    i:= indSotCto1;
    while (VoSotCtoPart.Text <> tbDBpiancont[i,1]) do
    begin
      if (i < indSotCto9) then
        i:= i + 1;
    end;
    coVoce:= StrToInt(tbDBpiancont[i,0]);   // codice voce legato alla ComboBox.Text(VoSecPart)
{    if (StrToInt(tbDBpiancont[i,0]) = coVoce) then
    begin}
      coVoceEdt:=EditaCoVoce.EdtCoVo(coVoce);
      CoVoSotCtoPart.Text:=coVoceEdt;
      MovDest.Enabled:= True;
      VoMasArri.Items.Add(VoMasPart.Text );
//    end;

end;

end.

mentre il file delle utility "utilmie.pas" contiene:
Codice: [Seleziona]
unit utilmie;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;
type
  striEdt = String;
  coVoce9 = Integer;

  var
    striEdit: striEdt;
    coVoce: coVoce9;

function EdtCoVo(coVoceNum: Integer): striEdt;
function DisEdtCoVo(coVoEdt: String):coVoce9;

implementation

function EdtCoVo(coVoceNum:integer):String;
var
  i: Integer= 0;
  coVoceStr: String;
  crt: char;
//  striEdit: string;
begin
  SetLength (coVoceStr, 9);
  coVoceStr:=IntToStr(coVoceNum);
  for i:= 1 to 9 do
  begin
    crt := coVoceStr[i];
    striEdit:= striEdit + crt;
    case i of
        1,3,6:
          striEdit:= striEdit + '.';
    end;
  end;
  WriteLn('striEdit= ', striEdit);
  Result:= striEdit;
end;
function DisEdtCoVo(coVoEdt:String):integer;
var
  i: Integer= 0;
  crt: char;
  striMia: string = '';
begin
  WriteLn();
  WriteLn('function utilvarie.DisEdtCoVo');
  SetLength (coVoEdt, 9);
  for i:= 1 to 9 do
  begin
    crt := coVoEdt[i];
    if (crt <> '.') then
      striMia:= striMia + crt;
  end;
  coVoce:= StrToInt(striMia);
  WriteLn();
  WriteLn('coVoce= |', coVoce, '|');
  Result:= coVoce;
end;
end.

Con Esegui, la compilazione termina con successo, ma il progetto, pur risultando avviato, non apre nemmeno la Form iniziale.
Ma perchè, se la compilazione è terminata senza errori?



Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: Stilgar - Aprile 27, 2020, 05:45:55 pm
Ciao
cofamtrasflpi[/size].[/size]lpr
[/size]cosa contiene?
[/size]
[/size]Stilgar
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 27, 2020, 06:01:19 pm
cofamtrasflpi[/size].[/size]lpr
[/size]cosa contiene?
[/size]
[/size]Stilgar
Ecco:
Codice: [Seleziona]
program cofamtrasflpi;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, utilmie;

{$R *.res}

begin
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  Application.Run;
end.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: Stilgar - Aprile 27, 2020, 06:07:34 pm
Dall'ide, avvisa il compilatore che deve mettere la form in "autocreazione". :)
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 27, 2020, 07:01:36 pm
Dall'ide, avvisa il compilatore che deve mettere la form in "autocreazione". :)
?.....?
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: Stilgar - Aprile 27, 2020, 11:50:40 pm
Ti allego 2 immagini, così controlli le opzioni di progetto.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 28, 2020, 09:52:32 am
Sembra facile, ma non è.
Io avevo già visto entrambe le funzioni ma proprio in:
progetto -> Opzioni progetto -> Form, non ho trovato elencata alcuna Form e non posso neanche scriverci dentro.
Nell'allegato puoi vedere come si presenta detta ultima finestra.

E poi non capisco perchè prima dell'aggiunta della 2.a funzione nella Unit "utilmie", la Form veniva avviata automaticamente ed ora non più. Personalmente non ricordo di avere modificato parametri.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 28, 2020, 10:52:32 am
Un'altra constatazione. Nella finestra Analizzatore progetti manca elencata la unit CoFamTrasf (Unit1)
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: Stilgar - Aprile 28, 2020, 02:06:30 pm
Apri il file con la tua form e premi alt+F11, così verrà inserita nel progetto dall'ide, senza perder ulteriormente i sentimenti :)

Stilgar
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 28, 2020, 04:41:49 pm
Non so se ho capito. Da Ide ho eseguito:
File -> Apri -> cofamtrasf.lfm
Quindi, col file aperto in editor -> alt+F11
Ebbene, si è espansa la finestra alla dimensione massima, ma la scheda Form di Opzioni progetto è rimasta vuota e l'avvio continua a non funzionare.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: Stilgar - Aprile 28, 2020, 06:59:14 pm
il punto pas ....scusa l'imprecisione
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 28, 2020, 07:28:00 pm
il punto pas ....scusa l'imprecisione
Mi dispisace Stilgar, ma io continuo a non capire:

Dall'IDE, dopo aver chiuso tutti i file, ho aperto soltanto il file cofamtrasf.pas.
Ora dovrei premere alt+F11, ma non ho capito in quale finestra, perchè se lo faccio col cursore puntato in un punto qualsiasi della finestra EditorSorgente.cofamtrasf.pas, l'unica cosa che cambia è la dimensione della finestra.

Lo so, ti faccio perdere tempo, ma conosco  pochissimo sia Lazarus che Pascal.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 28, 2020, 11:02:53 pm
Ho cercato di capire a che cosa corrisponde la scorciatoia Alt+F11 ed ho trovato la funzione dell'IDE dentro
Menu -> Sorgente -> Aggiungi la unit alla sezione Uses.
Si è aperta una finestra contente una Frame (Inserire nella sezione Uses di) con 2 RadioButton (Interface / Implementation)
Ho provato a scrivere nella casella in alto "cofamtrasf", attivando alternativamente sia l'uno che l'altro RadioButton, ma senza riuscire nell'intento. Ho provato anche scrivendo "unit", ma invano.
Più di ciò non riesco ad immaginare nel mio modesto ragionamento.

Però non riesco a collegare il suddetto Inserire nella sezione Uses con l'assenza del form fra quelli creabili automaticamente o, quanto meno, disponibili nella finestra delle opzioni per il progetto cofatrasfpi -> Form
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: petrusic - Aprile 29, 2020, 10:17:19 am
Allora, stamani ho girovagato sulle scorciatoie da tastiera, provando diverse funzionalità, allo scopo di prendere confidenza con l'IDE. Ad un certo punto mi sono imbattuto in una finestra che mi chiedeva di generare automaticamente la creazione della Form. Ho confermato e, andando avanti, ho visto che in: Progetto -> Opzioni Progetto -> Form è comparso il riferimento a Form1 nella ListBox Creazione Automatica Form.
Ho avviato la compilazione del progetto che, però, si è fermata con un messaggio d'errore.
Preferisco a questo punto non andare avanti, sicuro che, sottoponendovi, in allegato, l'immagine complessiva della schermata, troverete gli strumenti per darmi la giusta dritta onde superare finalmente il penoso stallo in cui sono finito.
Titolo: Re:[Risolto] creare un pacchetto utility
Inserito da: bonmario - Aprile 29, 2020, 10:38:18 am
Ciao,
ho provato a rileggere tutto il thread dall'inizio, ed onestamente non riesco proprio a capire cosa ti è succsso, e cosa stai cercando di fare ...

Se per te non è un problema, potresti zippare e postare l'intero progetto e la unit "separata"?

Magari così sarà più semplice capire in che situazione sei, e come aiutarti !!

Ciao, Mario