📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, SUIForm, SUIMgr, Menus, SUIMainMenu, ToolWin, ComCtrls,
ImgList, StdCtrls, SUIPageControl, SUITabControl, SUITreeView, OleCtrls,
SHDocVw, SUIComboBox, mshtml, activex,PublicUnit,
SUIGroupBox, SUIMemo, SUIEdit, Buttons,StrUtils, DB, ADODB, ActnList,
SUIProgressBar, Gauges,ShellAPI, SUIPopupMenu, SUIToolBar,{QDialogs,}
SUIImagePanel,ShlObj,Inifiles, SUIListBox, SUIButton;
type
TDBookBrowser = Class (TObject)
private
FModeCount:integer;
FModeContent:TStrings;
FModeName:TStrings;
FHtmStr:String;
FWebbrowser:TWebBrowser;
public
constructor Create;
destructor Destroy;override;
procedure GoToURL(URL:String);
procedure Init;
procedure SetHtmStr(ClassDoc:TClassDoc);overload;
procedure SetHtmStr(TmpNode:TTreeNode;IsExport:Boolean);overload;
function GetHtmStr:String;
procedure LoadHtmlMode;
procedure DisplayHtmlPage;
procedure DisplayModalPage(ATitle,AInfo: String);
procedure ExportNodeToHtm(currentNode:TtreeNode);
procedure ExportSubjectToHtm(subject:String);
end;
TMainFrm = class(TForm)
suiForm1: TsuiForm;
Tbar_Main: TsuiToolBar;
TB_NewSubject: TToolButton;
TB_NewRootNode: TToolButton;
ImageList1: TImageList;
Pnl_TopMain: TPanel;
TB_NewNode: TToolButton;
TB_NewDoc: TToolButton;
Pnl_BottomMain: TPanel;
Pnl_LeftMain: TPanel;
Pnl_RightMain: TPanel;
Splitter1: TSplitter;
spcl_Main: TsuiPageControl;
stst_EditMode: TsuiTabSheet;
stst_ViewMode: TsuiTabSheet;
ToolButton6: TToolButton;
TB_EditNode: TToolButton;
TB_DelNode: TToolButton;
TB_AdvanceApply: TToolButton;
TB_ExportNode: TToolButton;
pnl_LTop: TPanel;
pnl_LBottom: TPanel;
StaticText1: TStaticText;
scbb_Subject: TsuiComboBox;
Panel1: TPanel;
WebBrowser1: TWebBrowser;
Pnl_REditTop: TPanel;
Pnl_REditBottom: TPanel;
suiGroupBox1: TsuiGroupBox;
mem_DocText: TMemo;
suiPageControl2: TsuiPageControl;
suiTabSheet3: TsuiTabSheet;
suiTabSheet4: TsuiTabSheet;
sTV_Main: TsuiTreeView;
sedt_title: TsuiEdit;
StaticText2: TStaticText;
sedt_Description: TsuiEdit;
StaticText3: TStaticText;
sedt_memo: TsuiEdit;
StaticText4: TStaticText;
sBtn_Submit: TSpeedButton;
scbb_HtmlMode: TsuiComboBox;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
ImageList2: TImageList;
ActionList1: TActionList;
NewSubject: TAction;
NewRootNode: TAction;
NewNode: TAction;
NewDoc: TAction;
DelNode: TAction;
EditNode: TAction;
lbl_Status: TLabel;
TB_ExportSubject: TToolButton;
gge_MainStatus: TGauge;
TB_Help: TToolButton;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
TB_About: TToolButton;
TB_Exit: TToolButton;
At_ExportSubject: TAction;
At_ExportNode: TAction;
At_ExitApplication: TAction;
At_help: TAction;
At_About: TAction;
At_HideWindows: TAction;
StaticText5: TStaticText;
sPopMenu_Icon: TsuiPopupMenu;
mnl_show: TMenuItem;
Exit1: TMenuItem;
About1: TMenuItem;
suiImagePanel1: TsuiImagePanel;
suiImagePanel2: TsuiImagePanel;
suiGroupBox2: TsuiGroupBox;
slb_SearchRecList: TsuiListBox;
sedt_Search: TsuiEdit;
sb_search: TSpeedButton;
scb_like: TsuiCheckBox;
scbb_keyclass: TsuiComboBox;
StaticText6: TStaticText;
sbtn_hideLeftPnl: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure sTV_MainChange(Sender: TObject; Node: TTreeNode);
procedure NewSubjectExecute(Sender: TObject);
procedure NewRootNodeExecute(Sender: TObject);
procedure NewNodeExecute(Sender: TObject);
procedure NewDocExecute(Sender: TObject);
procedure scbb_SubjectChange(Sender: TObject);
procedure sBtn_SubmitClick(Sender: TObject);
procedure DelNodeExecute(Sender: TObject);
procedure EditNodeExecute(Sender: TObject);
procedure TB_AdvanceApplyClick(Sender: TObject);
procedure WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
procedure Pnl_RightMainMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure TB_NewSubjectMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
procedure At_ExportSubjectExecute(Sender: TObject);
procedure At_ExportNodeExecute(Sender: TObject);
procedure At_ExitApplicationExecute(Sender: TObject);
procedure At_helpExecute(Sender: TObject);
procedure At_HideWindowsExecute(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure mnl_showClick(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure At_AboutExecute(Sender: TObject);
procedure sb_searchClick(Sender: TObject);
procedure slb_SearchRecListClick(Sender: TObject);
procedure sbtn_hideLeftPnlClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
private
DBookBrowser:TDBookBrowser;
MyIconData:NOTIFYICONDATA;//任务栏通知区图标信息
FSearchList:TList;
{ Private declarations }
public
procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY; //注册热键
procedure WMSysMin(var Msg : TWMSYSCOMMAND); message WM_SYSCOMMAND; //扑捉最小化事件
procedure IconOnClick(var msg:TMessage); message WM_USER+1; //点击托盘图标时发生事件
procedure DBookInit;
function GetPassword(UserID:String):String;
procedure createNodeDir(currentNode:TtreeNode;basePath:string);
procedure LoadSubjectList;
procedure LoadSubjectNodeData(Subject:String;TreeView:TsuiTreeView);
function IsDocNode(TmpNode:TTreeNode):Boolean;
procedure DisplayTheNode(TmpNode:TTreeNode);
function GetRandomID(Table:String):integer;
function GetNodeId(TmpNode:TTreeNode):integer;
function getLastNode(CurNode:TTreeNode;Var NextNode:TtreeNode;Var isPnode:boolean):TtreeNode;
function getNodeCount(TmpNode:TTreeNode):integer; //获得当前节点所有子节点的数量(包括自己)
function getNodeNum(CurNode:TTreeNode):integer; //获得当前节点在全树中的排行
function getNodePath(currentNode,baseNode:TtreeNode;basePath:String):String;
procedure DelNodes(CurNode:TTreeNode);
procedure DelNodeRec(CurNode:TTreeNode);
procedure SaveIndexNode(CurNode:TTreeNode;AClass:TClassID );
procedure SaveDoc(CurNode:TTreeNode; ClassDoc: TClassDoc);
procedure UpdateIndexNode(CurNode:TTreeNode;AClass:TClassID);overload;
procedure UpdateIndexNode(TmpNode:TTreeNode);overload;
procedure UpdateDoc(ID:integer;ClassDoc:TClassDoc);
function RegHotKey(hwnd:THandle;AHotKey:String):Boolean;
{ Public declarations }
end;
var
MainFrm: TMainFrm;
implementation
uses AddUnit,AdvanceUnit,TempUnit,SplashUnit,LoginUnit;
{$R *.dfm}
{TForm}
//=============================================================================//
procedure TMainFrm.DBookInit;
var
ClassDoc:TClassDoc;
DBPath,ConnectStr,TempStr,LastSubjectStr:String;
inifile:TInifile;
Index:integer;
begin
SplashFrm.sPB_Splash.Visible:=True;
SplashFrm.sPB_Splash.Max:=10;
SplashFrm.sPB_Splash.StepBy(1);
//初始化程序数据
ExePath:=ExtractFileDir(ParamStr(0));
UserID:='Demosoft';
if ExePath[Length(ExePath)]='\' then Delete(ExePath,Length(ExePath),1);
IniFileName:=ExePath+'\data\Config.ini';
HtmlModeFileName:=ExePath+'\data\HtmlCfg.dat';
if Not DirectoryExists(ExePath+'\data') then CreateDir(ExePath+'\data');
HotKeyId:=GlobalAddAtom('DBook.Demosoft'); //注册全局热键原子
FSearchList:=TList.Create; //初始化搜索字段(保存节点ID的LIST)
SplashFrm.sPB_Splash.StepIt; //1
//初始化ini文件
inifile:=TInifile.Create(IniFileName);
TempStr:=inifile.ReadString('常用设置','系统热键','');
if TempStr<>'' then RegHotKey(handle,TempStr);
ExportPath:=ExePath+'\OutPath'; //缺省的导出路径
if Not DirectoryExists(ExportPath) then CreateDir(ExportPath);
ExportPath:=inifile.ReadString('常用设置','导出网页路径',ExportPath);
if Not DirectoryExists(ExportPath) then ExportPath:=ExePath+'\OutPath'; //用缺省的路径
LastSubjectStr:=inifile.ReadString('常用设置','最近课题','');
inifile.Free;
//初始化TDBookBrowser类
DBookBrowser:=TDBookBrowser.Create;
DBookBrowser.Init;
SplashFrm.sPB_Splash.StepIt;
SplashFrm.sPB_Splash.StepIt; //3
//连接数据库
DBPath:=ExePath+'\data\Data.ddb';
ConnectStr:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+
DBPath+';Jet OLEDB:Database Password=DEMOSOFT;Persist Security Info=False';
with ADOConnection1 do
begin
if Connected then Connected := False;
ConnectionString := ConnectStr;
end;
ADOQuery1.Connection:=ADOConnection1;
SplashFrm.sPB_Splash.StepIt; //4
//加载数据库数据
LoadSubjectList; //加载课题列表
Index:= scbb_Subject.Items.IndexOf(LastSubjectStr);
if Index<>-1 then scbb_Subject.ItemIndex:=Index;
SplashFrm.sPB_Splash.StepIt;
SplashFrm.sPB_Splash.StepIt;
LoadSubjectNodeData(scbb_Subject.Text,sTV_Main); //加载课题数据
PUserPassword:=GetPassword(UserID); //获得用户密码
if PUserPassword<>'' then
PIsNeedLogin:=True
else
PIsNeedLogin:=False;
SplashFrm.sPB_Splash.StepIt;
SplashFrm.sPB_Splash.StepIt;
SplashFrm.sPB_Splash.StepIt; //9
//制作托盘图标
MyIconData.cbSize :=sizeof(MyIconData);
MyIconData.Wnd :=handle;
MyIconData.uID :=1;
MyIconData.uFlags :=7;
MyIconData.uCallbackMessage :=WM_USER+1;
MyIconData.hIcon :=Application.Icon.Handle ;{用自己的icon}
TempStr:=Application.Title;
StrCopy(MyIconData.szTip,PChar(TempStr));
Shell_NotifyIcon(NIM_ADD,@MyIconData);
SplashFrm.sPB_Splash.StepIt; //10
end;
procedure TMainFrm.FormCreate(Sender: TObject);
begin
DBookInit;
end;
procedure TMainFrm.FormShow(Sender: TObject);
begin
if PIsNeedLogin then
begin
With TLoginFrm.Create(Self) Do
begin
if ShowModal<>mrOk then
Application.Terminate
else
begin
PIsNeedLogin:=False;
Free;
end;
end;
end;
end;
procedure TMainFrm.FormClose(Sender: TObject; var Action: TCloseAction);
var
inifile:TIniFile;
begin
inifile:=TInifile.Create(IniFileName);
inifile.WriteString('常用设置','最近课题',scbb_Subject.Text);
inifile.Free;
end;
procedure TMainFrm.FormDestroy(Sender: TObject);
begin
FSearchList.Free;
Shell_NotifyIcon(NIM_DELETE,@MyIconData);
end;
//=============================================================================//
{Windows消息函数区}
//=============================================================================//
procedure TMainFrm.IconOnClick(var msg: TMessage);
var
p: TPoint;
begin
if (msg.lParam = WM_LBUTTONDBLCLK) then
begin
Show;
Application.Restore;
Application.BringToFront;
Exit;
end;
if (msg.lParam = WM_RBUTTONDOWN) then
begin
GetCursorPos(p);
if Self.Visible=True then
mnl_show.Caption:='隐藏(&H)'
else
mnl_show.Caption:='显示(&S)';
sPopMenu_Icon.Popup( p.x ,p.y );
exit;
end;
end;
procedure TMainFrm.WMHotKey(var Msg: TWMHotKey);
begin
if (Msg.HotKey =HotKeyID) and (Self.Visible=False) then
begin
Show;
Application.Restore;
Application.BringToFront;
end;
end;
procedure TMainFrm.WMSysMin(var Msg: TWMSYSCOMMAND);
begin
if (Msg.CmdType =61472) then
begin
//showMessage('最小化,对不对?');
Application.Minimize;
Hide;
Inherited;//调用先前的处理函数
end
else
Inherited;
end;
//=============================================================================//
{ TDBookBrowser }
//=============================================================================//
constructor TDBookBrowser.Create;
begin
FWebbrowser:= MainFrm.WebBrowser1;
FModeName:=TStringList.Create;
FModeContent:=TStringList.Create;
FModeCount:=0;
FHtmStr:='';
end;
destructor TDBookBrowser.Destroy;
begin
FModeName.Free;
FModeContent.Free;
inherited;
end;
procedure TDBookBrowser.DisplayHtmlPage;
var
VTmp: Variant;
HTMLDocument: IHTMLDocument2;
begin
VTmp := VarArrayCreate([0, 0], varVariant);
VTmp[0]:=FHtmStr;
HTMLDocument :=FWebBrowser.Document as IHTMLDocument2;
HTMLDocument.Write(PSafeArray(TVarData(VTmp).VArray));
HTMLDocument.Close;
end;
procedure TDBookBrowser.DisplayModalPage(ATitle,AInfo: String);
var
VTmp: Variant;
HTMLDocument: IHTMLDocument2;
TempStr,Buf:String;
TextF:Text;
begin
Assignfile(TextF,ExePath+'\data\ModalPage.dat');
Reset(TextF);
While Not Eof(TextF) Do
begin
Readln(TextF,Buf);
TempStr:=TempStr+Buf;
end;
CloseFile(TextF);
TempStr:=AnsiReplaceStr(TempStr,'[TITLE]',ATitle);
TempStr:=AnsiReplaceStr(TempStr,'[INFO]',AInfo);
VTmp := VarArrayCreate([0, 0], varVariant);
VTmp[0]:=TempStr;
HTMLDocument :=FWebBrowser.Document as IHTMLDocument2;
HTMLDocument.Write(PSafeArray(TVarData(VTmp).VArray));
HTMLDocument.Close;
end;
procedure TDBookBrowser.ExportNodeToHtm(currentNode: TtreeNode);
var
pi_id,pi_pid,pi_tmp:^integer;
s_Exepath,s_path,s_filename,s_dir,s_cpt,s_memo,s_content,s_des,s_subject,s_ltmf,s_ct:String;
str_html,str_temp:TStrings;
tmpNode,nextNode:TtreeNode;
isPnode:Boolean;
ClassDoc:TClassDoc;
begin
str_html:=TStringList.Create;
str_temp:=TStringList.Create;
s_Exepath:=ExtractFileDir(application.ExeName);
pi_id:=currentNode.Data;
isPnode:=false;
with MainFrm Do
begin
tempFrm:=TtempFrm.Create(MainFrm);
tempFrm.Caption:='导出当前节点';
tempFrm.Show;
tempFrm.Gauge1.MaxValue:=getNodeCount(currentNode);
//tempFrm.Gauge1.StepBy(1);
CreateNodeDir(currentNode,currentNode.Text);
tmpNode:=currentNode;
Repeat
tmpNode:=getLastNode(tmpNode,nextNode,isPnode);
pi_tmp:=tmpNode.Data;
if isDocNode(tmpNode) then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from DocData');
ADOQuery1.SQL.Add('Where id ='+InttoStr(getNodeId(tmpNode)));
ADOQuery1.Open;
ClassDoc.Title :=ADOQuery1.fieldbyName('Caption').AsString;
ClassDoc.MemoText :=ADOQuery1.fieldbyName('MemoText').AsString;
ClassDoc.Description :=ADOQuery1.fieldbyName('Description').AsString;
ClassDoc.LastModified:=ADOQuery1.fieldbyName('LastModified').AsString;
ClassDoc.CreateTime:=ADOQuery1.fieldbyName('CreateTime').AsString;
ClassDoc.DocText :=ADOQuery1.fieldbyName('DocText').AsString;
ClassDoc.Subject:=ADOQuery1.fieldbyName('Subject').AsString;
ClassDoc.HtmlMode:=ADOQuery1.fieldbyName('HtmlMode').AsString;
ClassDoc.UserID:=UserID;
setHtmStr(ClassDoc);
end
else
begin
setHtmStr(tmpNode,True);
end;
s_dir:=s_Exepath+'\'+getNodePath(tmpNode,currentNode,currentNode.Text);
s_filename:= s_dir+'.htm';
str_html.Clear;
str_html.Add(FHtmStr);
str_html.SaveToFile(s_filename);
tempFrm.lbl_Status.Caption:='正在导出文件'+s_filename;
//tempFrm.Gauge1.StepIt;
tempFrm.Gauge1.Progress :=tempFrm.Gauge1.Progress +1;
Application.ProcessMessages;
tmpNode:=nextNode;
Until pi_tmp^=pi_id^;
str_html.Free;
str_temp.Free;
tempFrm.Free;
end;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -