📄 mainfrm.pas
字号:
{**********************************************************}
{ }
{ AddrBook 1.0 }
{ ---- Sample for Using TinyDB }
{ }
{ Author: DayDream Studio }
{ Email: webmaster@tinydb.com }
{ URL: http://www.TinyDB.com }
{ }
{**********************************************************}
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, Menus, ActnList, ComCtrls,
StdCtrls, ExtCtrls, ToolWin, ImgList, TinyDB, Db,
CardFrm;
type
TMainForm = class(TForm)
MainMenu: TMainMenu;
ActionList: TActionList;
NewCardAction: TAction;
FileMenu: TMenuItem;
FileNewMemberItem: TMenuItem;
CoolBar1: TCoolBar;
ToolBar: TToolBar;
ListView: TListView;
StatusBar: TStatusBar;
NewMemberToolButton: TToolButton;
Panel1: TPanel;
Panel2: TPanel;
ImageList: TImageList;
PropertyToolButton: TToolButton;
DeleteCardToolButton: TToolButton;
PropertyAction: TAction;
DeleteCardAction: TAction;
FileN1Item: TMenuItem;
FileN3Item: TMenuItem;
FilePropertyItem: TMenuItem;
FileDeleteCardItem: TMenuItem;
FileExitItem: TMenuItem;
ViewMenu: TMenuItem;
HelpMenu: TMenuItem;
ViewToolBarItem: TMenuItem;
ViewStatusBarItem: TMenuItem;
ViewN1Item: TMenuItem;
ViewLargeIconItem: TMenuItem;
ViewSmallIconItem: TMenuItem;
ViewListItem: TMenuItem;
ViewReportItem: TMenuItem;
ViewN2Item: TMenuItem;
ViewRefreshItem: TMenuItem;
HelpAboutItem: TMenuItem;
Splitter1: TSplitter;
TreeView: TTreeView;
NewFolderAction: TAction;
FileNewFolderItem: TMenuItem;
ToolButton1: TToolButton;
FolderTinyTable: TTinyTable;
TinyDatabase: TTinyDatabase;
CardTinyTable: TTinyTable;
TreeViewPopupMenu: TPopupMenu;
TreePopNewFolderItem: TMenuItem;
TreePopNewCardItem: TMenuItem;
TreePopN1Item: TMenuItem;
TreePopDeleteFolderItem: TMenuItem;
ListViewPopupMenu: TPopupMenu;
ListPopNewCardItem: TMenuItem;
ListPopDeleteCardItem: TMenuItem;
ListPopPropertyItem: TMenuItem;
Panel3: TPanel;
Label1: TLabel;
NameSearchPanel: TPanel;
NameSearchEdit: TEdit;
EncryptAction: TAction;
FileEncryptItem: TMenuItem;
FileN2Item: TMenuItem;
EncryptToolButton: TToolButton;
procedure NewCardActionExecute(Sender: TObject);
procedure PropertyActionExecute(Sender: TObject);
procedure DeleteCardActionExecute(Sender: TObject);
procedure FileExitItemClick(Sender: TObject);
procedure ViewToolBarItemClick(Sender: TObject);
procedure ViewStatusBarItemClick(Sender: TObject);
procedure ViewLargeIconItemClick(Sender: TObject);
procedure ViewRefreshItemClick(Sender: TObject);
procedure HelpAboutItemClick(Sender: TObject);
procedure NewFolderActionExecute(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure TreeViewChange(Sender: TObject; Node: TTreeNode);
procedure FormDestroy(Sender: TObject);
procedure TreePopDeleteFolderItemClick(Sender: TObject);
procedure TreeViewEditing(Sender: TObject; Node: TTreeNode;
var AllowEdit: Boolean);
procedure TreeViewPopupMenuPopup(Sender: TObject);
procedure TreeViewMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ListViewPopupMenuPopup(Sender: TObject);
procedure TreeViewEdited(Sender: TObject; Node: TTreeNode;
var S: String);
procedure NameSearchPanelResize(Sender: TObject);
procedure ListViewChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
procedure NameSearchEditKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure EncryptActionExecute(Sender: TObject);
private
{ Private declarations }
FPassword: string;
function GetDBFileName: string;
function CreateDatabase: Boolean;
function OpenDatabase: Boolean;
procedure FillFolderTreeView;
procedure FillListView(FolderID: Integer);
procedure UpdateListItem(ListItem: TListItem; CardData: TCardFormData);
procedure LoadCardData(var CardData: TCardFormData);
procedure SaveCardData(CardData: TCardFormData);
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses StrRes, InputFrm, ChgPwdFrm, AboutFrm;
{$R *.DFM}
procedure KillMessage(Wnd: HWnd; Msg: Integer);
var
M: TMsg;
begin
M.Message := 0;
if PeekMessage(M, Wnd, Msg, Msg, pm_Remove) and (M.Message = WM_QUIT) then
PostQuitMessage(M.wparam);
end;
function TMainForm.GetDBFileName: string;
begin
Result := ExtractFilePath(Application.ExeName) + 'AddrData.dat';
end;
function TMainForm.CreateDatabase: Boolean;
var
DBFileName: string;
begin
Result := True;
DBFileName := GetDBFileName;
try
TinyDatabase.CreateDatabase(DBFileName, True, clNormal, 'ZLIB', False, 'MyEncAlgo', '');
TinyDatabase.DatabaseName := DBFileName;
TinyDatabase.CreateTable('Card', [
FieldItem('ID', ftAutoInc),
FieldItem('FolderID', ftInteger),
FieldItem('Name', ftString, 32),
FieldItem('Nickname', ftString, 32),
FieldItem('Emails', ftMemo),
FieldItem('HandTel', ftString, 20),
FieldItem('BP', ftString, 20),
FieldItem('Oicq', ftString, 20),
FieldItem('Icq', ftString, 20),
FieldItem('Sex', ftInteger),
FieldItem('Birthday', ftDate),
FieldItem('UseBirth', ftBoolean),
FieldItem('Constellation', ftInteger),
FieldItem('BloodType', ftInteger),
FieldItem('Taste', ftString, 127),
FieldItem('Homepage', ftString, 127),
FieldItem('HomeZip', ftString, 6),
FieldItem('HomeAddr', ftString, 255),
FieldItem('HomeTel1', ftString, 32),
FieldItem('HomeTel2', ftString, 32),
FieldItem('HomeFax', ftString, 32),
FieldItem('CorpZip', ftString, 6),
FieldItem('CorpAddr', ftString, 255),
FieldItem('CorpJob', ftString, 32),
FieldItem('CorpDept', ftString, 32),
FieldItem('CorpTel1', ftString, 32),
FieldItem('CorpTel2', ftString, 32),
FieldItem('CorpFax', ftString, 32),
FieldItem('CorpHomepage', ftString, 255),
FieldItem('ExtMemo', ftMemo)
] );
TinyDatabase.CreateTable('Folder', [
FieldItem('ID', ftAutoInc),
FieldItem('ParentID', ftInteger),
FieldItem('Name', ftString, 32)
] );
TinyDatabase.CreateIndex('Card', 'ByFolderID', [], ['FolderID']);
TinyDatabase.CreateIndex('Card', 'ByName', [], ['Name']);
TinyDatabase.CreateIndex('Folder', 'ByParentID', [], ['ParentID']);
FolderTinyTable.DatabaseName := DBFileName;
FolderTinyTable.TableName := 'Folder';
FolderTinyTable.Open;
FolderTinyTable.AppendRecord([0, 0, '<' + SDefaultStr + '>']);
FolderTinyTable.Close;
except
DeleteFile(DBFileName);
Result := False;
end;
end;
function TMainForm.OpenDatabase: Boolean;
var
DBFileName: string;
Password: string;
Count: Integer;
begin
TinyDatabase.Close;
DBFileName := GetDBFileName;
TinyDatabase.DatabaseName := DBFileName;
TinyDatabase.Open;
Count := 1;
while not TinyDatabase.CanAccess and (Count <= 3) do
begin
if ShowInputForm(Password, Self.Caption, SInputPassword, True) then
begin
TinyDatabase.Password := Password;
if not TinyDatabase.CanAccess then
begin
MessageBox(Application.Handle, PChar(SPasswordWrong), PChar(Application.Title), 48);
Inc(Count);
end;
end else
begin
TinyDatabase.DatabaseName := '';
Break;
end;
end;
if (TinyDatabase.DatabaseName <> '') and (TinyDatabase.CanAccess) then
begin
FPassword := Password;
FolderTinyTable.DatabaseName := DBFileName;
FolderTinyTable.TableName := 'Folder';
FolderTinyTable.Open;
CardTinyTable.DatabaseName := DBFileName;
CardTinyTable.TableName := 'Card';
CardTinyTable.Open;
Result := True;
end else
Result := False;
end;
procedure TMainForm.FillFolderTreeView;
procedure FillTreeNode(TreeNode: TTreeNode);
var
I, FolderID: Integer;
Node: TTreeNode;
begin
FolderID := Integer(TreeNode.Data);
FolderTinyTable.Filter := 'ParentID=' + IntToStr(FolderID);
FolderTinyTable.Filtered := True;
FolderTinyTable.First;
for I := 0 to FolderTinyTable.RecordCount - 1 do
begin
Node := TreeView.Items.AddChild(TreeNode, FolderTinyTable.FieldByName('Name').AsString);
Node.Data := Pointer(FolderTinyTable.FieldByName('ID').AsInteger);
Node.ImageIndex := 1;
Node.SelectedIndex := 1;
FolderTinyTable.Next;
end;
for I := 0 to TreeNode.Count - 1 do
begin
FillTreeNode(TreeNode.Item[I]);
end;
end;
begin
TreeView.Items.BeginUpdate;
TreeView.Items.Clear;
with TreeView.Items.Add(nil, SAddressBook) do
begin
Data := Pointer(0);
ImageIndex := 0;
SelectedIndex := 0;
end;
FillTreeNode(TreeView.Items[0]);
TreeView.FullExpand;
TreeView.Items.EndUpdate;
TreeView.Items[1].Selected := True;
end;
procedure TMainForm.FillListView(FolderID: Integer);
var
I: Integer;
ListItem: TListItem;
List: TStrings;
Email: string;
begin
List := TStringList.Create;
ListView.Items.BeginUpdate;
ListView.Items.Clear;
try
CardTinyTable.Filter := 'FolderID=' + IntToStr(FolderID);
CardTinyTable.Filtered := True;
CardTinyTable.First;
for I := 0 to CardTinyTable.RecordCount - 1 do
begin
ListItem := ListView.Items.Add;
ListItem.Data := Pointer(CardTinyTable.FieldByName('ID').AsInteger);
ListItem.Caption := CardTinyTable.FieldByName('Name').AsString;
List.Clear;
List.CommaText := CardTinyTable.FieldByName('Emails').AsString;
if List.Count > 0 then Email := List[0]
else Email := '';
ListItem.SubItems.Add(Email);
ListItem.SubItems.Add(CardTinyTable.FieldByName('HandTel').AsString);
ListItem.ImageIndex := 2;
CardTinyTable.Next;
end;
finally
ListView.Items.EndUpdate;
List.Free;
end;
StatusBar.SimpleText := IntToStr(ListView.Items.Count) + ' Items';
end;
procedure TMainForm.UpdateListItem(ListItem: TListItem; CardData: TCardFormData);
var
List: TStrings;
Email: string;
begin
List := TStringList.Create;
try
ListItem.Caption := CardData.Name;
List.CommaText := CardData.Emails;
if List.Count > 0 then Email := List[0]
else Email := '';
ListItem.SubItems[0] := Email;
ListItem.SubItems[1] := CardData.HandTel;
finally
List.Free;
end;
end;
procedure TMainForm.LoadCardData(var CardData: TCardFormData);
begin
with CardData do
begin
Name := CardTinyTable.FieldByName('Name').AsString;
Nickname := CardTinyTable.FieldByName('Nickname').AsString;
Emails := CardTinyTable.FieldByName('Emails').AsString;
HandTel := CardTinyTable.FieldByName('HandTel').AsString;
BP := CardTinyTable.FieldByName('BP').AsString;
Oicq := CardTinyTable.FieldByName('Oicq').AsString;
Icq := CardTinyTable.FieldByName('Icq').AsString;
Sex := CardTinyTable.FieldByName('Sex').AsInteger;
Birthday := CardTinyTable.FieldByName('Birthday').AsDateTime;
UseBirth := CardTinyTable.FieldByName('UseBirth').AsBoolean;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -