1. 程式人生 > > 開發一個delphi寫的桌面圖示管理程式碼

開發一個delphi寫的桌面圖示管理程式碼

參加工作了就很少有時間去玩delphi了,這個適合初學者看看,大神勿噴 工具 delhpi7.0 access資料庫 原則win下有安裝office就可用 當初不太熟悉sqlite所有沒用這做資料庫。

{*****************************************************************************
* 版本資訊:
*     淺諾桌面管理工具v1.0
* 檔名稱:
*     UseShortcutKey.pas
* 內容摘要:
*     桌面快捷方式管理(分類及執行)
* 歷史記錄:
*     2013.1.28 created by xzj
* 大型修改:
*     2013.2.5 modified by xzj
*     快捷方式名稱不顯示快捷方式ID,相關功能做相應的修改,將ID存放在陣列naID中
*
* 程式為作者原創,修改請保留作者資訊,改後程序可發至作者郵箱共同參考、共同進步,
* 謝謝支援。
******************************************************************************}
unit UseShortcutKey;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TntStdCtrls, jpeg, ExtCtrls, TntExtCtrls, TntForms,
  ComCtrls, TntComCtrls, ImgList, DB, ADODB, Menus, TntMenus, Buttons, RzTray,
  TntButtons, Spin, RzButton, Mask, RzEdit, RzBtnEdt, RzBmpBtn, RzCmboBx,
  RzTabs, RzTrkBar, WinSkinStore, WinSkinData;
const
  WM_MouseEnter = $B013;
  WM_MouseLeave = $B014;
type
  TFormUse = class(TForm)
    imglogo: TTntImage;
    lblName: TTntLabel;
    lbl1: TTntLabel;
    lbl2: TTntLabel;
    tntscrlbxType: TTntScrollBox;
    tntpmnType: TTntPopupMenu;
    tmr1: TTimer;
    con1: TADOConnection;
    qryCmd: TADOQuery;
    il1: TImageList;
    ImageTxt: TImage;
    ImageRAR: TImage;
    ImageFiles: TImage;
    ImageMDB: TImage;
    ImageXLS: TImage;
    ImageDOC: TImage;
    ImagePPT: TImage;
    Imagepsd: TImage;
    ImagePhoto: TImage;
    Imagepdf: TImage;
    ImageDPR: TImage;
    ImagePAS: TImage;
    Imagedfm: TImage;
    ImageDLL: TImage;
    ImageWZ: TImage;
    Image1: TImage;
    Image2: TImage;
    rztrycn1: TRzTrayIcon;
    tntmntmAdd: TTntMenuItem;
    tntpgcntrl1: TTntPageControl;
    pg1: TTntTabSheet;
    edtAdd: TTntEdit;
    pg2: TTntTabSheet;
    edtEdt: TTntEdit;
    tntmntmqx: TTntMenuItem;
    tntpmnPro: TTntPopupMenu;
    tntmntmEdtPro: TTntMenuItem;
    tntmntmDelPro: TTntMenuItem;
    tntmntmTail: TTntMenuItem;
    tntmntmList: TTntMenuItem;
    tntmntmdefault: TTntMenuItem;
    tntmntmN1: TTntMenuItem;
    tntmntmWc: TTntMenuItem;
    tntpmnOperbtn: TTntPopupMenu;
    tntmntmEdit: TTntMenuItem;
    tntmntmdelete: TTntMenuItem;
    lbl3: TTntLabel;
    edtnow: TTntEdit;
    lbl4: TTntLabel;
    tntmntmN2: TTntMenuItem;
    tntmntmhide: TTntMenuItem;
    N1: TTntMenuItem;
    tntmntmdelall: TTntMenuItem;
    Imagebat: TImage;
    tntmntmdelalltype: TTntMenuItem;
    tntmntmN3: TTntMenuItem;
    tntcntrlbr1: TTntControlBar;
    tntmntmSendLink: TTntMenuItem;
    tntmntmN4: TTntMenuItem;
    tntpmnPC: TTntPopupMenu;
    btnPC: TRzMenuButton;
    btn1: TRzShapeButton;
    tntpmnMN: TTntPopupMenu;
    tntmntmClose: TTntMenuItem;
    tmr2: TTimer;
    tntmntmAutoOpen: TTntMenuItem;
    tntmntmSendAll: TTntMenuItem;
    edtTime: TTntEdit;
    tmr3: TTimer;
    tmrRe: TTimer;
    edtKeyNow: TTntEdit;
    tmrsx: TTimer;
    pnl1: TPanel;
    grp1: TGroupBox;
    qrySet: TADOQuery;
    qryInit: TADOQuery;
    tntpgcntrl2: TRzPageControl;
    pg3: TRzTabSheet;
    lvPro: TTntListView;
    pg4: TRzTabSheet;
    mmo1: TTntMemo;
    pg5: TRzTabSheet;
    tntpnl1: TTntPanel;
    tntmntmN5: TTntMenuItem;
    tntmntmexit: TTntMenuItem;
    tntmntmHideZT: TTntMenuItem;
    tntmntmHideV: TTntMenuItem;
    grp2: TTntGroupBox;
    lbl5: TTntLabel;
    cbbFC: TRzColorComboBox;
    lbl6: TTntLabel;
    cbbFONTC: TRzColorComboBox;
    cbbGC: TRzColorComboBox;
    lbl7: TTntLabel;
    lbl9: TTntLabel;
    cbbEC: TRzColorComboBox;
    cbbFT: TRzComboBox;
    lbl8: TTntLabel;
    lbl11: TTntLabel;
    cbbHD: TRzComboBox;
    cbbSH: TRzComboBox;
    lbl10: TTntLabel;
    lbl12: TTntLabel;
    rztrckbr1: TRzTrackBar;
    dlgFont1: TFontDialog;
    lbl13: TTntLabel;
    btn2: TRzButtonEdit;
    skndt1: TSkinData;
    sknstr1: TSkinStore;
    procedure FormCreate(Sender: TObject);
    procedure BtnTypeClick (Sender: TObject);
    procedure LoadShortcutKey(Sender : TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure edtAddKeyPress(Sender: TObject; var Key: Char);
    procedure tntmntmAddClick(Sender: TObject);
    procedure edtEdtKeyPress(Sender: TObject; var Key: Char);
    procedure Openqry(var qry1 : TADOQuery; sqltxt : string);
    procedure Execqry(var qry1 : TADOQuery; sqltxt : string);
    procedure tntmntmqxClick(Sender: TObject);
    procedure lvProDblClick(Sender: TObject);
    procedure tntmntmTailClick(Sender: TObject);
    procedure tntmntmListClick(Sender: TObject);
    procedure tntmntmdefaultClick(Sender: TObject);
    procedure tntmntmEdtProClick(Sender: TObject);
    procedure tntmntmWcClick(Sender: TObject);
    procedure LBWindowProc(var Message: TMessage);
    procedure WMDROPFILES_L(var Msg: TMessage);
    procedure tntmntmDelProClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure tntmntmEditClick(Sender: TObject);
    procedure tntmntmdeleteClick(Sender: TObject);
    procedure tntmntmhideClick(Sender: TObject);
    procedure lvProMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure tntmntmdelallClick(Sender: TObject);
    procedure lvProEdited(Sender: TObject; Item: TTntListItem;
      var S: WideString);
    procedure lvProKeyPress(Sender: TObject; var Key: Char);
    procedure tntmntmdelalltypeClick(Sender: TObject);
    procedure CreateLink(programPath,programArg,LinkPath,Descr : string);
    procedure tntmntmSendLinkClick(Sender: TObject);
    procedure GetSystemPath();
    procedure MenuBtnOnClick(Sender : TObject);
    procedure btn1Click(Sender: TObject);
    procedure tntmntmCloseClick(Sender: TObject);
    //procedure tmr2Timer(Sender: TObject);
    procedure tntmntmAutoOpenClick(Sender: TObject);
    procedure tntmntmSendAllClick(Sender: TObject);
    procedure tmr3Timer(Sender: TObject);
    procedure tmrReTimer(Sender: TObject);
    procedure tmrsxTimer(Sender: TObject);
    procedure cbbFCChange(Sender: TObject);
    procedure cbbFONTCChange(Sender: TObject);
    procedure cbbGCChange(Sender: TObject);
    procedure cbbECChange(Sender: TObject);
    procedure cbbFTChange(Sender: TObject);
    procedure cbbHDChange(Sender: TObject);
    procedure cbbSHChange(Sender: TObject);
    procedure InitForm();
    procedure AddInitForm();
    procedure tntmntmexitClick(Sender: TObject);
    procedure tntmntmHideZTClick(Sender: TObject);
    procedure tntmntmHideVClick(Sender: TObject);
    procedure rztrckbr1Change(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure imglogoMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure tntpnl1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure grp2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure tntpgcntrl2Change(Sender: TObject);
    procedure btn2ButtonClick(Sender: TObject);
  private
    { Private declarations }
    abtnType: array[1..50] of TRzBitBtn;  //分組按鈕
    anID : array[0..500] of Integer;
    sActiveBtn : string;                //當前活動的按鈕
    SYS_COLOR : TColor;      //窗體顏色
    FONT_COLOR : TColor;     //字型顏色
    GROUP_COLOR : TColor;    //被選中的分組字型顏色
    EDITING_COLOR : TColor;  //修改時介面顏色
    HIDE_DIRECTION : string; //窗體隱藏方向
    sTypeLoadFlag : string;  //型別載入標識(用於不重複載入)
    procedure WMMouseEnter(var Msg: TMessage); message WM_MouseEnter;
    procedure QNLoadType();
  public
    { Public declarations }
  end;

var
  FormUse: TFormUse;
  sPath: string;
  sType: string;
  hInNow : HKL;       //當前輸入法
  keyValue : string;  //按鍵查詢
  isEditing : Boolean; //是否是編輯狀態
  RWindowProc: TWndMethod;
  LWindowProc: TWndMethod;
  OldBtn : TRzBitBtn;
implementation
uses registry, shlobj, ActiveX, ComObj, ShellAPI;
{$R *.dfm}

{****************************************************************
* 過程名稱:  Openqry
* 功能描述:  資料庫查詢
* 引數說明:  TADOQuery,string
* 返 回 值:  無
* 歷史記錄:  2013.1.28 created by xzj
*****************************************************************}
procedure  TFormUse.Openqry(var qry1 : TADOQuery; sqltxt : string);
begin
  with qry1 do
  begin
    Close;
    sql.clear;
    sql.add(sqltxt);
    Open;
  end;
end;

{****************************************************************
* 過程名稱:  Execqry
* 功能描述:  資料庫操作
* 引數說明:  TADOQuery,string
* 返 回 值:  無
* 歷史記錄:  2013.1.28 created by xzj
*****************************************************************}
procedure  TFormUse.Execqry(var qry1 : TADOQuery; sqltxt : string);
begin
  with qry1 do
  begin
    Close;
    sql.clear;
    sql.add(sqltxt);
    ExecSQL;
  end;
end;

{****************************************************************
* 過程名稱:  WMMouseEnter
* 功能描述:  滑鼠碰到隱藏的窗體,窗體下拉
* 引數說明:  TMessage
* 返 回 值:  無
* 歷史記錄:  2013.1.28 created by xzj
*****************************************************************}
procedure TFormUse.WMMouseEnter(var Msg: TMessage);
var iIndex : Integer;
begin
  if (Top < 0) and (HIDE_DIRECTION = '向上隱藏') then
  begin
    //while(Top < 0) do
    //begin
    //  iIndex := 10;
    //  Top := Top + 2;
    //  while(iIndex > 0) do
    //  begin
    //    iIndex := iIndex - 1;
    //  end;
    //end;
    Top := 0;
    //為保證下拉窗體後呈現在最前面
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //將窗體推到最前
    //發現不取消效果更好
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //然後取消窗體最前
  end
  else if (Left < 0) and (HIDE_DIRECTION = '向左隱藏') then
  begin
    Left := 0;
    //為保證下拉窗體後呈現在最前面
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //將窗體推到最前
    //發現不取消效果更好
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //然後取消窗體最前
  end
  else if ((Left + Self.Width) > screen.Width) and (HIDE_DIRECTION = '向右隱藏') then
  begin
    Left := Screen.Width - Self.Width;
    //為保證下拉窗體後呈現在最前面
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //將窗體推到最前
    //發現不取消效果更好
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //然後取消窗體最前
  end
  else if ((Top + Self.Height) > Screen.Height) and (HIDE_DIRECTION = '向下隱藏') then
  begin
    Top := Screen.Height - Self.Height;
    //為保證下拉窗體後呈現在最前面
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //將窗體推到最前
    //發現不取消效果更好
    SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //然後取消窗體最前
  end;
  Tmr1.Enabled := True;
end;

{****************************************************************
* 過程名稱:  GetTempDirectory
* 功能描述:  取系統臨時路徑
* 引數說明:  無
* 返 回 值:  string 路徑
* 歷史記錄:  2013.1.28 created by xzj
*****************************************************************}
function GetTempDirectory: string; 
var
  TempDir: array[0..255] of Char;
begin
  GetTempPath(255, @TempDir);
  Result := StrPas(TempDir);

end;

{****************************************************************
* 過程名稱:  QNLoadType
* 功能描述:  載入型別選擇按鈕
* 引數說明:  無
* 返 回 值:  無
* 歷史記錄:  2013.1.28 created by xzj
*****************************************************************}
procedure TFormUse.QNLoadType();
var i, j,k,nRand : Integer;
    bmpName : string;
begin
  Randomize;
  with qryCmd do
  begin
    Close;
    SQL.Clear;
    SQL.Add('select * from PRO_TYPE');
    Open;
  end;
  //載入前釋放所有記憶體,防止記憶體衝突
  for k := 1 to 49 do
  begin
    if abtnType[k] <> nil then
    begin
      abtnType[k].Destroy;
      abtnType[k] := nil;
    end;
  end;

  nRand := Random(97) + 1;
  qryCmd.First;
  //預設讓第一個按鈕為‘所有程式’
  abtnType[1] := TRzBitBtn.Create(Self);
  abtnType[1].Height := 30;
  abtnType[1].Width := tntscrlbxType.Width - 5;
  abtnType[1].Top := 1;
  abtnType[1].Left := tntscrlbxType.Left;
  abtnType[1].Name := 'btn_0';
  abtnType[1].Parent := tntscrlbxType;
  abtnType[1].Caption := '所有程式';
  abtnType[1].ParentColor := True;
  abtnType[1].ParentFont := True;
  bmpName := 'emotions\' + IntToStr(nRand) + 'fixed.bmp';
  abtnType[1].Glyph.LoadFromFile(bmpName);
  abtnType[1].OnClick := BtnTypeClick;
  abtnType[1].Visible := True;
  OldBtn := abtnType[1];
  for i := 1 to qryCmd.RecordCount do
  begin
    nRand := Random(95) + 1;
    abtnType[i + 1] := TRzBitBtn.Create(Self);
    abtnType[i + 1].Height := 30;
    abtnType[i + 1].Width := tntscrlbxType.Width - 5;
    j := trunc(i / 1);
    abtnType[i + 1].Top := 1 + (abtnType[i + 1].Height + 1) * j;
    j := i mod 1;
    abtnType[i + 1].Left := abtnType[i + 1].Width * (j);
    abtnType[i + 1].Name := 'btn_' + inttostr(i + 1);
    abtnType[i + 1].Parent := tntscrlbxType;
    abtnType[i + 1].Caption := qryCmd.FieldByName('PRO_TYPE').Value;
    abtnType[i + 1].ParentColor := True;
    abtnType[i + 1].ParentFont := True;
    abtnType[i + 1].PopupMenu := tntpmnOperbtn;
    bmpName := 'emotions\' + IntToStr(nRand + 1) + 'fixed.bmp';
    abtnType[i + 1].Glyph.LoadFromFile(bmpName);
    abtnType[i + 1].OnClick := BtnTypeClick;
    abtnType[i + 1].Visible := True;
    //nNewTop := abtnType[i + 1].Top + 31;
    qryCmd.next;
  end;
  tntpgcntrl1.Visible := False;
end;

{****************************************************************
* 過程名稱:  LoadShortcutKey
* 功能描述:  載入快捷方式
* 引數說明:  Sender : TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.28 created by xzj
*****************************************************************}
procedure TFormUse.LoadShortcutKey(Sender : TObject);
var
  i : Integer;
  lListItem: TListItem;
  bmp: TBitmap;
  sFilePath: string;
begin
  qryCmd.First;
  il1.Clear;
  lvPro.Clear;

 for i := 0 to qryCmd.RecordCount - 1 do
  begin
    lListItem := lvPro.Items.Add;
    lListItem.Caption := Trim(qryCmd.fieldbyname('PRO_NAME').value);
    lListItem.ImageIndex := i;
    anID[lListItem.ImageIndex] := qryCmd.fieldbyname('ID').value;

   //讀取程式圖示
    sFilePath := qryCmd.FieldByName('PRO_PATH').Value;


    if (LowerCase(ExtractFileExt(sFilePath))) = '' then
      image1.Picture := ImageFiles.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.txt' then
      image1.Picture := ImageTxt.Picture
    else if ((LowerCase(ExtractFileExt(sFilePath))) = '.rar') or ((LowerCase(ExtractFileExt(sFilePath))) = '.zip') then
      image1.Picture := ImageRAR.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.mdb' then
      image1.Picture := ImageMDB.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.xls' then
      image1.Picture := Imagexls.Picture
    else if ((LowerCase(ExtractFileExt(sFilePath))) = '.doc')
            or ((LowerCase(ExtractFileExt(sFilePath))) = '.docx') then
      image1.Picture := Imagedoc.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.ppt' then
      image1.Picture := Imageppt.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.pdf' then
      image1.Picture := Imagepdf.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.psd' then
      image1.Picture := Imagepsd.Picture
    else if ((LowerCase(ExtractFileExt(sFilePath))) = '.jpg')
              or ((LowerCase(ExtractFileExt(sFilePath))) = '.bmp')
              or ((LowerCase(ExtractFileExt(sFilePath))) = '.jpeg')
              or ((LowerCase(ExtractFileExt(sFilePath))) = '.gif')
              or ((LowerCase(ExtractFileExt(sFilePath))) = '.cdr') then
      image1.Picture := ImagePhoto.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.dpr' then
      image1.Picture := Imagedpr.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.dfm' then
      image1.Picture := Imagedfm.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.pas' then
      image1.Picture := Imagepas.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.dll' then
      image1.Picture := Imagedll.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.bat' then
      image1.Picture := Imagebat.Picture
    else if (LowerCase(ExtractFileExt(sFilePath))) = '.exe' then
      image1.Picture.Icon.handle := ExtractIcon(hInstance, pchar(sFilePath), 0)
    else
      image1.Picture := Imagewz.Picture;

    bmp := TBitmap.Create;
    bmp.width := image1.Picture.Width;
    bmp.height := image1.Picture.Height;
    bmp.canvas.Draw(0, 0, image1.Picture.Graphic);
    bmp.SaveToFile(GetTempDirectory + 'QNsystem.bmp');
    image2.Picture.LoadFromFile(GetTempDirectory + 'QNsystem.bmp');
    il1.Add(image2.Picture.Bitmap, image2.Picture.bitmap);

    qryCmd.Next;
  end;
  qryCmd.Close;
end;

{****************************************************************
* 過程名稱:  BtnTypeClick
* 功能描述:  型別按鈕響應
* 引數說明:  Sender : TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.28 created by xzj
* 修改描述: 2013.2.3 modified by xzj
*            新增按鈕顏色改變功能,當前分組變為綠色
*            2013.2.17 modified by xzj
*            如果型別選擇與先前一樣則不重複載入快捷方式
*            2013.2.18 modified by xzj
*            修改2.17所修改的不重複載入,編輯後重新整理問題
*****************************************************************}
procedure TFormUse.BtnTypeClick(Sender : TObject);
var sqltxt : string;
begin
  keyValue := '';   //按鈕直接查詢要用的初始化
  if ActiveControl.ClassType <> TRzBitBtn then
    Exit;
  if Copy(ActiveControl.Name,1,4) <> 'btn_' then
    Exit;

  sType := TRzBitBtn(Sender).Caption;
  if (sTypeLoadFlag = sType) and (isEditing = false) then
  begin
    tntpgcntrl2.ActivePage := pg3;
    Exit;
  end;
  //按鈕顏色改變
  sTypeLoadFlag := sType;
  OldBtn.Font.Color := FONT_COLOR;
  OldBtn.ParentFont := True;
  TRzBitBtn(Sender).Font.Color := GROUP_COLOR;
  OldBtn := TRzBitBtn(Sender);

  if TRzBitBtn(Sender).Name = 'btn_0' then
  begin
    sqltxt := 'select * from PRO_LIST order by PRO_NAME';
  end
  else
  begin
    sqltxt := 'select * from PRO_LIST where PRO_TYPE = ''' + sType + ''' order by PRO_NAME';
  end;
  with qryCmd do
  begin
    Close;
    SQL.Clear;
    SQL.Add(sqltxt);
    Open;
  end;
  sActiveBtn := sType;
  edtnow.Text := sActiveBtn;
  pg3.Caption := sActiveBtn;
  LoadShortcutKey(Sender);
  tntpgcntrl2.ActivePage := pg3;
end;

{****************************************************************
* 過程名稱:  FormCreate
* 功能描述:  資料庫連線,載入分組
* 引數說明:  Sender : TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.29 created by xzj
*****************************************************************}
procedure TFormUse.FormCreate(Sender: TObject);
var
  sDir, connTmp: string;
begin
  getdir(0, sPath);
  sDir := ExtractFilePath(Application.ExeName);
  chDir(sDir); // 設定工作目錄為程式目錄。
  SetCurrentDir(sDir);
  connTmp := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + sDir + '\LIST.accdb;Persist Security Info=False';

  con1.ConnectionString := connTmp;
  con1.Open;

  TOP := 0;
  LEFT := 0;
  FormUse.Width := screen.Width div 2 - 20;
  FormUse.Height := screen.Height - 32;
  tntpgcntrl2.Align := alclient;
  lvPro.Align := alclient;
  InitForm();
  QNLoadType; //載入型別按鈕
end;

{****************************************************************
* 過程名稱:  tmr1Timer
* 功能描述:  滑鼠不在軟體介面時自動隱藏介面
* 引數說明:  Sender : TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.29 created by xzj
* 修改描述:  2013.2.1 modified by xzj
*            添加發送桌面快捷方式控制
*****************************************************************}
procedure TFormUse.tmr1Timer(Sender: TObject);
var
  rc: TRECT;
  pt: TPOINT;
begin
  if isEditing = True then
  begin
    Exit;
  end;
  GetWindowRect(self.Handle, rc);         //取窗體的矩形區域
  GetCursorPos(pt);                       //取得當前滑鼠所在位置
  if (not PtInRect(rc, pt)) then          //如果滑鼠不在窗體範圍內
  begin
    if (HIDE_DIRECTION = '向上隱藏') then          //如果目前窗體正吸附在螢幕上沿,則上移隱藏窗體
    begin
      Top := 0 - Height + 2;
    end
    else if (HIDE_DIRECTION = '向下隱藏') then
    begin
      Top := Screen.Height - 2;
    end
    else if (HIDE_DIRECTION = '向左隱藏') then
    begin
      Left := 0 - Self.Width + 2;
      Top := 0;
    end
    else
    begin
      Left := Screen.Width - 2;
      Top := 0;
    end;
    Tmr1.Enabled := False;      //窗體隱藏後定時器關閉
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); //將窗體推到最前
  end;
end;

{****************************************************************
* 過程名稱:  edtAddKeyPress
* 功能描述:  新增新分組,使用回車鍵按鈕事件來修改資料庫內容
* 引數說明:  Sender: TObject; var Key: Char
* 返 回 值:  無
* 歷史記錄:  2013.1.29 created by xzj
* 修改描述:  2013.2.1 modified by xzj
*            控制分組名不為空
*****************************************************************}
procedure TFormUse.edtAddKeyPress(Sender: TObject; var Key: Char);
var sqltxt : string;
begin
  if Key = #13 then
  begin
    if edtAdd.Text = '' then
    begin
      ShowMessagePos('類名不能為空',(Self.Left + 250),(Self.Top + 300));
      exit;
    end;

    sqltxt := 'select * from PRO_TYPE where PRO_TYPE = ''' + edtAdd.Text + ''' ';
    with qryCmd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(sqltxt);

      Open;
    end;
    if(qryCmd.RecordCount > 0) then
    begin
      ShowMessagePos('已存在名為' + edtAdd.Text + '的類別!',(Self.Left + 250),(Self.Top + 300));
      exit;
    end;
    sqltxt := 'insert into PRO_TYPE(PRO_TYPE) values(''' + edtAdd.Text + ''') ';
    with qryCmd do
    begin
      Close;
      SQL.Clear;
      SQL.Add(sqltxt);

      ExecSQL;
    end;
    edtAdd.Text := '按回車鍵確認';
    QNLoadType;   //重新載入分組
  end;
end;

{****************************************************************
* 過程名稱:  tntmntmAddClick
* 功能描述:  新增新分組,顯示輸入框
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.29 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmAddClick(Sender: TObject);
begin
  tntpgcntrl1.visible := True;
  tntpgcntrl1.activepage := pg1;
  edtAdd.SetFocus;
end;

{****************************************************************
* 過程名稱:  edtEdtKeyPress
* 功能描述:  修改分組,使用回車鍵按鈕事件來修改資料庫內容
* 引數說明:  Sender: TObject; var Key: Char
* 返 回 值:  無
* 歷史記錄:  2013.1.29 created by xzj
*****************************************************************}
procedure TFormUse.edtEdtKeyPress(Sender: TObject; var Key: Char);
var sqltxt,sqlEdtType,sqlEdtList : string;
begin
  if sActiveBtn = '' then
  begin
    ShowMessagePos('請選中要修改的類別!',(Self.Left + 250),(Self.Top + 300));
    exit;
  end;
  sqlEdtType := 'update PRO_TYPE set PRO_TYPE = ''' + edtEdt.Text +''' where PRO_TYPE = ''' + sActiveBtn + ''' ';
  sqlEdtList := 'update PRO_LIST set PRO_TYPE = ''' + edtEdt.Text +''' where PRO_TYPE = ''' + sActiveBtn + ''' ';
  if Key = #13 then
  begin
    if edtEdt.Text = '' then
    begin
      ShowMessagePos('類名不能為空',(Self.Left + 250),(Self.Top + 300));
      exit;
    end;
    sqltxt := 'select * from PRO_TYPE where PRO_TYPE = ''' + edtEdt.Text + ''' ';
    Openqry(qrycmd,sqltxt);
    if(qryCmd.RecordCount > 0) then
    begin
      ShowMessagePos('已存在名為' + edtEdt.Text + '的類別!',(Self.Left + 250),(Self.Top + 300));
      exit;
    end
    else
    begin
      Execqry(qryCmd,sqlEdtType);
      Execqry(qrycmd,sqlEdtList);
    end;
    edtAdd.Text := '按回車鍵確認';
    QNLoadType;  //重新載入分組
  end;
end;

{****************************************************************
* 過程名稱:  tntmntmqxClick
* 功能描述:  取消操作,隱藏新增和修改的page
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.29 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmqxClick(Sender: TObject);
begin
  tntpgcntrl1.visible := False;
end;

{****************************************************************
* 過程名稱:  lvProDblClick
* 功能描述:  雙擊快捷方式執行相應的程式
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
* 修改描述:
*            2013.1.31 modified by xzj
*            處於編輯狀態不讓執行程式
*****************************************************************}
procedure TFormUse.lvProDblClick(Sender: TObject);
var sActive,sqltxt : string;
begin

  if not Assigned(lvPro.Selected) then  //沒有選中快捷方式,執行無效
  begin
    Exit;
  end
  else if isEditing = True then
  begin
    ShowMessagePos('現在處於編輯狀態,請退出編輯',(Self.Left + 250),(Self.Top + 300));
    exit;
  end
  else
  begin
    //獲取被選中的快捷方式在資料庫中對應的ID
    sActive := IntToStr(anID[lvPro.Selected.ImageIndex]);
    //查詢對應的快捷方式記錄
    sqltxt := 'select * from PRO_LIST where ID = ' + sActive + '';
    Openqry(qryCmd,sqltxt);
    //找到記錄中的快捷方式路徑,開啟.exe檔案
    ShellExecute(handle, 'open', pchar(Trim(qryCmd.FieldByName('PRO_PATH').Value)), nil, nil, SW_SHOWNORMAL);

    //執行程式後隱藏窗體
    if (HIDE_DIRECTION = '向上隱藏') then          
    begin
      Top := 0 - Height + 2;
    end
    else if (HIDE_DIRECTION = '向下隱藏') then
    begin
      Top := Screen.Height - 2;
    end
    else if (HIDE_DIRECTION = '向左隱藏') then
    begin
      Left := 0 - Self.Width + 2;
      Top := 0;
    end
    else
    begin
      Left := Screen.Width - 2;
      Top := 0;
    end;
    //窗體隱藏後定時器關閉
    Tmr1.Enabled := False;
  end;
end;

{****************************************************************
* 過程名稱:  tntmntmTailClick
* 功能描述:  修改檢視方式為‘詳情’
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmTailClick(Sender: TObject);
begin
  lvPro.ViewStyle := vsSmallIcon;
  tntmntmTail.Checked := True;
  tntmntmList.Checked := False;
  tntmntmdefault.Checked := False;
end;

{****************************************************************
* 過程名稱:  tntmntmListClick
* 功能描述:  修改檢視方式為‘列表’
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmListClick(Sender: TObject);
begin
  lvPro.ViewStyle := vsList;
  tntmntmTail.Checked := False;
  tntmntmList.Checked := True;
  tntmntmdefault.Checked := False;
end;

{****************************************************************
* 過程名稱:  tntmntmdefaultClick
* 功能描述:  修改檢視方式為‘預設’
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmdefaultClick(Sender: TObject);
begin
  lvPro.ViewStyle := vsIcon;
  tntmntmTail.Checked := False;
  tntmntmList.Checked := False;
  tntmntmdefault.Checked := True;
end;

{****************************************************************
* 過程名稱:  tntmntmEdtProClick
* 功能描述:  進入編輯狀態,做好編輯準備
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmEdtProClick(Sender: TObject);
begin
  //防止使用者多次點選編輯按鈕
  if isEditing = True then
  begin
    Exit;
  end;
  tntmntmEdtPro.Checked := True;
  //標示進入編輯狀態
  isEditing := True;
  //介面變色,提示使用者現在是編輯狀態
  lvPro.Color := EDITING_COLOR;
  if  tntmntmEdtPro.Checked = True then
  begin
    //快捷方式進入可編輯狀態
    lvPro.ReadOnly := False;
    //新增快捷方式時使用拖曳方式
    LWindowProc := lvPro.WindowProc;
    lvPro.WindowProc := LBWindowProc;
    DragAcceptFiles(lvPro.Handle, True);
    //刪除按鈕可用
    tntmntmDelPro.Enabled := True;
    //完成按鈕可用
    tntmntmWc.Enabled := True;
    //刪除所有按鈕可用
    tntmntmdelall.Enabled := True;
  end;
  if tntmntmhide.Checked = True then
    tntmntmhide.Click;
  tntmntmhide.Enabled := False;
end;

{****************************************************************
* 過程名稱:  tntmntmWcClick
* 功能描述:  編輯完成,做的與進入編輯狀態相反
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmWcClick(Sender: TObject);
begin
  lvPro.Color := SYS_COLOR;
  lvPro.ParentColor := True;
  //lvPro.ParentFont := True;
  isEditing := False;
  tntmntmEdtPro.Checked := False;
  tntmntmDelPro.Enabled := False;
  tntmntmWc.Enabled := False;
  tntmntmdelall.Enabled := False;
  lvPro.ReadOnly := True;
  tntmntmhide.Enabled := True;
  //關閉拖曳
  lvPro.WindowProc := LWindowProc;
  DragAcceptFiles(lvPro.Handle, False);
end;

{****************************************************************
* 過程名稱:  tntmntmEdtProClick
* 功能描述:  取快捷連結的目標檔案
* 引數說明:  const linkname: string
* 返 回 值:  string
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
function ExeFromLink(const linkname: string): string;
var
  link: IShellLink;
  storage: IPersistFile;
  filedata: TWin32FindData;
  buf: array[0..MAX_PATH] of Char;
  widepath: WideString;
begin
  OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, link));
  OleCheck(link.QueryInterface(IPersistFile, storage));
  widepath := linkname;
  Result := '無效的快捷方式!快捷連結已失效!';
  if Succeeded(storage.Load(@widepath[1], STGM_READ)) then
    if Succeeded(link.Resolve(GetActiveWindow, SLR_NOUPDATE)) then
      if Succeeded(link.GetPath(buf, sizeof(buf), filedata, SLGP_UNCPRIORITY)) then
        Result := buf;
  storage := nil;
  link := nil;
end;

{****************************************************************
* 過程名稱:  LBWindowProc
* 功能描述:  輔助拖曳
* 引數說明:  Message: TMessage
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.LBWindowProc(var Message: TMessage);
begin
  if Message.Msg = WM_DROPFILES then
    WMDROPFILES_l(Message);
  LWindowProc(Message);
end;

{****************************************************************
* 過程名稱:  WMDROPFILES_L
* 功能描述:  新增快捷方式
* 引數說明:  Message: TMessage
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.WMDROPFILES_L(var Msg: TMessage);
var
  pcFileName: PChar;
  i, iSize, iFileCount: integer;
  v_ps: string;
  sCutPath : string;
  sCutName : string;
  sqltxt : string;
begin
  pcFileName := '';
  iFileCount := DragQueryFile(Msg.wParam, $FFFFFFFF, pcFileName, 255);
  for i := 0 to iFileCount - 1 do
  begin
    iSize := DragQueryFile(Msg.wParam, i, nil, 0) + 1;
    pcFileName := StrAlloc(iSize);
    DragQueryFile(Msg.wParam, i, pcFileName, iSize);
//    if FileExists(pcFileName) then  //判斷是否存在
    v_ps := pcFileName;

    StrDispose(pcFileName);
  end;
  DragFinish(Msg.wParam);

  //Delphi取快捷方式的目標路徑
  if LowerCase(ExtractFileExt(v_ps)) = '.lnk' then //判斷是否為快捷字尾檔案
    sCutPath := ExeFromLink(v_ps)
  else
    sCutPath := LowerCase(v_ps);
  sCutName := ExtractFilename(sCutPath);
  sqltxt := 'insert into PRO_LIST(PRO_TYPE,PRO_NAME,PRO_PATH) '
          + 'values(''' + sActiveBtn + ''', ''' + copy(sCutName, 1, pos(ExtractFileExt(sCutName), sCutName) - 1) + ''', ''' + sCutPath + ''') ';
  Execqry(qryCmd,sqltxt);
  //使用滑鼠移動事件重新整理
  lvPro.Tag := 1;
end;

{****************************************************************
* 過程名稱:  tntmntmDelProClick
* 功能描述:  刪除快捷方式
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmDelProClick(Sender: TObject);
var sqltxt : string;
begin
  if not Assigned(lvPro.Selected) then
  begin
    Exit;
  end;

  sqltxt := 'delete from PRO_LIST where ID = ' + IntToStr(anID[lvPro.Selected.ImageIndex]) + ' ';
  Execqry(qryCmd,sqltxt);
  //使用滑鼠移動事件重新整理
  lvPro.Tag := 1;
end;

{****************************************************************
* 過程名稱:  FormShow
* 功能描述:  佈置進入介面初始狀態
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
* 修改描述: 2013.2.1 modified by xzj
*            如果本程式開機自啟動,則選單按鈕開機自啟動選中
*            2013.2.21 modified by xzj
*            新增隱藏項的初始化
*****************************************************************}
procedure TFormUse.FormShow(Sender: TObject);
var
  reg : TRegistry;
  isExist : Boolean;
begin
  ActiveControl := abtnType[1];
  abtnType[1].click;
  tntpgcntrl2.ActivePage := pg3;
  pg3.Caption := sActiveBtn;
  rztrycn1.Hint := '淺諾桌面管理工具v1.0';
  GetSystemPath();

  Reg := Tregistry.Create;
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', True);
  isExist := reg.ValueExists('淺諾桌面管理工具v1.0');
  if isExist = True then
  begin
    tntmntmAutoOpen.Checked := True;
  end
  else
  begin
    tntmntmAutoOpen.Checked := False;
  end;

  lblName.Font.Size := 20;
  AddInitForm();
  //skndt1.LoadFromCollection(sknstr1,4);
  //skndt1.Active := True;
end;

{****************************************************************
* 過程名稱:  tntmntmEditClick
* 功能描述:  顯示修改分組框
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmEditClick(Sender: TObject);
begin
  tntpgcntrl1.visible := True;
  pg2.Visible := True;
  tntpgcntrl1.activepage := pg2;
  pg1.Visible := False;
  edtnow.Text := sActiveBtn;
  edtEdt.SetFocus;
end;

{****************************************************************
* 過程名稱:  tntmntmdeleteClick
* 功能描述:  刪除已選中分組
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmdeleteClick(Sender: TObject);
var sqltxt : string;
begin
  if Application.MessageBox(System.Pchar('是否要刪除' + sActiveBtn + '?'), '詢問', 1 + 32) = id_OK then
  begin
    sqltxt := 'delete from PRO_TYPE where PRO_TYPE = ''' + sActiveBtn + ''' ';

    with qryCmd do
    begin
      Close;
      SQL.Clear;
      SQL.Add('select * from PRO_LIST where PRO_TYPE = ''' + sActiveBtn + ''' ');
      Open;

      if IsEmpty then
      begin
        Close;
        SQL.Clear;
        SQL.Add(sqltxt);
        ExecSQL;
      end
      else
      begin
        ShowMessagePos('要刪除的類別下有程式,不可刪除!',(Self.Left + 250),(Self.Top + 300));
      end;
    end;
    QNLoadType;
    ActiveControl := abtnType[1];
    abtnType[1].Click;
    pg3.Caption := abtnType[1].Caption;
  end;
end;

{****************************************************************
* 過程名稱:  tntmntmhideClick
* 功能描述:  顯示和隱藏分組
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.30 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmhideClick(Sender: TObject);
var sqltxt : string;
begin
  if tntmntmhide.Checked = True then
  begin
    tntmntmhide.Checked := False;
    tntscrlbxType.Visible := True;
    sqltxt := 'update PRO_SET set SHOW_TYPE = True where ID = 1 ';
  end
  else
  begin
    tntmntmhide.Checked := True;
    tntscrlbxType.Visible := False;
    sqltxt := 'update PRO_SET set SHOW_TYPE = False where ID = 1 ';
  end;
  Execqry(qryCmd,sqltxt);
  if tntmntmTail.Checked = True then
  begin
    tntmntmList.Click;
    tntmntmTail.Click;
  end
  else if tntmntmList.Checked = True then
  begin
    tntmntmTail.Click;
    tntmntmList.Click;
  end
  else
  begin
    tntmntmList.Click;
    tntmntmdefault.Click;
  end;
end;

{****************************************************************
* 過程名稱:  lvProMouseMove
* 功能描述:  顯示操作幫助,修改快捷方式後重新整理
* 引數說明:  Sender: TObject; Shift: TShiftState; X,Y: Integer
* 返 回 值:  無
* 歷史記錄:  2013.1.31 created by xzj
* 修改描述:  2013.2.21 modified by xzj
*            新增滑鼠拖動窗體效果
*****************************************************************}
procedure TFormUse.lvProMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  var i : Integer;
begin
  if isEditing = False then
  begin
    lvPro.Hint := '雙擊圖示可開啟檔案';
  end
  else
  begin
    lvPro.Hint := '將快捷方式拖入本框即可新增';


    //修改快捷方式後重新整理
    if(lvPro.Tag = 1) then
    begin
        for i := 1 to 49 do
        begin
          if abtnType[i] <> nil then
          begin
            if abtnType[i].Caption = sActiveBtn then
            begin
              ActiveControl := abtnType[i];
              abtnType[i].Click;
              Break;
            end;
          end;
        end;
        lvPro.Tag := 0;
    end;
    
  end;
    lvPro.ShowHint := True;
    {
  //獲取當前輸入法
  hInNow := GetKeyboardLayout(0);
  for i := 0 to Screen.Imes.Count - 1 do
  begin
    if HKL(Screen.Imes.Objects[i]) = hInNow then
    begin
      //ShowMessage(Screen.Imes.Strings[i]);
      Break;
    end;
  end;
  }
  //拖動窗體
  if (ssleft in Shift) then
  begin
    ReleaseCapture;
    Perform(WM_syscommand, $F012, 0);
  end;
end;

{****************************************************************
* 過程名稱:  tntmntmdelallClick
* 功能描述:  刪除所有的快捷方式,並初始化資料庫表
* 引數說明:  Sender: TObject
* 返 回 值:  無
* 歷史記錄:  2013.1.31 created by xzj
*****************************************************************}
procedure TFormUse.tntmntmdelallClick(Sender: TObject);
var sqltxt : string;
begin
  if Application.MessageBox(System.Pchar('是否要刪除所有程式?'), '詢問', 1 + 32) = id_OK then
  begin
    sqltxt := 'delete from PRO_LIST';
    Execqry(qryCmd,sqltxt);
    sqltxt := 'Alter table[PRO_LIST] Alter column[I