Advertisement
Matixs

Untitled

May 31st, 2023
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 26.51 KB | None | 0 0
  1. unit Party;
  2.  
  3. interface
  4.  
  5. Type
  6.     TRecordParty = Record
  7.         RIdParty : Integer;
  8.         RName : String[255];
  9.         RPoliticalPosition : String[255];
  10.     End;
  11.  
  12.     TParty = Class
  13.         IdParty : Integer;
  14.         Name : String[255];
  15.         PoliticalPosition : String[255];
  16.  
  17.         public
  18.             Constructor Create(IdParty : Integer; Name : String; PoliticalPosition : String);
  19.             Function ConvertToRecord() : TRecordParty;
  20.             Class function ConvertToParty(TR : TRecordParty) : TParty;
  21.     End;
  22.  
  23. implementation
  24.  
  25. Constructor TParty.Create(IdParty : Integer; Name: string; PoliticalPosition: string);
  26. begin
  27.     Self.IdParty := IdParty;
  28.     Self.Name := Name;
  29.     Self.PoliticalPosition := PoliticalPosition;
  30. end;
  31.  
  32. Function TParty.ConvertToRecord: TRecordParty;
  33. var
  34.     ExemplarParty : TRecordParty;
  35. begin
  36.     with ExemplarParty do
  37.     begin
  38.         RIdParty := Self.IdParty;
  39.         RName := Self.Name;
  40.         RPoliticalPosition := Self.PoliticalPosition;
  41.         ConvertToRecord := ExemplarParty;
  42.     end;
  43. end;
  44.  
  45. Class function TParty.ConvertToParty(TR: TRecordParty): TParty;
  46. begin
  47.     with TR do
  48.         ConvertToParty := TParty.Create(RIdParty, RName, RPoliticalPosition);
  49. end;
  50.  
  51. end.
  52.  
  53. unit CountyNumber;
  54.  
  55. interface
  56.  
  57. Type
  58.  
  59.     TRecordCountyNumber = Record
  60.         RIdCountyNumber : Integer;
  61.         RNumber : Integer;
  62.         RName : String[255];
  63.         RRegion : String[255];
  64.     End;
  65.  
  66.     TCountyNumber = Class
  67.         IdCountyNumber : Integer;
  68.         Number : Integer;
  69.         Name : String[255];
  70.         Region : String[255];
  71.  
  72.         public
  73.             Constructor Create(IdCountyNumber, Number : Integer; Name, Region : String);
  74.             Function ConvertToRecord() : TRecordCountyNumber;
  75.             Class function ConvertToCountyNumber(TR : TRecordCountyNumber) : TCountyNumber;
  76.     End;
  77.  
  78. implementation
  79.  
  80. Constructor TCountyNumber.Create(IdCountyNumber: Integer; Number: Integer; Name: string; Region: string);
  81. begin
  82.     Self.IdCountyNumber := IdCountyNumber;
  83.     Self.Number := Number;
  84.     Self.Name := Name;
  85.     Self.Region := Region;
  86. end;
  87.  
  88. Function TCountyNumber.ConvertToRecord: TRecordCountyNumber;
  89. var
  90.     ExemplarRCountyNumber : TRecordCountyNumber;
  91. begin
  92.     with ExemplarRCountyNumber do
  93.     begin
  94.         RIdCountyNumber := Self.IdCountyNumber;
  95.         RNumber := Self.Number;
  96.         RName := Self.Name;
  97.         RRegion := Self.Region;
  98.         ConvertToRecord := ExemplarRCountyNumber;
  99.     end;
  100. end;
  101.  
  102. Class function TCountyNumber.ConvertToCountyNumber(TR: TRecordCountyNumber): TCountyNumber;
  103. begin
  104.     with TR do
  105.         ConvertToCountyNumber := TCountyNumber.Create(RIdCountyNumber, RNumber, RName, RRegion);
  106. end;
  107.  
  108. end.
  109.  
  110. unit Candidate;
  111.  
  112. interface
  113.  
  114. Type
  115.     TRecordCandidate = Record
  116.         RIdCandidate : Integer;
  117.         RFullname : String[100];
  118.         RPartyId : Integer;
  119.         RCountyNumberId : Integer;
  120.         RAge : Integer;
  121.         RProfession : String[255];
  122.     End;
  123.  
  124.     TCandidate = class
  125.         IdCandidate : Integer;
  126.         Fullname : String[100];
  127.         PartyId : Integer;
  128.         CountyNumberId : Integer;
  129.         Age : Integer;
  130.         Profession : String[255];
  131.  
  132.         public
  133.             Constructor Create(IdCandidate : Integer; Fullname : String;
  134.                                PartyId, CountyNumberId, Age : Integer; Profession : String);
  135.             Function ConvertToRecord() : TRecordCandidate;
  136.             Class function ConvertToCandidate(TRCandidate : TRecordCandidate) : TCandidate;
  137.  
  138.     end;
  139.  
  140. implementation
  141.  
  142. Constructor TCandidate.Create(IdCandidate: Integer; Fullname: string;
  143.                               PartyId: Integer; CountyNumberId : Integer; Age: Integer; Profession: string);
  144. begin
  145.     Self.IdCandidate := IdCandidate;
  146.     Self.Fullname := Fullname;
  147.     Self.PartyId := PartyId;
  148.     Self.CountyNumberId := CountyNumberId;
  149.     Self.Age := Age;
  150.     Self.Profession := Profession;
  151. end;
  152.  
  153. Function TCandidate.ConvertToRecord: TRecordCandidate;
  154. var
  155.     ExemplarCandidate : TRecordCandidate;
  156. begin
  157.     ExemplarCandidate.RIdCandidate := Self.IdCandidate;
  158.     ExemplarCandidate.RFullname := Self.Fullname;
  159.     ExemplarCandidate.RPartyId := Self.PartyId;
  160.     ExemplarCandidate.RCountyNumberId := Self.CountyNumberId;
  161.     ExemplarCandidate.RAge := Self.Age;
  162.     ExemplarCandidate.RProfession := Self.Profession;
  163.     ConvertToRecord := ExemplarCandidate;
  164. end;
  165.  
  166. Class function TCandidate.ConvertToCandidate(TRCandidate: TRecordCandidate): TCandidate;
  167. begin
  168.     With TRCandidate do
  169.         ConvertToCandidate := TCandidate.Create(RIdCandidate, RFullname, RPartyId, RCountyNumberId, RAge, RProfession);
  170. end;
  171.  
  172. end.
  173.  
  174. unit BidirectionalParty;
  175.  
  176. interface
  177.  
  178. uses SysUtils, Party;
  179.  
  180. Type
  181.     PPartyList = ^TNode;
  182.  
  183.     TNode = Record
  184.         Party : TParty;
  185.         Next : PPartyList;
  186.         Prev : PPartyList;
  187.     End;
  188.  
  189.     TPartyList = Class
  190.         Head : PPartyList;
  191.         Tail : PPartyList;
  192.         Count : Integer;
  193.  
  194.         public
  195.             Constructor Create();
  196.             Destructor Destroy; override;
  197.  
  198.             Procedure AddNewParty(Party : TParty);
  199.             Procedure DeleteParty(NodeToDel : PPartyList);
  200.             Procedure DeletePartyByID(PartyID : Integer);
  201.             Procedure SavePartyList(FilePath : String);
  202.             Procedure EditParty(Party : TParty);
  203.  
  204.             Class Function GetPartyListFromFile(FilePath: string): TPartyList;
  205.             Class Function GetLastPrimaryKey(const TempList : TPartyList) : Integer;
  206.             Class Function GetPartyPrimaryKeyByName(const TempList : TPartyList; Name : String) : Integer;
  207.             Class Function GetPartyNameByPK(const TempList : TPartyList; Key : Integer) : String;
  208.     End;
  209.  
  210. implementation
  211.  
  212. Constructor TPartyList.Create;
  213. begin
  214.     Self.Head := NIL;
  215.     Self.Tail := NIL;
  216.     Count := 0;
  217. end;
  218.  
  219. Destructor TPartyList.Destroy;
  220. var
  221.     Temp : PPartyList;
  222. begin
  223.     Self.Tail := NIL;
  224.     while Self.Head <> NIL do
  225.     begin
  226.         Temp := Head;
  227.         Head := Head^.Next;
  228.         FreeMem(Temp, SizeOf(TPartyList));
  229.     end;
  230.     inherited;
  231. end;
  232.  
  233. Procedure TPartyList.AddNewParty(Party: TParty);
  234. var
  235.     NewParty : PPartyList;
  236. begin
  237.     if Party = NIL then
  238.         Exit;
  239.  
  240.     New(NewParty);
  241.     NewParty^.Next := NIL;
  242.     NewParty^.Prev := NIL;
  243.     NewParty^.Party := Party;
  244.  
  245.     if Head = NIL then
  246.     begin
  247.         Head := NewParty;
  248.         Tail := NewParty;
  249.     end
  250.     else
  251.     begin
  252.         Tail^.Next := NewParty;
  253.         NewParty^.Prev := Tail;
  254.         Tail := NewParty;
  255.     end;
  256.  
  257.     Inc(Count);
  258. end;
  259.  
  260. Procedure TPartyList.DeleteParty(NodeToDel: PPartyList);
  261. Var
  262.     Temp : PPartyList;
  263. Begin
  264.     if (Head = NIL) AND (NodeToDel = NIL) then
  265.         Exit;
  266.  
  267.     if NodeToDel = Head then
  268.     begin
  269.         Head := NodeToDel^.Next;
  270.         if Head <> NIL then
  271.         begin
  272.             Head^.Prev := NIL;
  273.         End
  274.         else
  275.         begin
  276.             Tail := NIL;
  277.         end;
  278.  
  279.         Dispose(NodeToDel);
  280.     end
  281.     else
  282.         if NodeToDel = Tail then
  283.         begin
  284.             Tail := Tail^.Prev;
  285.             if Tail <> NIL then
  286.             begin
  287.                 Tail^.Next := NIL;
  288.             end
  289.             else
  290.             begin
  291.                 Head := NIL;
  292.             end;
  293.  
  294.             Dispose(NodeToDel);
  295.         end
  296.         else
  297.         begin
  298.             Temp := Head;
  299.             while Temp^.Next <> NodeToDel do
  300.             begin
  301.                 Temp := Temp^.Next;
  302.             end;
  303.             Temp^.Next := NodeToDel^.Next;
  304.             if NodeToDel^.Next <> NIL then
  305.             begin
  306.                 NodeToDel^.Next^.Prev := Temp;
  307.             end;
  308.             Dispose(NodeToDel);
  309.         end;
  310.  
  311.         Dec(Count);
  312. end;
  313.  
  314. Procedure TPartyList.DeletePartyByID(PartyID: Integer);
  315. Var
  316.     I : Integer;
  317.     Temp : PPartyList;
  318. Begin
  319.  
  320.     if Head = NIL then
  321.     begin
  322.         Exit;
  323.     end;
  324.  
  325.     Temp := Self.Head;
  326.     I := Temp.Party.IdParty;
  327.  
  328.     while (Temp <> NIL) AND (I <> PartyID) do
  329.     begin
  330.         Temp := Temp^.Next;
  331.         Inc(I);
  332.     end;
  333.  
  334.  
  335.     if Temp = NIL then
  336.     begin
  337.         // В списке не было найдено элемента
  338.         Exit;
  339.     end;
  340.  
  341.     DeleteParty(Temp);
  342. end;
  343.  
  344.  
  345. Procedure TPartyList.SavePartyList(FilePath: string);
  346. var
  347.     FilePartyList : File of TRecordParty;
  348.     TempList : PPartyList;
  349.     TempParty : TRecordParty;
  350. Begin
  351.     TempList := Self.Head;
  352.     AssignFile(FilePartyList, FilePath);
  353.     Rewrite(FilePartyList);
  354.     while TempList <> NIL do
  355.     begin
  356.         TempParty := TempList^.Party.ConvertToRecord();
  357.         Write(FilePartyList, TempParty);
  358.         TempList := TempList^.Next;
  359.     end;
  360.  
  361.     Dispose(TempList);
  362.     CloseFile(FilePartyList);
  363. End;
  364.  
  365. Procedure TPartyList.EditParty(Party: TParty);
  366. var
  367.     TempList : PPartyList;
  368. begin
  369.     TempList := Self.Head;
  370.  
  371.     while TempList <> NIL do
  372.     begin
  373.         if TempList.Party.IdParty = Party.IdParty then
  374.         begin
  375.             TempList.Party := Party;
  376.             break;
  377.         end;
  378.         TempList := TempList^.Next;
  379.     end;
  380. end;
  381.  
  382. Class function TPartyList.GetPartyListFromFile(FilePath: string): TPartyList;
  383. Var
  384.     F: File of TRecordParty;
  385.     TempRecord:TRecordParty;
  386.     TempParty: TParty;
  387.     List: TPartyList;
  388. Begin
  389.     List := TPartyList.Create; // create an instance of the class
  390.     AssignFile(F, FilePath);
  391.     try
  392.         If (Not(FileExists(FilePath))) then
  393.         begin
  394.             Rewrite(F); // create a new file
  395.         end
  396.         else
  397.         begin
  398.             Reset(F); // open existed file
  399.         end;
  400.         if FileSize(F) <> 0 then
  401.         begin
  402.             while (not Eof(F)) do
  403.             Begin
  404.                 Read(F, TempRecord);
  405.                 TempParty := TParty.ConvertToParty(TempRecord);
  406.                 List.AddNewParty(TempParty);
  407.             End;
  408.         end;
  409.     finally
  410.         CloseFile(F);
  411.         Result := List;
  412.     end;
  413. End;
  414.  
  415. Class Function TPartyList.GetLastPrimaryKey(const TempList : TPartyList): Integer;
  416. var
  417.     Key : Integer;
  418.     TempHead : PPartyList;
  419. begin
  420.     Key := -1;
  421.  
  422.     TempHead := TempList.Head;
  423.  
  424.     while TempHead <> NIL do
  425.     begin
  426.         if TempHead^.Party.IdParty > Key then
  427.             Key := TempHead^.Party.IdParty;
  428.         TempHead := TempHead^.Next;
  429.     end;
  430.  
  431.     GetLastPrimaryKey := Key;
  432. end;
  433.  
  434. Class function TPartyList.GetPartyPrimaryKeyByName(const TempList : TPartyList; Name: string): Integer;
  435. var
  436.     PK : Integer;
  437.     TempHead : PPartyList;
  438. begin
  439.     PK := 0;
  440.  
  441.     TempHead := TempList.Head;
  442.  
  443.     while TempHead <> NIL do
  444.     begin
  445.         if TempHead^.Party.Name = Name then
  446.             PK := TempHead^.Party.IdParty;
  447.         TempHead := TempHead^.Next;
  448.     end;
  449.     GetPartyPrimaryKeyByName := PK;
  450. end;
  451.  
  452. Class function TPartyList.GetPartyNameByPK(const TempList: TPartyList; Key : Integer): string;
  453. var
  454.     TempHead : PPartyList;
  455. begin
  456.     TempHead := TempList.Head;
  457.  
  458.     GetPartyNameByPK := '';
  459.  
  460.     while TempHead <> NIL do
  461.     begin
  462.  
  463.         if TempHead^.Party.IdParty = Key then
  464.             GetPartyNameByPK := TempHead^.Party.Name;
  465.  
  466.         TempHead := TempHead^.Next;
  467.     end;
  468.  
  469. end;
  470.  
  471. end.
  472.  
  473. unit BidirectionalCountyNumber;
  474.  
  475. interface
  476.  
  477. uses SysUtils, CountyNumber;
  478.  
  479. Type
  480.     PCountyNumberList = ^TNode;
  481.  
  482.     TNode = record
  483.         CountyNumber : TCountyNumber;
  484.         Next : PCountyNumberList;
  485.         Prev : PCountyNumberList;
  486.     end;
  487.  
  488.  
  489.     TCountyNumberList = class
  490.         Head : PCountyNumberList;
  491.         Tail : PCountyNumberList;
  492.         Count : Integer;
  493.  
  494.         public
  495.             Constructor Create();
  496.             Destructor Destroy; override;
  497.  
  498.             Procedure AddNewCountyNumber(CountyNumber : TCountyNumber);
  499.             Procedure DeleteCountyNumber(NodeToDel : PCountyNumberList);
  500.             Procedure DeleteCountyNumberByID (CountyNumberId : Integer);
  501.             Procedure SaveCountyNumberList(FilePath: string);
  502.             Procedure EditCountyNumber(CountyNumber : TCountyNumber);
  503.  
  504.             Class Function GetCountyNumberListFromFile(FilePath: string): TCountyNumberList;
  505.             Class Function GetLastPrimaryKey(const TempList : TCountyNumberList) : Integer;
  506.             Class Function GetCountyNumberByPK(const TempList : TCountyNumberList; Key : Integer) : Integer;
  507.             Class Function GetGetCountyNumberPrimaryKeyByNumber(const TempList : TCountyNumberList; Number : Integer) : Integer;
  508.     end;
  509.  
  510. implementation
  511.  
  512.  
  513. Destructor TCountyNumberList.Destroy;
  514. var
  515.     Temp : PCountyNumberList;
  516. begin
  517.     Self.Tail := NIL;
  518.     while Self.Head <> NIL do
  519.     begin
  520.         Temp := Head;
  521.         Head := Head^.Next;
  522.         FreeMem(Temp, SizeOf(TCountyNumberList));
  523.     end;
  524.     inherited;
  525. end;
  526.  
  527. Constructor TCountyNumberList.Create;
  528. begin
  529.     Self.Head := NIL;
  530.     Self.Tail := NIL;
  531.     Count := 0;
  532. end;
  533.  
  534. Procedure TCountyNumberList.AddNewCountyNumber(CountyNumber: TCountyNumber);
  535. var
  536.     NewCountyNumber : PCountyNumberList;
  537. begin
  538.     if CountyNumber = NIL then
  539.         Exit;
  540.  
  541.     New(NewCountyNumber);
  542.     NewCountyNumber^.Next := NIL;
  543.     NewCountyNumber^.Prev := NIL;
  544.     NewCountyNumber^.CountyNumber := CountyNumber;
  545.  
  546.     if Head = NIL then
  547.     begin
  548.         Head := NewCountyNumber;
  549.         Tail := NewCountyNumber;
  550.     end
  551.     else
  552.     begin
  553.         Tail^.Next := NewCountyNumber;
  554.         NewCountyNumber^.Prev := Tail;
  555.         Tail := NewCountyNumber;
  556.     end;
  557.  
  558.     Inc(Count);
  559. end;
  560.  
  561. Procedure TCountyNumberList.DeleteCountyNumber(NodeToDel: PCountyNumberList);
  562. Var
  563.     Temp : PCountyNumberList;
  564. Begin
  565.     if (Head = NIL) AND (NodeToDel = NIL) then
  566.         Exit;
  567.  
  568.     if NodeToDel = Head then
  569.     begin
  570.         Head := NodeToDel^.Next;
  571.         if Head <> NIL then
  572.         begin
  573.             Head^.Prev := NIL;
  574.         End
  575.         else
  576.         begin
  577.             Tail := NIL;
  578.         end;
  579.  
  580.         Dispose(NodeToDel);
  581.     end
  582.     else
  583.         if NodeToDel = Tail then
  584.         begin
  585.             Tail := Tail^.Prev;
  586.             if Tail <> NIL then
  587.             begin
  588.                 Tail^.Next := NIL;
  589.             end
  590.             else
  591.             begin
  592.                 Head := NIL;
  593.             end;
  594.  
  595.             Dispose(NodeToDel);
  596.         end
  597.         else
  598.         begin
  599.             Temp := Head;
  600.             while Temp^.Next <> NodeToDel do
  601.             begin
  602.                 Temp := Temp^.Next;
  603.             end;
  604.             Temp^.Next := NodeToDel^.Next;
  605.             if NodeToDel^.Next <> NIL then
  606.             begin
  607.                 NodeToDel^.Next^.Prev := Temp;
  608.             end;
  609.             Dispose(NodeToDel);
  610.         end;
  611.  
  612.         Dec(Count);
  613. end;
  614.  
  615. Procedure TCountyNumberLIst.DeleteCountyNumberByID(CountyNumberId: Integer);
  616. Var
  617.     I : Integer;
  618.     Temp : PCountyNumberList;
  619. Begin
  620.  
  621.     if Head = NIL then
  622.     begin
  623.         Exit;
  624.     end;
  625.  
  626.     Temp := Self.Head;
  627.     I := Temp.CountyNumber.IdCountyNumber;
  628.  
  629.     while (Temp <> NIL) AND (I <> CountyNumberID) do
  630.     begin
  631.         Temp := Temp^.Next;
  632.         Inc(I);
  633.     end;
  634.  
  635.  
  636.     if Temp = NIL then
  637.     begin
  638.         // В списке не было найдено элемента
  639.         Exit;
  640.     end;
  641.  
  642.     DeleteCountyNumber(Temp);
  643. end;
  644.  
  645. Procedure TCountyNumberList.SaveCountyNumberList(FilePath: string);
  646. var
  647.     FileCountyNumberList : File of TRecordCountyNumber;
  648.     TempList : PCountyNumberList;
  649.     TempCountyNumber : TRecordCountyNumber;
  650. Begin
  651.     TempList := Self.Head;
  652.     AssignFile(FileCountyNumberList, FilePath);
  653.     Rewrite(FileCountyNumberList);
  654.     while TempList <> NIL do
  655.     begin
  656.         TempCountyNumber := TempList^.CountyNumber.ConvertToRecord();
  657.         Write(FileCountyNumberList, TempCountyNumber);
  658.         TempList := TempList^.Next;
  659.     end;
  660.     CloseFile(FileCountyNumberList);
  661. End;
  662.  
  663. Procedure TCountyNumberList.EditCountyNumber(CountyNumber: TCountyNumber);
  664. var
  665.     TempList : PCountyNumberList;
  666. begin
  667.     TempList := Self.Head;
  668.  
  669.     while TempList <> NIL do
  670.     begin
  671.         if TempList.CountyNumber.IdCountyNumber = CountyNumber.IdCountyNumber then
  672.         begin
  673.             TempList.CountyNumber := CountyNumber;
  674.             break;
  675.         end;
  676.         TempList := TempList^.Next;
  677.     end;
  678. end;
  679.  
  680. Class function TCountyNumberList.GetCountyNumberListFromFile(FilePath: string): TCountyNumberList;
  681. Var
  682.     F: File of TRecordCountyNumber;
  683.     TempRecord:TRecordCountyNumber;
  684.     TempCountyNumber: TCountyNumber;
  685.     List: TCountyNumberList;
  686. Begin
  687.     List := TCountyNumberList.Create; // create an instance of the class
  688.     AssignFile(F, FilePath);
  689.     try
  690.         If (Not(FileExists(FilePath))) then
  691.         begin
  692.             Rewrite(F); // create a new file
  693.         end
  694.         else
  695.         begin
  696.             Reset(F); // open existed file
  697.         end;
  698.         if FileSize(F) <> 0 then
  699.         begin
  700.             while (not Eof(F)) do
  701.             Begin
  702.                 Read(F, TempRecord);
  703.                 TempCountyNumber := TCountyNumber.ConvertToCountyNumber(TempRecord);
  704.                 List.AddNewCountyNumber(TempCountyNumber);
  705.             End;
  706.         end;
  707.     finally
  708.         CloseFile(F);
  709.         Result := List;
  710.     end;
  711. End;
  712.  
  713. Class function TCountyNumberList.GetLastPrimaryKey(const TempList: TCountyNumberList): Integer;
  714. var
  715.     Key : Integer;
  716.     TempHead : PCountyNumberList;
  717. begin
  718.     Key := -1;
  719.  
  720.     TempHead := TempList.Head;
  721.  
  722.     while TempHead <> NIL do
  723.     begin
  724.         if TempHead^.CountyNumber.IdCountyNumber > Key then
  725.             Key := TempHead^.CountyNumber.IdCountyNumber;
  726.         TempHead := TempHead^.Next;
  727.     end;
  728.  
  729.     GetLastPrimaryKey := Key;
  730. end;
  731.  
  732. Class function TCountyNumberList.GetCountyNumberByPK(const TempList: TCountyNumberList; Key: Integer): Integer;
  733. var
  734.     TempHead : PCountyNumberList;
  735. begin
  736.     TempHead := TempList.Head;
  737.  
  738.     GetCountyNumberByPK := -1;
  739.  
  740.     while TempHead <> NIL do
  741.     begin
  742.  
  743.         if TempHead^.CountyNumber.IdCountyNumber = Key then
  744.             GetCountyNumberByPK := TempHead^.CountyNumber.Number;
  745.  
  746.         TempHead := TempHead^.Next;
  747.     end;
  748.  
  749. end;
  750.  
  751. Class function TCountyNumberList.GetGetCountyNumberPrimaryKeyByNumber(const TempList: TCountyNumberList; Number: Integer): Integer;
  752. var
  753.     PK : Integer;
  754.     TempHead : PCountyNumberList;
  755. begin
  756.     PK := 0;
  757.  
  758.     TempHead := TempList.Head;
  759.  
  760.     while TempHead <> NIL do
  761.     begin
  762.         if TempHead^.CountyNumber.Number = Number then
  763.             PK := TempHead^.CountyNumber.IdCountyNumber;
  764.         TempHead := TempHead^.Next;
  765.     end;
  766.  
  767.     GetGetCountyNumberPrimaryKeyByNumber := PK;
  768. end;
  769.  
  770. end.
  771.  
  772. unit BidirectionalCandidate;
  773.  
  774. interface
  775.  
  776. uses SysUtils, Party, Candidate;
  777.  
  778. Type
  779.  
  780.     PCandidateList = ^TNode;
  781.  
  782.     TNode = Record
  783.         Candidate : TCandidate;
  784.         Next : PCandidateList;
  785.         Prev : PCandidateList;
  786.     End;
  787.  
  788.     TCandidateList = Class
  789.         Head : PCandidateList;
  790.         Tail : PCandidateList;
  791.         Count : Integer;
  792.  
  793.         public
  794.             Constructor Create();
  795.             Destructor Destroy; override;
  796.  
  797.             Procedure AddNewCandidate(Candidate : TCandidate);
  798.             Procedure DeleteCandidate(NodeToDel : PCandidateList);
  799.             Procedure DeleteCandidateByID(CandidateID : Integer);
  800.             Procedure SaveCandidateList(FilePath : String);
  801.             Procedure EditCandidate(Candidate : TCandidate);
  802.  
  803.             Class Function GetCandidateListFromFile(FilePath: string): TCandidateList;
  804.             Class Function GetLastPrimaryKey(const TempList : TCandidateList) : Integer;
  805.     End;
  806.  
  807. implementation
  808.  
  809. Constructor TCandidateList.Create;
  810. begin
  811.     Self.Head := NIL;
  812.     Self.Tail := NIL;
  813.     Self.Count := 0;
  814. end;
  815.  
  816. Destructor TCandidateList.Destroy;
  817. var
  818.     TempNode : PCandidateList;
  819. begin
  820.     Self.Tail := NIL;
  821.     while Self.Head <> NIL do
  822.     begin
  823.         TempNode := Head;
  824.         Head := Head^.Next;
  825.         FreeMem(TempNode, SizeOf(TCandidateList));
  826.     end;
  827.     inherited;
  828. end;
  829.  
  830. Procedure TCandidateList.AddNewCandidate(Candidate: TCandidate);
  831. var
  832.     NewCandidate : PCandidateList;
  833. begin
  834.     if Candidate = NIL then // Если экземпляр кандидата не равен NIL
  835.         Exit;
  836.  
  837.     New(NewCandidate); // Выделение памяти для нового узла списка
  838.  
  839.     // Инициализация узла
  840.     NewCandidate^.Next := NIL;
  841.     NewCandidate^.Prev := NIL;
  842.     NewCandidate^.Candidate := Candidate;
  843.  
  844.     if Head = NIL then // Если голова списка = NIL
  845.     begin
  846.         Head := NewCandidate;
  847.         Tail := NewCandidate;
  848.     end
  849.     else // Если голова списка <> NIL
  850.     begin
  851.         Tail^.Next := NewCandidate;
  852.         NewCandidate^.Prev := Tail;
  853.         Tail := NewCandidate;
  854.     end;
  855.  
  856.     Inc(Count); // Инкрементирование счетчика записей в списке
  857. end;
  858.  
  859. Procedure TCandidateList.DeleteCandidate(NodeToDel: PCandidateList);
  860. Var
  861.     Temp : PCandidateList;
  862. Begin
  863.     // Если список пустой
  864.     if (Head = NIL) AND (NodeToDel = NIL) then
  865.         Exit;
  866.  
  867.     // Если узел к удалению = голове
  868.     if NodeToDel = Head then
  869.     begin
  870.         Head := NodeToDel^.Next; // Голове присвоить следующий узел
  871.  
  872.         // Если голова не пустая
  873.         if Head <> NIL then
  874.         begin
  875.             Head^.Prev := NIL;
  876.         End
  877.         else // Если голова пустая
  878.         begin
  879.             Tail := NIL;
  880.         end;
  881.  
  882.         // Уничтожение объекта
  883.         Dispose(NodeToDel);
  884.     end
  885.     else // Если узел к удалению = хвосту
  886.         if NodeToDel = Tail then
  887.         begin
  888.             // Присвоить хвосту предыдущий элемент
  889.             Tail := Tail^.Prev;
  890.             // Если хвост не пустой
  891.             if Tail <> NIL then
  892.             begin
  893.                 Tail^.Next := NIL;
  894.             end
  895.             else // Если хвост пустой
  896.             begin
  897.                 Head := NIL;
  898.             end;
  899.  
  900.             // Уничтожение объекта
  901.             Dispose(NodeToDel);
  902.         end
  903.         else // Если узел к удалению <> HEAD and TAIL
  904.         begin
  905.             Temp := Head;
  906.  
  907.             // Пока Next текущего узла <> узлу к удалению
  908.             while Temp^.Next <> NodeToDel do
  909.             begin
  910.                 Temp := Temp^.Next;
  911.             end;
  912.  
  913.             Temp^.Next := NodeToDel^.Next;
  914.  
  915.             // Если NEXT узла к удалению <> NIL
  916.             if NodeToDel^.Next <> NIL then
  917.             begin
  918.                 NodeToDel^.Next^.Prev := Temp;
  919.             end;
  920.  
  921.             // Уничтожение объекта
  922.             Dispose(NodeToDel);
  923.         end;
  924.  
  925.     // Уменьшить счетчик количества записей
  926.     Dec(Count);
  927. end;
  928.  
  929. Procedure TCandidateList.DeleteCandidateByID(CandidateID: Integer);
  930. Var
  931.     I : Integer;
  932.     Temp : PCandidateList;
  933. Begin
  934.  
  935.     if Head = NIL then
  936.     begin
  937.         Exit;
  938.     end;
  939.  
  940.     Temp := Self.Head;
  941.     I := Temp.Candidate.IdCandidate;
  942.  
  943.     while (Temp <> NIL) AND (I <> CandidateID) do
  944.     begin
  945.         Temp := Temp^.Next;
  946.         Inc(I);
  947.     end;
  948.  
  949.  
  950.     if Temp = NIL then
  951.     begin
  952.         // В списке не было найдено элемента
  953.         Exit;
  954.     end;
  955.  
  956.     DeleteCandidate(Temp);
  957. end;
  958.  
  959. Procedure TCandidateList.SaveCandidateList(FilePath: string);
  960. var
  961.     FileCandidateList : File of TRecordCandidate;
  962.     TempList : PCandidateList;
  963.     TempCandidate : TRecordCandidate;
  964. Begin
  965.     // Присвоить узлу ссылку на голову
  966.     TempList := Self.Head;
  967.     // Связка файла с путем к файлу
  968.     AssignFile(FileCandidateList, FilePath);
  969.     // Открытие файла для записи
  970.     Rewrite(FileCandidateList);
  971.     // Пока текущий узел не равен NIL
  972.     while TempList <> NIL do
  973.     begin
  974.         TempCandidate := TempList^.Candidate.ConvertToRecord();
  975.         // Запись текущего кандидата в файл
  976.         Write(FileCandidateList, TempCandidate);
  977.         // Переход к следующему узлу
  978.         TempList := TempList^.Next;
  979.     end;
  980.     // Закрытие файла
  981.     CloseFile(FileCandidateList);
  982. End;
  983.  
  984. Procedure TCandidateList.EditCandidate(Candidate: TCandidate);
  985. var
  986.     TempList : PCandidateList;
  987. begin
  988.     // Присвоить голову
  989.     TempList := Self.Head;
  990.  
  991.     // Пока текущий узел не равен NIL
  992.     while TempList <> NIL do
  993.     begin
  994.         // Если ID текущего кандидата равно ID переданному кандидату
  995.         if TempList.Candidate.IdCandidate = Candidate.IdCandidate then
  996.         begin
  997.             // Присвоить текущему узлу параметр переданного кандидата
  998.             TempList.Candidate := Candidate;
  999.             // Выйти из цикла
  1000.             break;
  1001.         end;
  1002.         // Перейти к следующему узлу
  1003.         TempList := TempList^.Next;
  1004.     end;
  1005. end;
  1006.  
  1007. Class function TCandidateList.GetCandidateListFromFile(FilePath: string): TCandidateList;
  1008. Var
  1009.     F: File of TRecordCandidate;
  1010.     TempRecord:TRecordCandidate;
  1011.     TempCandidate: TCandidate;
  1012.     List: TCandidateList;
  1013. Begin
  1014.     List := TCandidateList.Create;
  1015.     AssignFile(F, FilePath);
  1016.     try
  1017.         If Not (FileExists(FilePath)) then
  1018.         begin
  1019.             Rewrite(F);
  1020.         end
  1021.         else
  1022.         begin
  1023.             Reset(F);
  1024.         end;
  1025.         if FileSize(F) <> 0 then
  1026.         begin
  1027.             while (not Eof(F)) do
  1028.             Begin
  1029.                 Read(F, TempRecord);
  1030.                 TempCandidate := TCandidate.ConvertToCandidate(TempRecord);
  1031.                 List.AddNewCandidate(TempCandidate);
  1032.             End;
  1033.         end;
  1034.     finally
  1035.         CloseFile(F);
  1036.         Result := List;
  1037.     end;
  1038. End;
  1039.  
  1040. Class Function TCandidateList.GetLastPrimaryKey(const TempList : TCandidateList): Integer;
  1041. var
  1042.     Key : Integer;
  1043.     TempHead : PCandidateList;
  1044. begin
  1045.     Key := -1;
  1046.     TempHead := TempList.Head;
  1047.  
  1048.     while TempHead <> NIL do
  1049.     begin
  1050.         if TempHead^.Candidate.IdCandidate > Key then
  1051.             Key := TempHead^.Candidate.IdCandidate;
  1052.         TempHead := TempHead^.Next;
  1053.     end;
  1054.  
  1055.     GetLastPrimaryKey := Key;
  1056. end;
  1057.  
  1058. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement