⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 link.~pas

📁 《Kylix程序设计》一书中附带的例程源代码
💻 ~PAS
字号:
unit Link;interfaceuses  Qt, SysUtils, Types, Classes, Variants, QGraphics, QControls,  QForms, QDialogs, QStdCtrls;type  TMyData = record    X: Integer;    Y: Integer;    case Boolean of      true:  ( I: Integer; );      false: ( P: PInteger );  end;  PMyNode = ^TMyNode;  TMyNode = record    Data: TMyData;    Next: PMyNode;  end;  TMyList = record    Count: Integer;    Node: PMyNode;  end;  TFrmMain = class(TForm)    Memo: TMemo;    BtnAdd: TButton;    BtnDelete: TButton;    BtnInsert: TButton;    BtnSearch: TButton;    procedure FormCreate(Sender: TObject);    procedure BtnAddClick(Sender: TObject);    procedure BtnInsertClick(Sender: TObject);    procedure BtnDeleteClick(Sender: TObject);    procedure BtnSearchClick(Sender: TObject);  private    { Private declarations }    MyList: TMyList;  public    { Public declarations }    procedure DoAdd( Data: TMyData );    procedure DoInsert( Data: TMyData; Index: Integer );    procedure DoDelete( Index: Integer );    function DoSearch( Data: TMyData ): Integer;    procedure DoDisplay();  end;var  FrmMain: TFrmMain;implementationuses Add, Insert, Delete, Search;{$R *.xfm}procedure TFrmMain.FormCreate(Sender: TObject);begin  MyList.Count := 0;  MyList.Node := nil;end;procedure TFrmMain.BtnAddClick(Sender: TObject);var  FrmAdd: TFrmAdd;  Data: TMyData;begin  FrmAdd := TFrmAdd.Create( Self );  try    if FrmAdd.ShowModal() = mrOK then    begin      // Create a new Data record      Data.X := StrToIntDef( FrmAdd.EdtX.Text, 0 );      Data.Y := StrToIntDef( FrmAdd.EdtY.Text, 0 );      // Add it      DoAdd( Data );      DoDisplay();    end;  finally    FrmAdd.Free();    FrmAdd := nil;  end;end;procedure TFrmMain.BtnInsertClick(Sender: TObject);var  FrmInsert: TFrmInsert;  Data: TMyData;begin  FrmInsert := TFrmInsert.Create( Self );  try    if FrmInsert.ShowModal() = mrOK then    begin      // Create a new Data record      Data.X := StrToIntDef( FrmInsert.EdtX.Text, 0 );      Data.Y := StrToIntDef( FrmInsert.EdtY.Text, 0 );      // Insert it      DoInsert( Data, StrToIntDef( FrmInsert.EdtPosition.Text, -1 ) );      DoDisplay();    end;  finally    FrmInsert.Free();    FrmInsert := nil;  end;end;procedure TFrmMain.BtnDeleteClick(Sender: TObject);var  FrmDelete: TFrmDelete;begin  FrmDelete := TFrmDelete.Create( Self );  try    if FrmDelete.ShowModal() = mrOK then    begin      // Delete it      DoDelete( StrToIntDef( FrmDelete.EdtPosition.Text, -1 ) );      DoDisplay();    end;  finally    FrmDelete.Free();    FrmDelete := nil;  end;end;procedure TFrmMain.BtnSearchClick(Sender: TObject);var  FrmSearch: TFrmSearch;  Data: TMyData;  PosReturn: Integer;  Msg: string;begin  FrmSearch := TFrmSearch.Create( Self );  try    if FrmSearch.ShowModal() = mrOK then    begin      // Create a new Data record      Data.X := StrToIntDef( FrmSearch.EdtX.Text, 0 );      Data.Y := StrToIntDef( FrmSearch.EdtY.Text, 0 );      // Search it      PosReturn := DoSearch( Data );      if PosReturn = -1 then      begin        Msg := Format( '[ %d, %d ] not Found.', [ Data.X, Data.Y ] );        Application.MessageBox( Msg, 'Search Result', [ smbOK ], smsInformation );        if Memo.HasSelection then Memo.UnSelect();      end      else      begin//        Msg := Format( '[ %d, %d ] at Node %d.', [ Data.X, Data.Y, PosReturn ] );//        Application.MessageBox( Msg, 'Search Result', [ smbOK ], smsInformation );        if Memo.HasSelection then Memo.UnSelect();        Memo.SetFocus();        QMultiLineEdit_setCursorPosition( Memo.Handle, 2*PosReturn+2, 0, false ); // false means whether extends old selection.        Memo.SelLength := Length( Memo.Lines[ 2*PosReturn+2 ] ) + Length( Memo.Lines[ 2*PosReturn+3 ] ) + 2;      end;    end;  finally    FrmSearch.Free();    FrmSearch := nil;  end;end;procedure TFrmMain.DoAdd(Data: TMyData);var  NewNode: PMyNode;  CurrNode: PMyNode;begin  // Create a new node  New( NewNode );  NewNode^.Next := nil;  NewNode^.Data := Data;  // Find the last node of the list  if MyList.Node = nil then  begin    // Add the new node    MyList.Node := NewNode;    Inc( MyList.Count );  end  else  begin    CurrNode := MyList.Node;    while CurrNode^.Next <> nil do    begin      CurrNode := CurrNode^.Next;    end;    // Add the new node    CurrNode^.Next := NewNode;    Inc( MyList.Count );  end;end;procedure TFrmMain.DoDelete(Index: Integer);var  CurrNode, DeletedNode: PMyNode;  i: Integer;begin  if Index = -1 then  // Delete all  begin    while MyList.Node <> nil do    begin      DeletedNode := MyList.Node;      MyList.Node := MyList.Node^.Next;      Dispose( DeletedNode );      DeletedNode := nil;    end;    MyList.Count := 0;  end  else if Index = 0 then  // Delete the first position  begin    if MyList.Count > 0 then    begin      // Delete the first node      DeletedNode := MyList.Node;      MyList.Node := MyList.Node^.Next;      Dispose( DeletedNode );      DeletedNode := nil;      Dec( MyList.Count );    end;  end  else  // Delete it at the specific position  begin    if MyList.Count <= Index then  // If the position doen not exist    begin      exit;    end    else  // Find the specific position given by Index and delete it    begin      CurrNode := MyList.Node;      for i := 0 to Index - 2 do      begin        CurrNode := CurrNode^.Next;      end;      // Delete it      DeletedNode := CurrNode^.Next;      CurrNode^.Next := DeletedNode^.Next;      Dispose( DeletedNode );      DeletedNode := nil;      Dec( MyList.Count );    end;  end;end;procedure TFrmMain.DoInsert(Data: TMyData; Index: Integer);var  NewNode: PMyNode;  CurrNode: PMyNode;  i: Integer;begin  if Index = -1 then  // Add it at the end of the list  begin    DoAdd( Data );  end  else if Index = 0 then  // Insert it at the first position  begin    // Create a new node    New( NewNode );    NewNode^.Next := MyList.Node;    NewNode^.Data := Data;    // Insert the new node    MyList.Node := NewNode;    Inc( MyList.Count );  end  else  // Insert it at the specific position  begin    if MyList.Count <= Index then  // If the position doen not exist    begin      DoAdd( Data );      exit;    end    else  // Find the specific position given by Index    begin      CurrNode := MyList.Node;      for i := 0 to Index - 2 do      begin        CurrNode := CurrNode^.Next;      end;      // Create a new node      New( NewNode );      NewNode^.Next := CurrNode^.Next;      NewNode^.Data := Data;      // Insert the new node      CurrNode^.Next := NewNode;      Inc( MyList.Count );    end;  end;end;function TFrmMain.DoSearch(Data: TMyData): Integer;var  CurrNode: PMyNode;begin  Result := 0;  // Find the specific data  CurrNode := MyList.Node;  while CurrNode <> nil do  begin// No permitted//    if CurrNode^.Data = Data then    if ( CurrNode^.Data.X = Data.X ) and ( CurrNode^.Data.Y = Data.Y ) then  // Success    begin      // break;      exit;    end    else    begin      CurrNode := CurrNode^.Next;      Inc( Result );    end;  end;  Result := -1;end;procedure TFrmMain.DoDisplay;var  CurrNode: PMyNode;  NewLine: string;  i: Integer;begin  Memo.Lines.Clear();  case MyList.Count of    0:      NewLine := 'No Nodes.';    1:      NewLine := 'Total 1 Node.';    else      NewLine := Format( 'Total %d Nodes.', [ MyList.Count ] );  end;  Memo.Lines.Add( NewLine );  Memo.Lines.Add( '======================================' );  // Show the last node of the list  CurrNode := MyList.Node;  i := 0;  while CurrNode <> nil do  begin    NewLine := Format( 'Node %d:', [ i ] );    Memo.Lines.Add( NewLine );    NewLine := Format( '    X = %d;    Y = %d.', [ CurrNode^.Data.X, CurrNode^.Data.Y ] );    Memo.Lines.Add( NewLine );    CurrNode := CurrNode^.Next;    Inc( i );  end;end;end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -