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

📄 main.pas

📁 自己做的通讯录程序
💻 PAS
📖 第 1 页 / 共 4 页
字号:
unit main;
(**************************
//设计思路:
    做一个列表用于存储所有的数据记录AddressList。需要的时候,从数据库
中读入数据存入列表中。显示记录的时候,从该列表中获取数据。
    看起来,该列表与“数据维护”面板中的数据顺序是一致的。
这样的话,数据的维护实际上就是这个列表的维护了。当程序退出
的时候,可以选择保存或者不保存对数据的更改。如保存,则把该
列表的数据存入数据库中就可以了。
***************************)

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, Mask, DBCtrls, ComCtrls,
  Buttons, ExtCtrls,  CheckLst, ToolWin, Menus, ImgList, IniFiles, SLV,
  UserMaintain, WNNumberEdit;

type
  TItemState = (isNormal, isNew, isUpdated, isDeleted);
              //未改变, 新增, 更新了,    被删除了
  TItem = record
    ID          : Integer;
    Name        : String;
    sex         : String;
    Birthday    : String;
    BirthShow   : String;     //显示的生日,可以只显示 月 和 日
    Telphone    : String;
    Email       : String;
    QQ          : String;
    City        : String;
    UnitName    : String;
    HomeAddress : String;
    PostAddress : String;     //联系地址
    UseLevel    : Integer;
    Remark      : String;
    UserName    : String;
    ItemState   : TItemState; //该记录的状态
    GroupIDs    : Array of Integer; //所人员所属组的ID
    //GroupNames  : Array of String;  //所人员所属组的名称
  end;
  pTItem = ^TItem;

  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    AQuery: TADOQuery;
    MainMenu1: TMainMenu;
    NQuit: TMenuItem;
    ImageList1: TImageList;
    NameList: TSortableListView;
    Splitter2: TSplitter;
    Timer1: TTimer;
    NExport: TMenuItem;
    NGroup: TMenuItem;
    NImport: TMenuItem;
    sbContent: TScrollBox;
    btDelete: TBitBtn;
    clbGroup: TCheckListBox;
    Name: TEdit;
    email: TEdit;
    qq: TEdit;
    city: TEdit;
    telphone: TEdit;
    homeaddress: TEdit;
    unitname: TEdit;
    Remark: TMemo;
    sex: TComboBox;
    uselevel: TComboBox;
    Edit1: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    GroupBox1: TGroupBox;
    cbHoldGroup: TCheckBox;
    btAdd: TBitBtn;
    btSaveList: TBitBtn;
    btOK: TBitBtn;
    sbCondition: TScrollBox;
    Splitter1: TSplitter;
    NShow: TMenuItem;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    PopupMenu1: TPopupMenu;
    NDeleteItem: TMenuItem;
    NHideItem: TMenuItem;
    lbItemWidth: TListBox;
    StatusBar1: TStatusBar;
    GroupBox2: TGroupBox;
    clbContent: TCheckListBox;
    btUpdateList: TBitBtn;
    GroupBox3: TGroupBox;
    editQueryTel: TEdit;
    btQueryTel: TButton;
    TimerSetCount: TTimer;
    N1: TMenuItem;
    GroupBox4: TGroupBox;
    brReQuery: TButton;
    GroupBox5: TGroupBox;
    btShowLevel: TButton;
    cbMin: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    cbMax: TComboBox;
    GroupBox6: TGroupBox;
    btShowGroup: TButton;
    clbShowGroup: TCheckListBox;
    GroupBox7: TGroupBox;
    editQueryName: TEdit;
    btQueryName: TButton;
    NDataFile: TMenuItem;
    OpenDialogODBC: TOpenDialog;
    NAbout: TMenuItem;
    ADOQueryUpdateModifyTime: TADOQuery;
    NFunction: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    NHelp: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    NUser: TMenuItem;
    NSelectUser: TMenuItem;
    NCreateView: TMenuItem;
    Edit2: TEdit;
    PostAddress: TEdit;
    Edit15: TEdit;
    Edit3: TEdit;
    Year: TWNNumberEdit;
    Month: TWNNumberEdit;
    Edit4: TEdit;
    Day: TWNNumberEdit;
    Edit16: TEdit;
    btHide: TButton;
    ToolBar1: TToolBar;
    ToolButtonShow: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    ToolButton6: TToolButton;
    ToolButton7: TToolButton;
    ToolButton8: TToolButton;
    ToolButton9: TToolButton;
    ToolButton10: TToolButton;
    ToolButton12: TToolButton;
    ToolButton11: TToolButton;
    Label3: TLabel;
    N2: TMenuItem;
    NShowYear: TMenuItem;
    ToolButtonShowYear: TToolButton;
    ToolButton13: TToolButton;
    ToolButton14: TToolButton;
    procedure btAddClick(Sender: TObject);
    procedure btOKClick(Sender: TObject);
    procedure btDeleteClick(Sender: TObject);
    procedure btSaveListClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure NameListColumnClick(Sender: TObject; Column: TListColumn);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Timer1Timer(Sender: TObject);
    procedure NShowClick(Sender: TObject);
    procedure NGroupClick(Sender: TObject);
    procedure NQuitClick(Sender: TObject);
    procedure NExportClick(Sender: TObject);
    procedure NImportClick(Sender: TObject);
    procedure NDeleteItemClick(Sender: TObject);
    procedure NHideItemClick(Sender: TObject);
    procedure btUpdateListClick(Sender: TObject);
    procedure NameListChange(Sender: TObject; Item: TListItem;
      Change: TItemChange);
    procedure btQueryTelClick(Sender: TObject);
    procedure TimerSetCountTimer(Sender: TObject);
    procedure NCreateViewClick(Sender: TObject);
    procedure brReQueryClick(Sender: TObject);
    procedure btShowLevelClick(Sender: TObject);
    procedure btShowGroupClick(Sender: TObject);
    procedure btQueryNameClick(Sender: TObject);
    procedure NDataFileClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure NAboutClick(Sender: TObject);
    procedure NSelectUserClick(Sender: TObject);
    procedure NUserClick(Sender: TObject);
    procedure NShowYearClick(Sender: TObject);
  private
    { Private declarations }
    GroupIDs: Array of Integer;
    strSQL: String;
    m_Deleted: TStringList;  //要删除的记录
    maxid: Integer;
    m_CurUser: String;

    procedure FillGroup();
    procedure GetDataFromDB();
    procedure ClearAllData();
    procedure SaveData();
    procedure DeleteItem(nIndex: Integer);
    function  PersonExist(name: String):Boolean;
    //将选定的人员显示在人员列表中
    procedure ShowItemInList(ListItem: TListItem);
    procedure CreateColumns();
    function  PersonInGroups(p: pTItem):Boolean;
    function  ifExistODBC():Boolean;  //判断是否存在ODBC数据源
    function  GetBirthday():String;   //根据年月日得到生日
    //根据birthday拆分得到年月日
    procedure SplitBirthday(birthday:String);
    function  ifModify():Boolean;     //判断是否有更改
    function  ItemModified(ListItem: TListItem):Boolean;
    function  GetBirthShow(Birthday: String):String; //根据完整的生日获取应该显示的生日

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Group, MyFunc, Registry, About, SlectUser;

{$R *.dfm}

procedure TForm1.btAddClick(Sender: TObject);
var
  i, nGroup: Integer;
  p: PTItem;
  ListItem: TListItem;
begin
  NameList.ClearSelection;

  maxid := maxid + 1;
  //插入数据
  new(p);
  p.Name := '';
  p.ID := maxid;
  p.UserName := m_CurUser;
  p.ItemState := isNew;

  //分组情况
  //首先清空数组
  if cbHoldGroup.Checked then
  begin
    SetLength(p.GroupIDs, 0);
    for i:=0 to clbGroup.Items.Count - 1 do
    begin
      //然后添加组别情况
      if clbGroup.Checked[i] then
      begin
        nGroup := Length(p.GroupIDs);
        SetLength(p.GroupIDs, nGroup+1);
        p.GroupIDs[nGroup] := GroupIDs[i];
      end;
    end;
  end;

  ListItem := NameList.Items.Insert(0);
  ListItem.Data := p;
  NameList.Selected := ListItem;

  ClearAllData();
  StatusBar1.Panels[1].Text := Format('第 %d 人', [NameList.Items.Count]);

  Name.SetFocus;
end;

procedure TForm1.FillGroup();
var
  i : Integer;
  Query1 : TADOQuery;
begin
  Query1 := TADOQuery.Create(nil);
  Query1.Connection := ADOConnection1;

  strSQL := 'select * from GroupList Order by GroupName';
  with Query1 do
  begin
    SQL.Clear;
    SQL.Add(strSQL);
    Open;
  end;
  GroupIDs := nil;
  clbGroup.Clear;

  SetLength(GroupIDs, Query1.RecordCount);
  i := 0;
  Query1.First;
  while not(Query1.Eof) do
  begin
      GroupIDs[i] := Query1.FieldByName('GroupID').AsInteger;
      clbGroup.Items.Add(Query1.FieldByName('GroupName').AsString);
      clbShowGroup.Items.Add(Query1.FieldByName('GroupName').AsString);
      Query1.Next;
      i := i+1;
  end;
  Query1.Close;
  Query1.Free;
