home *** CD-ROM | disk | FTP | other *** search
/ Delphi Programming Unleashed / Delphi_Programming_Unleashed_SAMS_Publishing_1995.iso / chap16 / linklst2 / main.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-03-21  |  6.9 KB  |  321 lines

  1. unit Main;
  2.  
  3. { Program copyright (c) 1995 by Charles Calvert }
  4. { Project Name: LINKLST2 }
  5.  
  6. { This a simple linked list program. It supports Adding,
  7.   Deleting and Searching.
  8.  
  9.   The first time you run this program you should
  10.   choose Create New List from the File menu. Then
  11.   choose Read Data. Thereafter you should
  12.   always choose Read Data after starting the program. }
  13.  
  14. interface
  15.  
  16. uses
  17.   WinTypes, WinProcs, Classes,
  18.   Graphics, Forms, Controls,
  19.   Menus, StdCtrls, MakeData, SysUtils;
  20.  
  21. type
  22.   TDataForm = class(TForm)
  23.     MainMenu1: TMainMenu;
  24.     File1: TMenuItem;
  25.     CreateList1: TMenuItem;
  26.     Save1: TMenuItem;
  27.     Lists1: TMenuItem;
  28.     Add1: TMenuItem;
  29.     Delete1: TMenuItem;
  30.     ReadData1: TMenuItem;
  31.     N1: TMenuItem;
  32.     Exit1: TMenuItem;
  33.     N2: TMenuItem;
  34.     Edit1: TEdit;
  35.     Edit2: TEdit;
  36.     Edit3: TEdit;
  37.     Label1: TLabel;
  38.     Label2: TLabel;
  39.     Label3: TLabel;
  40.     First: TButton;
  41.     Next: TButton;
  42.     Count1: TMenuItem;
  43.     Button1: TButton;
  44.     Last: TButton;
  45.     Find1: TMenuItem;
  46.     Help1: TMenuItem;
  47.     procedure CreateList1Click(Sender: TObject);
  48.     procedure ReadData1Click(Sender: TObject);
  49.     procedure FirstClick(Sender: TObject);
  50.     procedure NextClick(Sender: TObject);
  51.     procedure Save1Click(Sender: TObject);
  52.     procedure Count1Click(Sender: TObject);
  53.     procedure Button1Click(Sender: TObject);
  54.     procedure LastClick(Sender: TObject);
  55.     procedure Find1Click(Sender: TObject);
  56.     procedure Delete1Click(Sender: TObject);
  57.     procedure Help(Sender: TObject);
  58.   private
  59.     FirstNode,
  60.     Current: PMyNode;
  61.     procedure CreateNewFile;
  62.     procedure ShowRecord;
  63.     procedure NewNode(var Item: PMyNode);
  64.     function ReadFile(var First, Current: PMyNode): Boolean;
  65.     procedure ReadTextFile(var FirstNode, Current: PMyNode);
  66.     procedure Working;
  67.     procedure GoLast;
  68.     function Find(S: String): PMyNode;
  69.     procedure DeleteNode(var Node: PMyNode);
  70.   public
  71.     { Public declarations }
  72.   end;
  73.  
  74. var
  75.   DataForm: TDataForm;
  76.  
  77. implementation
  78.  
  79. uses
  80.   Entry,
  81.   Dialogs;
  82.  
  83. {$R *.DFM}
  84.  
  85. procedure TDataForm.CreateNewFile;
  86. var
  87.   F: File of TMyNode;
  88.   Head: PMyNode;
  89. begin
  90.   Head := FirstNode;
  91.   System.Assign(F, FileName);
  92.   ReWrite(F);
  93.   while Head^.Next <> nil do begin
  94.     Write(F, Head^);
  95.     Head := Head^.Next;
  96.   end;
  97.   Write(F, Head^);
  98.   System.Close(F);
  99. end;
  100.  
  101. procedure TDataForm.NewNode(var Item: PMyNode);
  102. begin
  103.   New(Item);
  104.   Item^.Next := nil;
  105.   Item^.Name := '';
  106.   Item^.Flight := 0;
  107.   Item^.Day := '';
  108. end;
  109.  
  110. function TDataForm.ReadFile(var First, Current: PMyNode): Boolean;
  111. var
  112.   F: File of TMyNode;
  113.   Prev: PMyNode;
  114. begin
  115.   ReadFile := False;
  116.   System.Assign(F, FileName);
  117.   {$I-} Reset(F); {$I+}
  118.   if IOResult <> 0 then Exit;
  119.   NewNode(Current);
  120.   Read(F, Current^);
  121.   FirstNode := Current;
  122.   while not Eof(F) do begin
  123.     Prev := Current;
  124.     NewNode(Current);
  125.     Read(F, Current^);
  126.     Prev^.Next := Current;
  127.   end;
  128.   System.Close(F);
  129.   ReadFile := True;
  130. end;
  131.  
  132. { Read a Text File }
  133. procedure TDataForm.ReadTextFile(var FirstNode, Current: PMyNode);
  134. var
  135.   F: System.Text;
  136.   Prev: PMyNode;
  137.   i: Integer;
  138. begin
  139.   System.Assign (F, 'data.txt');
  140.   {$I-} Reset(F); {$I+}
  141.   if (IOResult <> 0) then begin
  142.     MessageBox(Handle, 'error Reading File', nil, mb_Ok);
  143.     Halt;
  144.   end;
  145.   NewNode(Current);
  146.   ReadLn(F, Current^.Name);
  147.   ReadLn(F, Current^.Flight);
  148.   ReadLn(F, Current^.Day);
  149.   FirstNode := Current;
  150.   i := 0;
  151.   while not Eof(F) do begin
  152.     Prev := Current;
  153.     NewNode(Current);
  154.     ReadLn(F, Current^.Name);
  155.     ReadLn(F, Current^.Flight);
  156.     ReadLn(F, Current^.Day);
  157.     Prev^.Next := Current;
  158.     Inc(i);
  159.   end;
  160.   System.Close(F);
  161.   CreateNewFile;
  162. end;
  163.  
  164. procedure TDataForm.ShowRecord;
  165. begin
  166.   Edit1.Text := Current^.Name;
  167.   Edit2.Text := IntToStr(Current^.Flight);
  168.   Edit3.Text := Current^.Day;
  169. end;
  170.  
  171. procedure TDataForm.CreateList1Click(Sender: TObject);
  172. begin
  173.   CreateData;
  174. end;
  175.  
  176. procedure TDataForm.Working;
  177. begin
  178.   Edit1.Text := 'Please wait';
  179.   Edit2.Text := 'Working';
  180.   Edit3.Text := '';
  181.   Application.ProcessMessages;
  182. end;
  183.  
  184. procedure TDataForm.ReadData1Click(Sender: TObject);
  185. begin
  186.   Working;
  187.   if not ReadFile(FirstNode, Current) then
  188.     ReadTextFile(FirstNode, Current);
  189.   Current := FirstNode;
  190.   ShowRecord;
  191. end;
  192.  
  193. procedure TDataForm.FirstClick(Sender: TObject);
  194. begin
  195.   Current := FirstNode;
  196.   ShowRecord;
  197. end;
  198.  
  199. procedure TDataForm.NextClick(Sender: TObject);
  200. begin
  201.   if Current^.Next <> nil then
  202.     Current := Current^.Next;
  203.   ShowRecord;
  204. end;
  205.  
  206. procedure TDataForm.Save1Click(Sender: TObject);
  207. begin
  208.   CreateNewFile;
  209. end;
  210.  
  211. procedure TDataForm.Count1Click(Sender: TObject);
  212. var
  213.   i: Integer;
  214.   Head: PMyNode;
  215. begin
  216.   i := 1;
  217.   Head := FirstNode;
  218.   while Head^.Next <> nil do begin
  219.     Head := Head^.Next;
  220.     Inc(i);
  221.   end;
  222.   MessageDlg('Total = ' + IntToStr(i), mtInformation, [mbOk], 0);
  223. end;
  224.  
  225. procedure TDataForm.GoLast;
  226. begin
  227.   while Current^.Next <> nil do
  228.     Current := Current^.Next;
  229. end;
  230.  
  231. procedure TDataForm.Button1Click(Sender: TObject);
  232. var
  233.   Temp: PMyNode;
  234. begin
  235.   NewNode(Temp);
  236.   if EntryForm.Add(Temp) then begin
  237.     GoLast;
  238.     Current^.Next := Temp;
  239.     Current := Temp;
  240.   end;
  241. end;
  242.  
  243. procedure TDataForm.LastClick(Sender: TObject);
  244. begin
  245.   GoLast;
  246.   ShowRecord;
  247. end;
  248.  
  249. function TDataForm.Find(S: String): PMyNode;
  250. var
  251.   Head,
  252.   Temp: PMyNode;
  253. begin
  254.   Head := FirstNode;
  255.   Temp := nil;
  256.   while Head^.Next <> nil do begin
  257.     if Head^.Name = S then begin
  258.       Temp := Head;
  259.       break;
  260.     end;
  261.     Head := Head^.Next;
  262.   end;
  263.   if Head^.Name = S then Temp := Head;
  264.   Find := Temp;
  265. end;
  266.  
  267. procedure TDataForm.Find1Click(Sender: TObject);
  268. var
  269.   S: String;
  270. begin
  271.   S := '';
  272.   InputQuery('Search', 'Search for: ', S);
  273.   Current := Find(S);
  274.   ShowRecord;
  275. end;
  276.  
  277. procedure TDataForm.DeleteNode(var Node: PMyNode);
  278. var
  279.   Temp: PMyNode;
  280. begin
  281.   Temp := FirstNode;
  282.   if Temp = Node then begin           { First Node? }
  283.     Temp := Temp^.Next;
  284.     FirstNode := Temp;
  285.   end else
  286.     while Temp^.Next <> Node do
  287.       Temp := Temp^.Next;
  288.   Current := Temp;
  289.   if Temp^.Next^.Next <> nil then     { A Middle Node? }
  290.     Temp^.Next := Temp^.Next^.Next
  291.   else
  292.     Temp^.Next := nil;                { Last Node? }
  293.   Dispose(Node);
  294. end;
  295.  
  296. procedure TDataForm.Delete1Click(Sender: TObject);
  297. var
  298.   S: String;
  299.   Temp: PMyNode;
  300. begin
  301.   if MessageBox(Handle, 'Delete node?', 'Question', mb_YesNo) = idNo then Exit;
  302.   S := Edit1.Text;
  303.   Temp := Find(S);
  304.   if Temp <> nil then
  305.     DeleteNode(Temp);
  306.   ShowRecord;
  307. end;
  308.  
  309. procedure TDataForm.Help(Sender: TObject);
  310. var
  311.   S: string;
  312. begin
  313.   S := 'The first time you run the program ' +
  314.        'choose Create New List from the File menu, ' +
  315.        'then choose Read Data. Thereafter, you must always choose ' +
  316.        'Read Data from the File menu when you start the program. ';
  317.   ShowMessage(S);
  318. end;
  319.  
  320. end.
  321.