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

📄 main.~pas

📁 求是科技出版的《Delphi串口通信工程开发实例导航》所有的源代码。是一本很好的书。拿出来与大家共享。
💻 ~PAS
📖 第 1 页 / 共 3 页
字号:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Menus, StdCtrls, Buttons, ComCtrls, ToolWin, ImgList,
  Account, Config, LeftView, RightView, TopView, BottomView, CoreData, Login,
  Psock, NMpop3, mmSystem, OleCtrls, MSCommLib_TLB, ShellAPI;

type
  TfrmMain = class(TForm)
    frmLeft: TfrmLeft;
    Splitter1: TSplitter;
    frmRight: TfrmRight;
    MainMenu: TMainMenu;
    MnFile: TMenuItem;
    MnExit: TMenuItem;
    MnTool: TMenuItem;
    MnAccount: TMenuItem;
    MnConfig: TMenuItem;
    MnCheck: TMenuItem;
    StatusBar1: TStatusBar;
    ToolBar1: TToolBar;
    tbtnAccount: TToolButton;
    tbtnConfig: TToolButton;
    tbtnCheck: TToolButton;
    tbtnSchedule: TToolButton;
    tbtnStop: TToolButton;
    tbtnExit: TToolButton;
    ToolButton8: TToolButton;
    PopupMenu1: TPopupMenu;
    ppMAccount: TMenuItem;
    ppMConfig: TMenuItem;
    NMPOP3: TNMPOP3;
    TimCheck: TTimer;
    TimShow: TTimer;
    MSComm: TMSComm;
    imlToolbar: TImageList;
    imlMenu: TImageList;
    MnStop: TMenuItem;
    MnSchedule: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    imlEmail: TImageList;
    imlLog: TImageList;
    N3: TMenuItem;
    ppMCheck: TMenuItem;
    ppMStop: TMenuItem;
    N4: TMenuItem;
    ppMExit: TMenuItem;
    ppMRestore: TMenuItem;
    N5: TMenuItem;
    MnHelp: TMenuItem;
    MnAbout: TMenuItem;
    procedure BitBtn1Click(Sender: TObject);
    procedure MnAccountClick(Sender: TObject);
    procedure MnConfigClick(Sender: TObject);
    procedure tbtnCheckClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure MnCheckClick(Sender: TObject);
    procedure NMPOP3ConnectionFailed(Sender: TObject);
    procedure NMPOP3Failure(Sender: TObject);
    procedure NMPOP3AuthenticationFailed(var Handled: Boolean);
    procedure NMPOP3InvalidHost(var Handled: Boolean);
    procedure NMPOP3Success(Sender: TObject);
    procedure NMPOP3HostResolved(Sender: TComponent);
    procedure frmToptabAccountChange(Sender: TObject);
    procedure TimCheckTimer(Sender: TObject);
    procedure TimShowTimer(Sender: TObject);
    procedure tbtnAccountClick(Sender: TObject);
    procedure tbtnConfigClick(Sender: TObject);
    procedure tbtnStopClick(Sender: TObject);
    procedure tbtnExitClick(Sender: TObject);
    procedure MnExitClick(Sender: TObject);
    procedure tbtnScheduleClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ppMAccountClick(Sender: TObject);
    procedure ppMConfigClick(Sender: TObject);
    procedure ppMCheckClick(Sender: TObject);
    procedure ppMStopClick(Sender: TObject);
    procedure MnStopClick(Sender: TObject);
    procedure MnScheduleClick(Sender: TObject);
    procedure ppMRestoreClick(Sender: TObject);
    procedure ppMExitClick(Sender: TObject);
  private
    { Private declarations }
    procedure UpdateLeftView();  // 更新左侧视图
    procedure UpdateTopView();   // 更新上侧视图
    procedure UpdateEmailList(lst : TList); // 更新当前账号的邮件列表
    
    procedure StartCheckMail(); // 开始检测邮件
    function IsMailExist(MsgId : string; Act : TAccountInfo) : Boolean; //检测邮件MsgId在pAccount中是否已经存在
    procedure AddLog(msg : string; const LogTp : integer);
    procedure OnAppMinimize(Sender: TObject); // 应用程序最小化响应函数

    procedure SendSMS(lst : TList; Mobile : string); // 将 lst 中的邮件编辑短信发送到手机
    function OpenPort() : Boolean;
    procedure IniSMS(); // 初始化短消息
    procedure SendInEncodeText(sms : string; mobile : string);  // Text mode
    procedure SendInEncodePdu(sms : string; mobile : string);   // pdu mode
    function ExchangeCode(src : string) : string;
    function EncodeGb(var s:WideString):String;

    //
    // 自定义消息
    //
    procedure IniFinished(var Msg : TMessage); message WM_INIFINISHED;
    procedure  OnNotify(var Msg : TMessage); message WM_NOTIFY;



  public
    { Public declarations }
  end;

var
        frmMain: TfrmMain;
        m_HideLeft : Boolean;   // 左侧视图是否被隐藏
        m_IsCancel : Boolean;   // 是否取消对本账号的检测
        m_IsFirstConn : Boolean;// 第一次连接
        m_CheckTime : TTime;    // 上一次检测时间
        m_IsStop : Boolean;     // 是否接到停止命令
        NotifyIcon : TNotifyIconData;
Const
        INFO = 0;      // 信息
        WARNING = 1;   // 警告
        ERROR = 2;     // 错误
        SMS = 3;       // 发送短信
        SCHEDULE = 4;  // 定时检测标志
implementation

{$R *.dfm}

//
//
//
procedure TfrmMain.BitBtn1Click(Sender: TObject);
begin
end;

//
// 账号菜单 单击事件处理函数
//
procedure TfrmMain.MnAccountClick(Sender: TObject);
//var
//        str1 : string;
begin
        frmAccount.ShowModal();
        if not Account.m_IsChanged then
                exit;
        //
        // 如果邮件账号修改了,则更新上侧和左侧视图
        //
        UpDateTopView();
        UpdateLeftView();

end;

//
// 设置菜单 单击事件处理函数
//
procedure TfrmMain.MnConfigClick(Sender: TObject);
begin
        TimCheck.Enabled := False;
        Timshow.Enabled := False;

        frmConfig.ShowModal();
        //
        // 更新NMPOP3的设置
        //
        TimCheck.Interval := Config.m_Config.m_Interval * 60 * 1000;
        NMPOP3.TimeOut := Config.m_Config.m_Timeout * 60 * 1000;
        //
        // 更新MSComm的设置
        //
        MSComm.CommPort := Config.m_Com.m_ComPort;
        MSComm.Settings := Config.m_Com.m_BaudRate + ',' + Copy(Config.m_Com.m_Parity, 0, 1) + ',' + Config.m_Com.m_DataBits + Config.m_Com.m_StopBits;
        //
        // 重新计时
        //
        m_CheckTime := Time;
        TimCheck.Enabled := True;
        TimShow.Enabled := True;
end;


procedure TfrmMain.tbtnCheckClick(Sender: TObject);
begin
        MnCheckClick(Sender);        
end;

//
// 更新左侧视图
//
procedure TfrmMain.UpdateLeftView;
var
        TreeNode : TTreeNode;
        SelTreeNode : TTreeNode;
        SelIndex : integer;     // Tab 的当前活动索引
        pAccount : ^TAccountInfo;
        cnt : string;
