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"?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.
Da quello che scrivi, credo che vada bene una unit.
Basta che la metti nella stessa cartella delle unit del singolo progetto e poi richiami la unit come fai sempre.
- da Progetto -> Opzioni Progetto -> Percorsi:
> Altri File Unit (-FU):
inserire il percorso che porta alla directory contenente la nuova Unit
Ovviamente, era solo per semplificargli la cosa visto che è all'inizioBasta 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'inizioGrazie xinyiman, però credo sia meglio che mi abitui sin da subito ad affrontare i procedimenti corretti, anche se è più facile cadere.
- da Progetto -> Opzioni Progetto -> Percorsi:Io di solito faccio solo questa.
> Altri File Unit (-FU):
inserire il percorso che porta alla directory contenente la nuova Unit
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.
<RequiredPackages Count="1">
<Item1>
<PackageName Value="il_fantasmagorico_pacchetto_di_petrusic"/>
</Item1>
</RequiredPackages>
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 ---
cofamtrasf.pas(199,30)Error: identifier not found "EdtCoVo"
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.
--- bla --- bla ---questa?
coVoceEdt:=EditaCoVoce.EdtCoVo(coVoSeCor);
--- bla --- bla ---
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;
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 ---
petrus@petrus-pc /media/dirdati/dativari/lazarus_progetti/Lazarus_progetti_miei/
util_mie $ ls
EditaCoVoce.pas backup utilmie.lpk
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
Ma dentroEditaCoVoce cosa c'è?
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.
interface
....
function EdtCoVo(coVoce:integer):String;
....
implementation
...
function EdtCoVo(coVoce:integer):String;
.....
.
├── 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
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.
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.
cofamtrasflpi[/size].[/size]lprEcco:
[/size]cosa contiene?
[/size]
[/size]Stilgar
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.
Dall'ide, avvisa il compilatore che deve mettere la form in "autocreazione". :)?.....?
il punto pas ....scusa l'imprecisioneMi dispisace Stilgar, ma io continuo a non capire: