Finally the whole project code:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls; //Definition of Employee type (Record) : Here we define TEmployee type of a generic Employee type pEmployee = ^TEmployee; //Define a poiner of TEmployee //int* x in c++ TEmployee = Record Id : integer; Name : string; Surname : string; end; //End of employee type type { TForm1 } TForm1 = class(TForm) ButtonAdd: TButton; ButtonModify: TButton; ButtonDelete: TButton; ButtonShow: TButton; EditNameNew: TEdit; EditSurnameNew: TEdit; EditIdModify: TEdit; EditNameModify: TEdit; EditSurnameModify: TEdit; EditIdDelete: TEdit; GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; LabelNameDelete: TLabel; LabelSurnameDelete: TLabel; Memo: TMemo; procedure ButtonAddClick(Sender: TObject); procedure ButtonDeleteClick(Sender: TObject); procedure ButtonModifyClick(Sender: TObject); procedure ButtonShowClick(Sender: TObject); procedure EditIdDeleteChange(Sender: TObject); procedure EditIdModifyChange(Sender: TObject); private { private declarations } EmployeeArray : Array of TEmployee; //DYNAMIC Array of elements type Employees (TEmployee) Array starts from a[0], a[1] etc ... function findNumberOfEmployees(): integer; function findNextFreeId(): integer; procedure addEmployee(pEmp:pEmployee); procedure modifyEmployee(id:integer; pEmpnew:pEmployee); procedure deleteEmployee(id:integer); function getEmployee(id:integer): pEmployee; //get the pointer of an employee function printEmployeeWithId(id:integer): string; function printEmployeeWithIndex(index:integer): string; public { public declarations } end; var Form1: TForm1; implementation { TForm1 } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ////////////////////////PRIVATE FUNCTIONS//////////////////////////////////// function TForm1.findNumberOfEmployees(): integer; begin result := Length(self.EmployeeArray); end; function TForm1.findNextFreeId(): integer; var imax :integer; begin imax:=self.findNumberOfEmployees-1; //arrays start from a[0] etc... if imax <> -1 then result := self.EmployeeArray[imax].Id +1 else result := 1; end; procedure TForm1.addEmployee(pEmp:pEmployee); //I add employees on the end of EmployeeArray ONLY var imax :integer; begin imax:=self.findNumberOfEmployees; SetLength(self.EmployeeArray, imax+1); self.EmployeeArray[imax] := pEmp^; //copia by value non per puntatore //starts from a[0] end; procedure TForm1.modifyEmployee(id:integer; pEmpnew:pEmployee); var i,imax :integer; begin imax:=self.findNumberOfEmployees-1;//arrays start from a[0] etc... for i:=0 to imax do begin if self.EmployeeArray[i].id = id then begin self.EmployeeArray[i]:=pEmpnew^; //copy by value //starts from a[0] break; end; end; end; procedure TForm1.deleteEmployee(id:integer); var i,k,imax,deletepoint :integer; begin imax:=self.findNumberOfEmployees-1; deletepoint:=0; for i:=0 to imax do begin if self.EmployeeArray[i].id = id then begin deletepoint:=i; if deletepoint < imax then begin for k:=deletepoint+1 to imax do begin self.EmployeeArray[k-1]:=self.EmployeeArray[k]; end; SetLength(self.EmployeeArray, imax); end else begin //deletepoint = imax SetLength(self.EmployeeArray, imax); end; break; end; end; end; function TForm1.getEmployee(id:integer): pEmployee; var i,imax :integer; begin result:=nil; imax:=self.findNumberOfEmployees-1; for i:=0 to imax do begin if self.EmployeeArray[i].id = id then begin result:= @self.EmployeeArray[i]; break; end; end; end; function TForm1.printEmployeeWithId(id:integer): string; var i,imax :integer; begin imax:=self.findNumberOfEmployees-1; for i:=0 to imax do begin if self.EmployeeArray[i].id = id then begin result:= 'Id : ' + inttostr((self.EmployeeArray[i]).Id) + '; Name : ' + self.EmployeeArray[i].Name + '; Surname : ' + self.EmployeeArray[i].Surname; break; end; end; end; function TForm1.printEmployeeWithIndex(index:integer): string; begin result:= 'Id : ' + inttostr((self.EmployeeArray[index]).Id) + '; Name : ' + self.EmployeeArray[index].Name + '; Surname : ' + self.EmployeeArray[index].Surname; end; ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ///////////////////////////EVENTS///////////////////////////////////////////// //add employee event procedure TForm1.ButtonAddClick(Sender: TObject); var tempEmployee:TEmployee; begin //create a new temp employee tempEmployee.Id := self.findNextFreeId; tempEmployee.Name := EditNameNew.Text; tempEmployee.Surname := EditSurnameNew.Text; self.addEmployee(@tempEmployee); showmessage('Employee with this info : ' + self.printEmployeeWithId(tempEmployee.Id) + ' added into array.'); end; //modify employe event procedure TForm1.ButtonModifyClick(Sender: TObject); var tempEmployee:TEmployee; begin tempEmployee.Id := strtoint(EditIdModify.Text); tempEmployee.Name := EditNameModify.Text; tempEmployee.Surname := EditSurnameModify.Text; self.modifyEmployee(tempEmployee.Id,@tempEmployee); showmessage('Employee with this info : ' + self.printEmployeeWithId(tempEmployee.Id) + ' modifided.'); end; //delete employee event procedure TForm1.ButtonDeleteClick(Sender: TObject); begin self.deleteEmployee(strtoint(EditIdDelete.Text)) ; showmessage('Employee deleted'); end; //Show all employees event procedure TForm1.ButtonShowClick(Sender: TObject); var i,imax:integer; begin memo.Clear; imax:=self.findNumberOfEmployees-1; for i:=0 to imax do begin Memo.Lines.Add(self.printEmployeeWithIndex(i)); end; end; //on modify change procedure TForm1.EditIdModifyChange(Sender: TObject); var pTempEmployee : pEmployee; begin pTempEmployee := getEmployee(strtoint(EditIdModify.Text)); if pTempEmployee <> nil then begin EditNameModify.text := pTempEmployee^.Name; EditSurnameModify.text := pTempEmployee^.Surname; ButtonModify.Enabled := true; end else begin EditNameModify.text := 'N/A'; EditSurnameModify.text := 'N/A'; ButtonModify.Enabled := false; end; pTempEmployee:=nil; end; //on delete change procedure TForm1.EditIdDeleteChange(Sender: TObject); var pTempEmployee : pEmployee; begin pTempEmployee := getEmployee(strtoint(EditIdDelete.Text)); if pTempEmployee <> nil then begin LabelNameDelete.Caption := pTempEmployee^.Name; LabelSurnameDelete.Caption := pTempEmployee^.Surname; ButtonDelete.Enabled := true; end else begin LabelNameDelete.Caption := 'N/A'; LabelSurnameDelete.Caption := 'N/A'; ButtonDelete.Enabled := false; end; pTempEmployee:=nil; end; initialization {$I unit1.lrs} end.
That's all for now.
See you on next article!