end;

procedure TForm1.GetDataFromDB();
var
  nGroup: Integer;
  Query2: TADOQuery;  //用于查找人员所属的组
  p: pTItem;
  ListItem: TListItem;
begin
  Query2 := TADOQuery.Create(self);
  Query2.Connection := ADOConnection1;

  NameList.Items.Clear;
  m_Deleted.Clear;

  strSQL := Format('select * from AddressList WHERE UserName=''%s'' Order by name',
                   [m_CurUser]);

  AQuery.SQL.Clear;
  AQuery.SQL.Add(strSQL);
  AQuery.Open;
  AQuery.First;
  while not(AQuery.Eof) do
  begin
    new(p);
    p.ID          := AQuery.FieldByName('ID').AsInteger;
    p.Name        := AQuery.FieldByName('Name').AsString;
    p.sex         := AQuery.FieldByName('sex').AsString;
    p.Telphone    := AQuery.FieldByName('Telphone').AsString;
    p.Email       := AQuery.FieldByName('Email').AsString;
    p.QQ          := AQuery.FieldByName('QQ').AsString;
    p.City        := AQuery.FieldByName('City').AsString;
    p.Birthday    := AQuery.FieldByName('Birthday').AsString;
    p.UnitName    := AQuery.FieldByName('UnitName').AsString;
    p.HomeAddress := AQuery.FieldByName('HomeAddress').AsString;
    p.PostAddress := AQuery.FieldByName('PostAddress').AsString;
    p.UseLevel    := AQuery.FieldByName('UseLevel').AsInteger;
    p.Remark      := AQuery.FieldByName('Remark').AsString;
    p.ItemState   := isNormal;

    p.BirthShow   := GetBirthShow(p.Birthday);

    //查找该人员所属的组
    strSQL := ' select GroupFall.GroupID as GroupID, GroupList.GroupName as GroupName '
            + ' from GroupFall, GroupList where ID=' + AQuery.FieldByName('ID').AsString
            + ' AND GroupFall.GroupID = GroupList.GroupID'
            + ' Order by GroupList.GroupName';
    Query2.SQL.Clear;
    Query2.SQL.Add(strSQL);
    Query2.Open;
    while not(Query2.Eof) do
    begin
      nGroup := Length(p.GroupIDs);
      SetLength(p.GroupIDs, nGroup+1);
      p.GroupIDs[nGroup] := Query2.FieldByName('GroupID').AsInteger;
      Query2.Next();
    end;
    Query2.Close;

    ListItem := NameList.Items.Add();
    ListItem.Data := p;
    
    ShowItemInList(ListItem);

    //下一个
    AQuery.Next;
  end;
  AQuery.Close;

  Query2.Free;
  
  if NameList.Items.Count > 0 then
    NameList.Selected := NameList.Items[0];
end;

procedure TForm1.btOKClick(Sender: TObject);
var
  i, nGroup: Integer;
  p: pTItem;
  strError: String;
  ListItem: TListItem;
begin
  if NameList.Selected = nil then
  begin
    ClearAllData();
    Exit;
  end;

  //检查数据
  strError := '';
  if Length(Name.Text)=0 then strError := strError + '姓名未填' + #13#10;
  if Length(Sex.Text)=0 then  strError := strError + '性别未填' + #13#10;
  if Length(strError)>0 then begin
    ShowMessage(strError);
    exit;
  end;

  //检查是不是已经有这个人了
  for i:=0 to NameList.Items.Count-1 do
    if ( NameList.Selected.Caption = '' )
       and ( Name.Text = pTItem(NameList.Items[i].Data).Name ) then
    begin
      if MessageBox(Handle, PChar('"'+Name.Text+'"  已存在,是否继续?'), '',
                    MB_YESNO or MB_ICONQUESTION) = IDNO then
      begin
        //将当前人员设置为这个人
        NameList.ClearSelection;
        NameList.Selected := NameList.Items[i];
        NameListChange(NameList, NameList.Items[i], ctState);
        Exit;
      end;
    end;


  ListItem := NameList.Selected;
  p := ListItem.Data;

  p.Name        := Name.Text;
  p.sex         := Sex.Text;
  p.Telphone    := Telphone.Text;
  p.Email       := Email.Text;

⌨️ 快捷键说明

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