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

📄 mainfrm.pas

📁 《Delphi实例开发教程》源代码包说明
💻 PAS
字号:
unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, DB, DBTables, ComCtrls, StdCtrls, CheckLst,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  ExtCtrls, ShellAPI, Grids, DBGrids, ADODB, Menus;

const
  MY_MESSAGE=WM_USER+100;

type
  TfrmMain = class(TForm)
    sbCustomSearch: TSpeedButton;
    qryDisplay1: TQuery;
    dsDisplay: TDataSource;
    sbSetting: TSpeedButton;
    sbViewInfo: TSpeedButton;
    qryCheck1: TQuery;
    dsCheck: TDataSource;
    dssearch: TDataSource;
    qrySearch1: TQuery;
    qryCustom1: TQuery;
    dsCustom: TDataSource;
    qryInfo1: TQuery;
    dsInfo: TDataSource;
    daSetting: TDataSource;
    qrySetting1: TQuery;
    qrySiteSearch1: TQuery;
    dsSiteSearch: TDataSource;
    dsTemp: TDataSource;
    qryTemp1: TQuery;
    pnlRollNews: TPanel;
    lblRoll1: TLabel;
    lblRoll2: TLabel;
    lblRoll3: TLabel;
    sbRollNews: TSpeedButton;
    tmRollColor: TTimer;
    IdhttpHTTP: TIdHTTP;
    AdoqDisplay: TADOQuery;
    AdoqCheck: TADOQuery;
    AdoqSetting: TADOQuery;
    AdoqSiteSearch: TADOQuery;
    AdoqSearch: TADOQuery;
    AdoqInfo: TADOQuery;
    AdoqCustom: TADOQuery;
    AdoqTemp: TADOQuery;
    AdocnDate: TADOConnection;
    imgUI: TImage;
    pmIconMenu: TPopupMenu;
    pmiRevert: TMenuItem;
    pmiExit: TMenuItem;
    sbMinimize: TSpeedButton;
    sbExit: TSpeedButton;
    tmRollNews: TTimer;
    sbHelp: TSpeedButton;
    procedure HideAppInTaskBar(Sender: TObject);
    procedure RestoreApplication(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure CloseAllForm;
    procedure sbCustomSearchClick(Sender: TObject);
    procedure MyExecSQL(Query: TAdoQuery; SQLString: string);
    procedure RestoreList(Sender: TObject; num: integer);
    procedure GetList(Sender: TObject; var num: integer);
    procedure TransferTable(FromTable,ToTable,ID:string);
    procedure sbSettingClick(Sender: TObject);
    procedure sbViewInfoClick(Sender: TObject);
    procedure sbSiteSearchClick(Sender: TObject);
    procedure lblRoll3Click(Sender: TObject);
    procedure tmRollColorTimer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure sbMinimiseClick(Sender: TObject);
    procedure imgUIMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure pmiExitClick(Sender: TObject);
    procedure pmiRevertClick(Sender: TObject);
    procedure sbExitClick(Sender: TObject);
    procedure sbMinimizeClick(Sender: TObject);
    procedure sbRollNewsClick(Sender: TObject);
    procedure lblRoll3MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure lblRoll3MouseLeave(Sender: TObject);
    procedure sbHelpClick(Sender: TObject);
  private
    { Private declarations } 
    procedure OnIconNotify(var Message:Tmessage);
    Message MY_MESSAGE;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;
  RollOrder: integer;
  TimeLimitMax,TimeLimitMin: Integer;
  WebtypeAmount,EngineAmount: Integer;
  NotifyIconData: TNotifyIconData;

function GetStrBetween(S: string; PrevStr,RearStr: string):string;
function DelSubStr(Substr: string; S: string):string;

implementation

uses SiteSearchFrm, MaintainFrm, CustomSearchFrm, SettingFrm, ViewInfoFrm,
  RollingNewsFrm;

{$R *.dfm}

procedure TfrmMain.HideAppInTaskBar(Sender: TObject);
begin                                      
  frmMain.Hide;
  ShowWindow(Application.Handle,SW_HIDE);
end;

procedure TfrmMain.RestoreApplication(Sender: TObject);
begin
//  frmMain.Show;
end;

//定义图标事件
procedure TfrmMain.OnIconNotify(var Message:TMessage);
var
  MousePoint: TPoint; //鼠标点击位置
begin
  inherited;

  //用鼠标左键点击图标
  if Message.LParam = WM_LBUTTONUP then
  begin

    //窗体显示时则隐藏
    if frmMain.Showing then
    begin
      Application.Minimize;
    end
    //窗体隐藏时则显示
    else
    begin
      pmiRevertClick(nil);
    end;
  end;
  //用鼠标右键点击图标
  if Message.LParam = WM_RBUTTONUP then
  begin
    GetCursorPos(MousePoint); //获取光标位置
    pmIconMenu.Popup(MousePoint.X, MousePoint.Y); //在光标位置弹出菜单
  end;
end;

//十进制数还原成二进制,再根据二进制的1和0对应还原列表中的内容
procedure TfrmMain.RestoreList(sender: TObject; num: integer);
var
  m,i,count:integer;
begin
  count:=(sender as TChecklistbox).Items.Count;
  m:=num;
  for i:=count-1 downto 0 do
  begin
    if (m mod 2)=1 then
      (sender as TChecklistbox).Checked[i]:=true
    else (sender as TChecklistbox).Checked[i]:=false;
    m:=m div 2;
  end;
end;

//把列表中的内容转换成二进制的1和0,再把二进制数变成十进制数
procedure TfrmMain.GetList(Sender: TObject; var num: integer);//Var 是参数地址传递
var
  m,i,count:integer;
begin
  m:=0;
  count:=(sender as TChecklistbox).Items.Count;
  for i:=0 to count-1 do
    if (sender as TChecklistbox).Checked[i]=true then m:=m*2+1
    else m:=m*2;
  num:=m;  
end;

//根据SQLString字符串执行SQL语句
procedure TfrmMain.MyExecSQL(Query: TADOQuery; SQLString: string);
begin
  with Query do
  begin
    SQL.Clear;
    SQL.Add(SQLString);
    Open;
  end;
end;

//获取在S中第一个夹在PrevStr和RearStr中间的子字符串
function GetStrBetween(S: string; PrevStr,RearStr: string):string;
var
  PSLength,Index,Count:Integer;
  tmpString:string;
begin
  //如果在S中找不到PrevStr或者RearStr,返回空字符串
  if (Pos(PrevStr,S)=0) or (Pos(RearStr,S)=0) then
  begin
    Result:='';
    Exit;
  end;

  PSLength:=Length(PrevStr);
  //找到PrevStr后面的字符串的位置
  Index:=Pos(PrevStr,S)+PSLength;
  //截取PrevStr后面的所有字符串
  tmpString:=Copy(S,Index,Length(S));
  //如果在PrevStr后面没有RearStr,返回空字符串
  if Pos(RearStr,tmpString)=0 then
  begin
    Result:='';
    Exit;
  end;
  //得到要返回的字符串的长度
  Count:=Pos(RearStr,tmpString)-1;

  Result:=Copy(S,Index,Count);
end;


//删除S中的所有Substr子字符串
function DelSubStr(Substr: string; S: string):string;
var
  SubstrLength,SLength:Integer;
  PrevStr,RearStr:string;
begin
  SubstrLength:=Length(Substr);
  SLength:=Length(S);
  //删除过程
  while Pos(Substr,S)>0 do
  begin
    //找出Substr前面的所有子字符串
    PrevStr:=Copy(S,1,Pos(Substr,S)-1);
    //找出Substr后面的所有子字符串
    RearStr:=Copy(S,Pos(Substr,S)+SubstrLength,SLength);
    //前后相加,就得出删除掉了夹在中间的Substr后的子字符串
    S:=PrevStr+RearStr;
  end;
  Result:=S;
end;

//把数据从一个数据库中转到另外一个数据库
procedure TfrmMain.TransferTable(FromTable,ToTable,ID:string);
var
  SQLString:string;
  qryFrom,qryTo:TADOQuery;
begin

  //初始化query
 { qryFrom:=TQuery.Create(nil);
  qryFrom.DatabaseName:=extractfilepath(application.ExeName)+'database';
  qryFrom.RequestLive:=True;

  qryTo:=TQuery.Create(nil);
  qryTo.DatabaseName:=extractfilepath(application.ExeName)+'database';
  qryTo.RequestLive:=True;}
  qryFrom:=TADOQuery.Create(nil);
  qryFrom.Connection:=frmMain.AdocnDate;
  qryTo:=TADOQuery.Create(nil);
  qryto.Connection:=frmMain.AdocnDate;

  with qryFrom do
  begin
    //选出源表的所有记录
    MyExecSQL(qryFrom,'select * from '+FromTable+' where ID='+QuotedStr(ID)); //quote是加上双引号
    qryFrom.Active:=true;
    while not Eof do
    begin
      with qryTo do
      begin
        //选出目标表中不同地址的所有记录
        SQLString:='select * from '+ToTable+' where link='+QuotedStr(qryfrom.fieldbyname('link').AsString)
                  +' and ID='+QuotedStr(ID);
        MyExecSQL(qryTo,SQLString);
        Edit;
        //记录传递
        qryTo.FieldByName('ID').AsString:=ID;
        qryTo.FieldByName('Head').AsString:=qryFrom.FieldByName('Head').AsString;
        qryTo.FieldByName('Datetime').AsDateTime:=qryFrom.FieldByName('Datetime').AsDateTime;
        qryTo.FieldByName('Type').AsString:=qryFrom.FieldByName('Type').AsString;
        qryTo.FieldByName('Source').AsString:=qryFrom.FieldByName('Source').AsString;
        qryTo.FieldByName('Link').AsString:=qryFrom.FieldByName('Link').AsString;
        qryTo.FieldByName('Content').AsString:=qryFrom.FieldByName('Content').AsString;
        qryTo.FieldByName('Systime').AsDateTime:=qryFrom.FieldByName('Systime').AsDateTime;
        //插入记录
        qryTo.Insert;
      end;
      Next;
    end;
  end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
  //hr :  THandle;
  Sem  : THandle;
begin
   //判断是否已经有一个实例在运行,是则退出
   Sem := CreateSemaphore(nil,0,1,'PROGRAM_NAME');
   if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
   begin 
     CloseHandle( Sem );
     ShowMessage('程序正在运行!');
     Application.Terminate;
     Exit;
   end;

  //最小化窗体时隐藏
  Application.OnMinimize:=frmMain.HideAppInTaskBar;

  AdocnDate.Connected:=false;
  {AdocnDate.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'
          +'Data Source='+extractfilepath(application.ExeName)+'database\date.mdb;'
          +'Persist Security Info=False';}
  AdocnDate.Connected:=true;
  frmMain.Left:=Trunc((Screen.Width-frmMain.Width)/2);
  frmMain.Top:=1;

  //设定超时限制范围
  TimeLimitMin:=1;
  TimeLimitMax:=10;

  //设定网站类型和引擎数量
  WebtypeAmount:=4;
  EngineAmount:=5;

//  hr:=CreateEllipticRgn(0,0,width,height);//定义椭圆窗口(win API函数)
//  setwindowrgn(handle,hr,true); //设置椭圆窗口
  RollOrder:=1;

  //qryDisplay.DatabaseName:=extractfilepath(application.ExeName)+'database';
  //qryDisplay.Active:=true;
  AdoqDisplay.Connection:=AdocnDate;
  AdoqDisplay.Active:=true;

  //qryCheck.DatabaseName:=extractfilepath(application.ExeName)+'database';
  //qryCheck.Active:=true;
  AdoqCheck.Connection:=AdocnDate;
  AdoqCheck.Active:=true;

  //qrySearch.DatabaseName:=extractfilepath(application.ExeName)+'database';
  //qrySearch.Active:=true;
  AdoqSearch.Connection:=AdocnDate;
  AdoqSearch.Active:=true;

  //qryCustom.DatabaseName:=extractfilepath(application.ExeName)+'database';
  //qryCustom.Active:=true;
  AdoqCustom.Connection:=AdocnDate;
  AdoqCustom.Active:=true;

  //qryInfo.DatabaseName:=extractfilepath(application.ExeName)+'database';
 // qryInfo.Active:=true;
  AdoqInfo.Connection:=AdocnDate;
  AdoqInfo.Active:=true;

 // qrySiteSearch.DatabaseName:=extractfilepath(application.ExeName)+'database';
 // qrySiteSearch.Active:=true;
  AdoqSiteSearch.Connection:=AdocnDate;

  //qrySetting.DatabaseName:=extractfilepath(application.ExeName)+'database';
  //qrySetting.Active:=true;
  AdoqSetting.Connection:=AdocnDate;
  AdoqSetting.Active:=true;

  //qryTemp.DatabaseName:=extractfilepath(application.ExeName)+'database';
 // qryTemp.Active:=true;
  AdoqTemp.Connection:=AdocnDate;
  AdoqTemp.Active:=true;

  //设置系统状态栏
  NotifyIconData.cbSize:=SizeOf(NotifyIconData);
  NotifyIconData.Wnd:=Handle;
  NotifyIconData.hIcon:=Application.Icon.Handle;
  NotifyIconData.uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE;;
  NotifyIconData.uID:=1000;
  NotifyIconData.szTip:='频道播放器';
  NotifyIconData.uCallbackMessage:=MY_MESSAGE;
  Shell_NotifyIcon(NIM_ADD,@NotifyIconData);
end;

procedure TfrmMain.CloseAllForm;
begin
  if frmCustomSearch.Showing then
    frmCustomSearch.Close;
  if frmViewInfo.Showing then
    frmViewInfo.Close;
 // if frmSiteSearch.Showing then
   // frmSiteSearch.Close;
end;

procedure TfrmMain.sbCustomSearchClick(Sender: TObject);
begin
  CloseAllForm;
  frmCustomSearch.show;
end;

procedure TfrmMain.sbSettingClick(Sender: TObject);
begin
  frmSetting.show;
end;

procedure TfrmMain.sbViewInfoClick(Sender: TObject);
begin
  CloseAllForm;
  frmViewInfo.show;
end;

procedure TfrmMain.sbSiteSearchClick(Sender: TObject);
begin
  CloseAllForm;
  frmSiteSearch.Show;
end;

procedure TfrmMain.sbRollNewsClick(Sender: TObject);
begin
  frmRollingNews.showmodal;
end;

procedure TfrmMain.lblRoll3Click(Sender: TObject);
var
  Connection:string;
  Handle:HWND;
begin
  Connection:=(sender as tlabel).Hint;
  ShellExecute(Handle,nil,pchar(Connection),nil,nil,SW_SHOWNORMAL);
end;

procedure TfrmMain.tmRollColorTimer(Sender: TObject);
begin
  tmRollColor.Tag:=tmRollColor.Tag+1;
  case (tmRollColor.Tag mod 3) of
   0:  pnlRollNews.Font.Color:=clBlue;
   1:  pnlRollNews.Font.Color:=clRed;
   2:  pnlRollNews.Font.Color:=clSilver;
  end;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if not(CustomSearchFrm.Finished) then
    frmCustomSearch.sbStop.Click;
//  with qrySearch do
  with frmMain.AdoqSearch do
  begin
    SQL.Clear;
    SQL.Add('delete from temp');
    ExecSQL;
  end;

  //取消系统状态栏图标
  Shell_NotifyIcon(NIM_DELETE,@NotifyIconData);
end;

procedure TfrmMain.sbMinimiseClick(Sender: TObject);
begin
  frmMain.WindowState:=wsMinimized;
end;

procedure TfrmMain.imgUIMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Perform(WM_SYSCOMMAND, $F012, 0);
end;

procedure TfrmMain.pmiExitClick(Sender: TObject);
begin
  frmMain.Close;
end;

procedure TfrmMain.pmiRevertClick(Sender: TObject);
begin
  frmMain.Show;       
  Application.Restore;
  Application.BringToFront;
end;

procedure TfrmMain.sbExitClick(Sender: TObject);
begin
  frmMain.Close;
end;

procedure TfrmMain.sbMinimizeClick(Sender: TObject);
begin
  Application.Minimize;
end;

procedure TfrmMain.lblRoll3MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  frmRollingNews.tmRollNews.Enabled:=false;
end;

procedure TfrmMain.lblRoll3MouseLeave(Sender: TObject);
begin
  frmRollingNews.tmRollNews.Enabled:=true;
end;

procedure TfrmMain.sbHelpClick(Sender: TObject);
begin
  ShellExecute(HANDLE,'open','Help\帮助.chm','-s','',SW_ShowNormal);
end;

end.

⌨️ 快捷键说明

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