begin
        SelIndex := frmRight.frmTop.tabAccount.TabIndex;
        if SelIndex < 0 then
                exit;

        pAccount := Account.m_lstAccount.Items[SelIndex];
        if pAccount^.m_lstEmail = nil then
                cnt := '0'
        else
                str(pAccount^.m_lstEmail.Count, cnt);

        //
        // 清空当前树中的结点
        //
        frmLeft.treAccount.Items.Clear();
        //
        // 为其添加新结点
        //
        TreeNode := TTreeNode.Create(frmLeft.treAccount.Items);
        TreeNode := frmLeft.treAccount.Items.Add(TreeNode, '帐号:' + pAccount^.m_Account);
        frmLeft.treAccount.Items.AddChild(TreeNode, 'POP服务器:' + pAccount^.m_Server);
        frmLeft.treAccount.Items.AddChild(TreeNode, '端口:' + pAccount^.m_Port);
        frmLeft.treAccount.Items.AddChild(TreeNode, '用户名:' + pAccount^.m_User);
        frmLeft.treAccount.Items.AddChild(TreeNode, '手机号:' + pAccount^.m_Mobile);
        SelTreeNode := frmLeft.treAccount.Items.AddChild(TreeNode, '邮件数:' + cnt);

        //
        // 设置各个结点的图标
        //
        frmLeft.treAccount.Items.Item[1].ImageIndex := 1;
        frmLeft.treAccount.Items.Item[2].ImageIndex := 2;
        frmLeft.treAccount.Items.Item[3].ImageIndex := 3;
        frmLeft.treAccount.Items.Item[4].ImageIndex := 4;
        frmLeft.treAccount.Items.Item[5].ImageIndex := 5;

        //
        // 设置当前选种的节点
        //
        frmLeft.treAccount.Selected := SelTreeNode;
end;

//
// 更新上侧视图
//
procedure TfrmMain.UpdateTopView;
var
        i : integer;
        pAccount : ^TAccountInfo;
begin
        //
        // 清空当前所有的账号
        //
        frmRight.frmTop.tabAccount.Tabs.Clear();
        if Account.m_lstAccount = nil then
        begin
	        frmRight.frmTop.lsvEmail.Clear();
                exit;
        end;
        //
        // 加入m_lstAccount中的账号
        //
        for i := 0 to Account.m_lstAccount.Count - 1 do
        begin
                pAccount := Account.m_lstAccount.Items[i];
                frmRight.frmTop.tabAccount.Tabs.Add(pAccount^.m_Account);
        end;
        if Account.m_lstAccount.Count = 0 then
        begin
	        frmRight.frmTop.lsvEmail.Clear();
        end;
end;

//
// MainForm 创建时响应的函数
//
procedure TfrmMain.FormCreate(Sender: TObject);
var
        Icon : TIcon;
begin
        //
        // 默认左侧视图可见
        //
        m_HideLeft := false;
        //
	// 给Config传递frmMain的句柄,从Config向frmMain发送消息时用到
	//
        Config.m_MainhWnd :=self.Handle;

        //
        //NotifyIcon为全局变量,在程序的开头已经定义了
        //
        with NotifyIcon do
        begin
                cbSize:=SizeOf(TNotifyIconData);
                Wnd:=Handle;   //指向当前窗体frmMain的句柄
                uID:=1;
                uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
                uCallBackMessage:=WM_NOTIFY;
                hIcon:=Application.Icon.Handle;
                icon := TIcon.Create();
                frmmain.imlToolbar.GetIcon(0, icon);
                hIcon := icon.Handle;
                szTip:='邮件短信发送程序';
        end;
        Application.OnMinimize := OnAppMinimize;
end;

//
// 检测菜单项响应函数
//
procedure TfrmMain.MnCheckClick(Sender: TObject);
begin
        TimCheck.Enabled := False;
        TimShow.Enabled := False;
        StartCheckMail();
        m_CheckTime := Time;
        TimCheck.Enabled := True;
        TimShow.Enabled := True;
end;

//
// 检测邮件
//
procedure TfrmMain.StartCheckMail;
var
        act_index, mail_index : integer;
        pAccount : ^TAccountInfo;
        pEmail : ^TEmailInfo;
        lstNewMail : TList;     // 新邮件暂存链表
        tmp : string;
        m_IsReLogin : Boolean;  // 是否因默认用户名和密码不匹配而重新登录
        m_HaveNewMail : Boolean; // 有新邮件

begin
        if (Account.m_lstAccount = nil) or (m_lstAccount.Count <= 0) then
                exit;
        m_HaveNewMail := False;

        m_IsStop := False;
        for act_index := 0 to Account.m_lstAccount.Count - 1 do
        begin
                if m_IsStop then
                begin
                        AddLog('用户取消操作', WARNING);
                        exit;
                end;
                //

⌨️ 快捷键说明

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