?? unit1.pas
字號:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, OleCtrls, MSHTML_TLB, ImgList,MySqlClass,
IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdFTP,IdFTPCommon, ztvregister, ztvBase,ztvGbls,
ztvUnRar,Shellapi, Menus,DES, WinSkinData;
const
//unRArPassword='kellen'; //解壓密碼
wm_traynotify=wm_user+1000;//自定義消息
msg1='配置文件出錯,請將新的配置提交給hostyi@hotmail.com !';
msg2='未能連接MySQL服務器,請檢查服務器是否啟動或本機網絡故障 !';
msg3='缺少libMySQL.dll支持庫,請與hostyi@hotmail.com聯系 !';
msg4='對不起,你還未添加任何游戲外掛類別 !';
msg5='對不起,沒有查詢到該外掛 !';
msg6='未能連接FTP服務器,請檢查服務器是否啟動或本機網絡故障 !';
msg7='對不起,在FTP服務器沒有發現該外掛 !';
type
TForm1 = class(TForm)
TreeView1: TTreeView;
StatusBar1: TStatusBar;
Scriptlet2: TScriptlet;
ImageList1: TImageList;
Scriptlet1: TScriptlet;
ProgressBar1: TProgressBar;
IdFTP1: TIdFTP;
IdAntiFreeze1: TIdAntiFreeze;
UnRar1: TUnRar;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
SkinData1: TSkinData;
procedure FormCreate(Sender: TObject);
procedure TreeView1DblClick(Sender: TObject);
procedure DownloadRarFile(FtpClient:TIdFTP;SourceFile,DestFile:string);
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
Procedure ExtractRarFile(Sourcefile,DestPath:String);
procedure UnRar1Progress(Sender: TObject; ByFile, ByArchive: Byte);
procedure UnRar1GetPassword(Sender: TObject; FileName: String;
var Password: String; var TryAgain: Boolean);
procedure N1Click(Sender: TObject);
private
{ Private declarations }
Tray_icon:TnotifyIconData; //托盤變量
procedure wmmytrayiconcallback(var msg:tmessage); message wm_traynotify; //消息處理
procedure LoadWaiGuaList();
public
{ Public declarations }
end;
var
Form1: TForm1;
dbhost,dbuser,dbpw,dbname:String; //MySQL數據庫信息
ftphost,ftpuser,ftppw,ftpport:String;//FTP服務器信息
BytesToTransfer: LongWord; //下載文件大小
implementation
{$R *.dfm}
function GetSysDir:String; //獲取系統目錄 C:\windows\system32
var p:Pchar;
begin
GetMem(P,255);
GetSystemDirectory(p,254);
Result := p;
Freemem(p);
end;
function TheFile(DownFile:string):string;
var
FileVal:string;
begin
FileVal:=DownFile;
repeat
FileVal:=Copy(FileVal,Pos('/',FileVal)+1,length(FileVal));
until Pos('/',FileVal)=0;
TheFile:=FileVal;
end;
procedure ShowMsg(Msg:string);
begin
showmessage(Msg);
if Form1.IdFTP1.Connected then
begin
Form1.IdFTP1.Abort;
Form1.IdFTP1.Quit;
end;
Application.Terminate;
end;
procedure CheckStatus(); //檢查啟動程序的環境
begin
//判斷WaiGua目錄是否存在
if Not DirectoryExists('WaiGua') then Mkdir('WaiGua');
//檢查MySQL支持庫
if (Not FileExists(GetSysDir+'\libMySQL.dll')) then ShowMsg(msg3);
end;
Procedure CheckRarPath(Path:string); //檢查并建立目錄
var
dirname:string;
pos1:integer;
begin
// D:\測試文件夾\發布程序\WaiGua\傳奇外掛\赤月霜楓3.0 => WaiGua\傳奇外掛\赤月霜楓3.0
dirname:= ExtractFilePath(Paramstr(0)); //取當前目錄名
Path:=StringReplace(Path,dirname,'',[rfReplaceAll]); //把當前目錄名刪掉
repeat
pos1:=pos('\',Path); // 第一個'\'字符的位置
dirname:=Copy(Path,1,pos1-1); //取出目錄名
if DirectoryExists(dirname) then Chdir(dirname)
else
begin
MkDir(dirname); //建立目錄
ChDir(dirname); //轉到目錄
end;
Path:=Copy(Path,pos1+1,length(Path)); //取下一個目錄名
until pos('\',Path)=0;
end;
//獲取連接MySQL與FTP服務器的信息
procedure GetConnectInf(var dbhost,dbuser,dbpw,dbname,ftphost,ftpuser,ftppw,ftpport:String);
var
Readcfg:Text;
ReadVal:String;
ReadStr: array[1..8] of String;
i:integer;
begin
AssignFile(Readcfg,'Config.cfg');
Reset(Readcfg);
Read(Readcfg,ReadVal);
ReadVal:=DESryStrHex(ReadVal,'xushuyi');
for i:=1 to 8 do
begin
ReadStr[i]:=Copy(ReadVal,1,pos(';',ReadVal)-1);
ReadVal:=Copy(ReadVal,pos(';',ReadVal)+1,length(ReadVal));
end;
for i:=1 to 8 do
if ReadStr[i]='' then ShowMsg(msg1); //顯示出錯信息1,退出程序 [以后加入對服務器有效的檢查函數
dbhost :=Readstr[1];
dbuser :=ReadStr[2];
dbpw :=ReadStr[3];
dbname :=ReadStr[4];
ftphost:=ReadStr[5];
ftpuser:=ReadStr[6];
ftppw :=ReadStr[7];
ftpport:=ReadStr[8];
CloseFile(Readcfg);
end;
procedure TForm1.LoadWaiGuaList(); //載入外掛列表
var
MySQLCls: TMySQLClass;
SQLString:String;
QueryResult:integer;
strName:string;
myNode:TTreeNode;
MainStr:TStringList;
i:integer;
begin
MySQLCls:=TMySQLClass.Create(dbhost,dbuser,dbpw,dbname,3306); //連接MySQL服務器
if (Not MySQLCls.IsConnected) then ShowMsg(msg2); //顯示出錯信息2,退出程序
//查詢主類
SQLString:='SELECT distinct MainItem FROM WaiGua';
QueryResult:=MySQLCls.Query(SQLString);
if QueryResult<=0 then ShowMsg(msg4); //未添加游戲外掛類別,退出程序
MainStr:=TStringList.Create; //保存主類列表
While not MySQLCls.IsEof do //如果上面的查詢得出,記錄不在數據庫末端
begin
MainStr.Add(MySQLCls.FieldByName('MainItem'));
MySQLCls.Next; //移至下一條記錄
end;
for i:=0 to MainStr.Count-1 do
begin
//添加主類
myNode:=TreeView1.Items.Add(Treeview1.Selected,MainStr[i]);
//查詢分類
SQLString:='SELECT * FROM WaiGua where MainItem='+chr(39)+MainStr[i]+chr(39);
QueryResult:=MySQLCls.Query(SQLString);
if QueryResult<=0 then myNode.selected:=false
else myNode.selected:=true;
While not MySQLCls.IsEof do //如果上面的查詢得出,記錄不在數據庫末端
begin
//添加分類
strName:=MySQLCls.FieldByName('SubItem');
myNode:=TreeView1.Items.AddChild(Treeview1.Selected,strName);
myNode.ImageIndex:=2;
myNode.StateIndex:=2;
//選擇時要判斷是否存在這個外掛,否則顯示其他圖標
myNode.SelectedIndex:=2;
//移至下一條記錄
MySQLCls.Next;
end;
myNode.selected:=false;
end;
MySQLCls.Destroy; //關閉數據庫連接
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//對托盤圖標進程操作
with Tray_icon do
begin
cbsize:=sizeof(tnotifyicondata);
wnd:=handle;
uid:=1;
uflags:=nif_message or nif_icon or nif_tip;
ucallbackmessage:=wm_traynotify;
//hicon:=loadicon(0,idi_winlogo);
hicon:=Application.Icon.Handle;
sztip:='游戲外掛管理程序 --和貴網絡中心專用';
end;
shell_notifyicon(nim_add,@Tray_icon);
LoadWaiGuaList(); //顯示外掛列表
end;
//下載壓縮文件到本地
procedure TForm1.DownloadRarFile(FtpClient:TIdFTP;SourceFile,DestFile:string);
begin
if FtpClient.Connected then
begin
FtpClient.Abort;
FtpClient.Quit;
end;
With FtpClient do //設置好后連接FTP服務器
Try
Host:=ftphost;
Port:=StrToInt(ftpport);
Username:=ftpuser;
Password:=ftppw;
Connect;
ChangeDir('/');
TransferType:=ftASCII;
Except
If Not Connected then ShowMsg(msg6); //連接不上FTP,顯示出錯信息,退出程序
end;
BytesToTransfer := FtpClient.Size(SourceFile); //獲取下載文件大小: /外掛程序/傳奇外掛/赤月霜楓3.0.rar
try
FtpClient.Get(SourceFile,DestFile,true,false);
except
DeleteFile(DestFile); //刪除出錯的文件
ShowMsg(msg7); //沒有發現下載外掛,退出程序
end;
end;
Procedure TForm1.ExtractRarFile(Sourcefile,DestPath:String); //解壓函數
begin
UnRAR1.ArchiveFile :=Sourcefile; //源文件
UnRAR1.ArcType:=atRaR;
UnRAR1.ConfirmOverwrites:=False;
UnRAR1.CreateStoredDirs:=True;//自動建立目錄
UnRAR1.ExtractDir := DestPath; //目標目錄
UnRAR1.FileSpec.Clear();
UnRAR1.FileSpec.Add('*.*');
UnRAR1.OverwriteMode := omOverwrite;
UnRAR1.UseStoredDirs := True;
UnRAR1.DateAttribute := daFileDate;
UnRAR1.RestoreFileAttr := False;
UnRAR1.TranslateOemChar := True;
UnRAR1.RecurseDirs := True;
UnRAR1.VolumeName := '';
UnRAR1.Extract(); //執行解壓
ProgressBar1.Visible:=True; //顯示
ProgressBar1.Min:=0;
ProgressBar1.Max:=UnRAR1.FilesToExtract;
ProgressBar1.Visible:=False;
if FileExists(Sourcefile) then DeleteFile(Sourcefile); //解壓完后刪除源文件
end;
procedure TForm1.TreeView1DblClick(Sender: TObject);
var
MySQLCls: TMySQLClass;
SQLString:String;
QueryResult:integer;
SearchKey:String;
DownFile:String; //外掛下載路徑
UnRarFile:String;//解壓文件名
UnRArPath:String; //解壓路徑
ExeFilename:String; //執行程序名
begin
if (Treeview1.Selected.Parent.Index > -1 ) then
begin
SearchKey:=TreeView1.Selected.Text; //將選中的文本寫入查詢關鍵值
MySQLCls:=TMySQLClass.Create(dbhost,dbuser,dbpw,dbname,3306); //連接MySQL服務器
if (Not MySQLCls.IsConnected) then ShowMsg(msg2); //顯示出錯信息2,退出程序
//查詢選中的項,在數據庫中是否有此外掛
SQLString:='SELECT DISTINCT * FROM WaiGua WHERE SubItem='+chr(39)+SearchKey+chr(39);
QueryResult:=MySQLCls.Query(SQLString);
if QueryResult=0 then ShowMsg(msg5); //顯示出錯信息沒有查詢到該外掛,退出程序
While not MySQLCls.IsEof do //如果上面的查詢得出結果
begin
if StrComp(pchar(MySQLCls.FieldByName('SubItem')),pchar(Searchkey))=0 then
begin
DownFile:=MySQLCls.FieldByName('DownPath');
UnRArPath:='WaiGua\'+MySQLCls.FieldByName('MainItem')+'\'+MySQLCls.FieldByName('SubItem')+'\';
ExeFilename:=MySQLCls.FieldByName('ExecName');
break;
end;
//移至下一條記錄
MySQLCls.Next;
end;
MySQLCls.Destroy; //關閉數據庫連接
//顯示選擇的外掛
if DownFile<>'' then
begin
TreeView1.Enabled:=False;
UnRarFile:= ExtractFilePath(Paramstr(0))+TheFile(DownFile);
UnRarPath:= ExtractFilePath(Paramstr(0))+UnRarPath;
ExeFilename:=UnRarPath+ExeFilename;
if (Not FileExists(ExeFilename)) then
begin
DownloadRarFile(idFTP1,DownFile,ExtractFilePath(Paramstr(0))+TheFile(DownFile)); //下載所選擇的外掛
chdir(ExtractFilePath(Paramstr(0)));
CheckRarPath(UnRarPath); //解壓之前先建立目錄
ExtractRarFile(UnRarFile,UnRarPath); //如果執行程序不存在,則解壓
end;
if FileExists(UnRarFile) then DeleteFile(UnRarFile); //如果解壓后壓縮文件仍然存在,則刪除它。
// showmessage('解壓縮文件名'+UnRarFile);
//showmessage('解壓縮目錄名'+UnRarPath);
//showmessage('執行程序名'+UnRarPath+ExeFilename);
//showmessage(TheFile(DownFile));
//showmessage(DownFile);
visible:=not visible;
application.ShowMainForm:=visible;
setforegroundwindow(application.handle);
TreeView1.Enabled:=True;
WinExec(pchar(ExeFilename),sw_normal); //執行程序
end
else ShowMsg(msg5); //顯示出錯信息沒有查詢到該外掛,退出程序
end;
end;
//當FTP下載/上傳時
procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ProgressBar1.Position := AWorkCount;
end;
//下載/上傳開始
procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
ProgressBar1.Visible:=True;
TreeView1.Selected.ImageIndex:=1;
TreeView1.Selected.StateIndex:=1;
if AWorkCountMax > 0 then ProgressBar1.Max := AWorkCountMax
else ProgressBar1.Max := BytesToTransfer;
end;
//下載/上傳結束
procedure TForm1.IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position := 0;
ProgressBar1.Visible:=False;
//TreeView1.Enabled:=True;
TreeView1.Selected.ImageIndex:=2;
TreeView1.Selected.StateIndex:=2;
end;
procedure TForm1.UnRar1Progress(Sender: TObject; ByFile, ByArchive: Byte);
begin
ProgressBar1.Position:=UnRAR1.Count; //進度
end;
procedure TForm1.UnRar1GetPassword(Sender: TObject; FileName: String;
var Password: String; var TryAgain: Boolean);
begin
Password:='';//解壓密碼
end;
//托盤消息處理
procedure TForm1.wmmytrayiconcallback(var msg:tmessage);
var
cursorpos:tpoint;
begin
case msg.LParam of
wm_lbuttondown:
begin
visible:=not visible;
application.ShowMainForm:=visible;
setforegroundwindow(application.handle);
end;
wm_rbuttondown:
begin
getcursorpos(cursorpos);
popupmenu1.Popup(cursorpos.x,cursorpos.y);
end;
end;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
if MessageDlg('你真的要退出程序嗎?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
Close;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//釋放建立的托盤
shell_notifyicon(nim_delete,@Tray_icon);
if idFTP1.Connected then
begin
idFTP1.Abort;
idFTP1.Quit;
end;
end;
//主程序
begin
// 一系列的程序條件檢查
CheckStatus();
//程序主要過程
GetConnectInf(dbhost,dbuser,dbpw,dbname,ftphost,ftpuser,ftppw,ftpport);
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -