📄 main.pas
字号:
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 + -