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

📄 mainfrm.pas

📁 优秀的本地存储数据库
💻 PAS
📖 第 1 页 / 共 2 页
字号:

{**********************************************************}
{                                                          }
{  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 + -