📄 main.pas
字号:
sedt_title.Text:=sTV_Main.Selected.Text;
sedt_Description.Text:='请在此处填上简单描述';
sedt_memo.Text:='请在此处填上备注';
mem_DocText.Text:='请在这里输入您要保存的文档';
//保存
ClassDoc.Title:= TmpNode.Text;
ClassDoc.Description :=sedt_Description.Text;
ClassDoc.MemoText:= sedt_memo.Text;
ClassDoc.DocText :='';
ClassDoc.CreateTime :=DateToStr(Date)+' '+TimeToStr(Time);
ClassDoc.LastModified :=ClassDoc.CreateTime;
ClassDoc.HtmlMode :='默认格式';
ClassDoc.Subject := scbb_Subject.Text;
ClassDoc.UserID :=UserID;
SaveDoc(TmpNode,ClassDoc);
DisplayTheNode(TmpNode); //重新加载
end;
end;
end
else
begin
//禁止编辑模式
mem_DocText.Lines.Clear;
sedt_title.Text:='';
sedt_Description.Text:='';
sedt_memo.Text:='';
scbb_HtmlMode.ItemIndex:=-1;
sBtn_Submit.Enabled:=False;
//加载数据
DBookBrowser.SetHtmStr(TmpNode,False);
DBookBrowser.DisplayHtmlPage;
end;
end;
procedure TMainFrm.createNodeDir(currentNode: TtreeNode; basePath: string);
var
s_tmp,s_dir:String;
str_temp:TStrings;
i,i_count:integer;
pi_id,pi_tmp:^integer;
isPnode:boolean;
tmpNode,nextNode:TtreeNode;
begin
str_temp:=TStringList.Create;
str_temp.Clear;
pi_id:=currentNode.Data;
isPnode:=false;
tmpNode:=currentNode;
Repeat
tmpNode:=getLastNode(tmpNode,nextNode,isPnode);
pi_tmp:=tmpNode.Data;
if Not isDocNode(tmpNode) then
begin
s_dir:= ExportPath+'\'+getNodePath(tmpNode,currentNode,basePath);
str_temp.Add(s_dir);
end;
tmpNode:=nextNode;
Until pi_tmp^=pi_id^;
str_temp.Add(ExportPath+'\'+basePath); //把basePath也增加了
i_count:=str_temp.Count;
for i:=i_count-1 Downto 0 Do
begin
CreateDir(str_temp.Strings[i]);
end;
end;
procedure TMainFrm.delNodeRec(CurNode: TTreeNode);
var
pi_id,pi_pid:^integer;
i_tmp:integer;
s_tmp:string;
begin
pi_id:=CurNode.Data;
s_tmp:=inttostr(pi_id^);
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('delete from IndexData where id ='+s_tmp);
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('delete from DocData where id ='+s_tmp);
ADOQuery1.ExecSQL;
end;
procedure TMainFrm.delNodes(CurNode: TtreeNode);
var
tmpNode,nextNode:TtreeNode;
pi_tmp,pi_current:^integer;
s_tmp:String;
b_isPnode:boolean;
begin
//遍历所有子节点,并将之在数据库中删除
b_isPnode:=false;
tmpNode:=getLastNode(CurNode,nextNode,b_isPnode);
delNodeRec(tmpNode);
pi_tmp:=tmpNode.Data;
pi_current:=CurNode.Data;
While pi_tmp^<>pi_current^ Do
begin
tmpNode:=getLastNode(nextNode,nextNode,b_isPnode);
delNodeRec(tmpNode);
pi_tmp:=tmpNode.Data;
end;
//在树视图中删除该节点以及其所有子节点
CurNode.Delete;
end;
function TMainFrm.getLastNode(CurNode: TTreeNode; var NextNode: TtreeNode;
var isPnode: boolean): TtreeNode; //获得当前节点的最后一个子节点
var //该函数用来遍历树节点
tmpNode:TtreeNode;
begin
tmpNode:=CurNode;
While (tmpNode.getFirstChild<>nil) and Not isPnode Do
begin
tmpNode:=tmpNode.getFirstChild;
end;
result:=tmpNode;
if tmpNode.getNextSibling<>nil then
begin
nextNode:=tmpNode.getNextSibling;
isPnode:=False;
end
else if tmpNode.Parent <>nil then
begin
nextNode:=tmpNode.Parent;
isPnode:=True;
end
else
begin
nextNode:=nil;
isPnode:=false;
end;
end;
function TMainFrm.getNodeCount(TmpNode: TtreeNode): integer;
var
pNode,currentNode:TTreeNode;
i_id,i_tmp,i_count,i_num,i:integer;
begin
if Not Assigned(TmpNode) then
begin
Result:=sTV_Main.Items.Count;
Exit;
end;
if Not TmpNode.HasChildren then
begin
Result:=1;
Exit;
end;
i_num:=GetNodeNum(TmpNode);
pNode:=TmpNode;
While pNode.getNextSibling =nil Do
begin
pNode:=pNode.Parent;
if Not Assigned(pNode) then break;
end;
if Assigned(pNode) then
pNode:=pNode.getNextSibling
else //不存在当前节点的下个节点
begin
Result:=sTV_Main.Items.count-i_num;
Exit;
end;
//存在当前节点的下个节点处理
i_tmp:=getNodenum(pNode);
Result:=i_tmp-i_num;
end;
function TMainFrm.GetNodeId(TmpNode: TTreeNode): integer;
var
pi_id:^integer;
begin
if Assigned(TmpNode) then
pi_id:=TmpNode.Data
else
pi_id:=nil;
Result:=pi_id^;
end;
function TMainFrm.GetNodeNum(CurNode: TtreeNode): integer;
var
i,i_id,i_tmp,i_num:Integer;
begin
i_id:=getNodeId(CurNode);
for i:=0 to sTV_Main.Items.Count-1 Do
begin
i_tmp:=getNodeId(sTV_Main.Items[i]);
if i_tmp=i_id then
begin
i_num:=i;
break;
end;
end;
Result:=i_num;
end;
function TMainFrm.getNodePath(currentNode, baseNode: TtreeNode;
basePath: String): String;
var
s_tmp:String;
i:integer;
tmpNode:TtreeNode;
begin
if Assigned(currentNode) then
begin
tmpNode:=currentNode;
s_tmp:=currentNode.Text;
for i:=baseNode.Level+1 to currentNode.Level Do
begin
s_tmp:=tmpNode.Parent.Text +'\'+s_tmp;
tmpNode:=tmpNode.Parent;
end;
s_tmp:=basePath+'\'+s_tmp;
Result:=s_tmp;
end
else
Result:='NULL';
end;
function TMainFrm.GetRandomID(Table: String): integer;
var
i_id:integer;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Insert into '+Table+'(Nodekind,UserID)');
ADOQuery1.SQL.Add('Values("TmpNode","'+UserID+'")');
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select ID from '+Table);
ADOQuery1.SQL.Add('Where Nodekind="TmpNode"');
ADOQuery1.Open;
i_id:=ADOquery1.FieldByName('ID').AsInteger;
if i_id=0 then
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('delete from IndexData');
ADOQuery1.SQL.Add('Where ID=0');
ADOQuery1.ExecSQL;
Result:=getRandomId('IndexData');
Exit;
end;
Result:=i_id;
end;
procedure TMainFrm.SaveDoc(CurNode: TTreeNode; ClassDoc: TClassDoc);
var
pi_id:^integer;
MemoStream: TMemoryStream;
begin
if Not Assigned(CurNode) then
begin
ShowMessage('Debug: 此节点不存在!No Such Node!');
Exit;
end;
pi_id:=CurNode.Data;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('insert into DocData(ID,DocText,Description,MemoText,CreateTime,LastModified,Caption,Subject,HtmlMode,UserID)');
ADOQuery1.SQL.Add('values(:id,:Doc,:dspt,:mm,:ct,:ltm,:cpt,:subject,:Mode,:userid)');
ADOQuery1.Parameters.ParamByName('id').Value:=pi_id^;
ADOQuery1.Parameters.ParamByName('Doc').Value:=ClassDoc.DocText;
ADOQuery1.Parameters.ParamByName('dspt').Value:=ClassDoc.Description;
ADOQuery1.Parameters.ParamByName('mm').Value:= ClassDoc.MemoText;
ADOQuery1.Parameters.ParamByName('ct').Value:=ClassDoc.CreateTime;
ADOQuery1.Parameters.ParamByName('ltm').Value:=ClassDoc.LastModified;
ADOQuery1.Parameters.ParamByName('cpt').Value:=ClassDoc.Title ;
ADOQuery1.Parameters.ParamByName('subject').Value:=ClassDoc.Subject;
ADOQuery1.Parameters.ParamByName('Mode').Value:=ClassDoc.HtmlMode;
ADOQuery1.Parameters.ParamByName('userid').Value:=ClassDoc.UserID;
ADOQuery1.ExecSQL;
end;
procedure TMainFrm.SaveIndexNode(CurNode: TTreeNode;AClass:TClassID);
begin
UpdateIndexNode(CurNode,AClass);
end;
procedure TMainFrm.UpdateDoc(ID: integer; ClassDoc: TClassDoc);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Update DocData SET DocText=:Doc,Description=:dpt,MemoText=:mt,LastModified=:ltm,Caption=:cpt,subject=:subject,HtmlMode=:Mode');
ADOQuery1.SQL.Add('Where id='+InttoStr(ID));
ADOQuery1.Parameters.ParamByName('Doc').Value:=ClassDoc.DocText;
ADOQuery1.Parameters.ParamByName('dpt').Value:=ClassDoc.Description;
ADOQuery1.Parameters.ParamByName('mt').Value:=ClassDoc.MemoText;
ADOQuery1.Parameters.ParamByName('ltm').Value:=ClassDoc.LastModified;
ADOQuery1.Parameters.ParamByName('cpt').Value:=ClassDoc.Title;
ADOQuery1.Parameters.ParamByName('subject').Value:=ClassDoc.Subject;
ADOQuery1.Parameters.ParamByName('Mode').Value:=ClassDoc.HtmlMode;
ADOQuery1.ExecSQL;
end;
procedure TMainFrm.UpdateIndexNode(CurNode: TTreeNode; AClass:TClassID);
var
pi_id,pi_pid:^integer;
i_level,i_index:integer;
s_cpt,s_kind,s_subject,s_sql:string;
TmpNode:TtreeNode;
begin
New(pi_id);
New(pi_pid);
Case AClass of
CIDSubject:
begin
s_cpt:='';
s_subject:=scbb_Subject.Text;
s_kind:='subject';
i_level:=-1;
i_index:=0;
pi_id^:=getRandomId('IndexData');
pi_pid^:=0;
end;
CIDRootNode:
begin
s_cpt:=CurNode.Text;
s_subject:=scbb_Subject.Text;
s_kind:='wangle';
i_level:=CurNode.Level;
i_index:=CurNode.Index;
pi_id:=CurNode.data;
pi_pid^:=0;
end;
CIDNode:
begin
s_cpt:=CurNode.Text;
s_subject:=scbb_Subject.Text;
s_kind:='wangle';
i_level:=CurNode.Level;
i_index:=CurNode.Index;
pi_id:=CurNode.data;
if Assigned(CurNode.Parent) then
pi_pid:=CurNode.Parent.Data
else
pi_pid^:=0;
end;
CIDDoc:
begin
s_cpt:=CurNode.Text;
s_subject:=scbb_Subject.Text;
s_kind:='document';
i_level:=CurNode.Level;
i_index:=CurNode.Index;
pi_id:=CurNode.data;
pi_pid:=CurNode.Parent.Data;
end;
end;
s_sql:='Update IndexData SET pid=:pid,NodeCaption=:nodecaption,nodelevel=:nodelevel,'
+'nodeindex=:nodeindex,nodekind=:nodekind,subject=:subject';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(s_sql);
ADOQuery1.SQL.Add('Where Id='+IntToStr(pi_id^));
ADOQuery1.Parameters.ParamByName('PID').Value:=pi_pid^;
ADOQuery1.Parameters.ParamByName('Nodelevel').Value:=i_level;
ADOQuery1.Parameters.ParamByName('nodeindex').Value:=i_index;
ADOQuery1.Parameters.ParamByName('nodekind').Value:=s_kind;
ADOQuery1.Parameters.ParamByName('nodecaption').Value:=s_cpt;
ADOQuery1.Parameters.ParamByName('subject').Value:=s_subject;
ADOQuery1.ExecSQL;
end;
procedure TMainFrm.UpdateIndexNode(TmpNode: TTreeNode);
var
pi_id,pi_pid:^integer;
i_level,i_index:integer;
s_cpt,s_kind,s_subject,s_sql:string;
begin
New(pi_id);
New(pi_pid);
s_cpt:=TmpNode.Text;
s_subject:=scbb_Subject.Text;
s_kind:='wangle';
i_level:=TmpNode.Level;
i_index:=TmpNode.Index;
pi_id:=TmpNode.data;
if i_level<>0 then
pi_pid:=TmpNode.Parent.Data
else
pi_pid^:=0;
pi_id:=TmpNode.Data;
s_sql:='Update IndexData SET pid=:pid,NodeCaption=:nodecaption,nodelevel=:nodelevel,'
+'nodeindex=:nodeindex,nodekind=:nodekind,subject=:subject';
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(s_sql);
ADOQuery1.SQL.Add('Where ID='+IntToStr(pi_id^));
ADOQuery1.Parameters.ParamByName('PID').Value:=pi_pid^;
ADOQuery1.Parameters.ParamByName('Nodelevel').Value:=i_level;
ADOQuery1.Parameters.ParamByName('nodeindex').Value:=i_index;
ADOQuery1.Parameters.ParamByName('nodekind').Value:=s_kind;
ADOQuery1.Parameters.ParamByName('nodecaption').Value:=s_cpt;
ADOQuery1.Parameters.ParamByName('subject').Value:=s_subject;
ADOQuery1.ExecSQL;
end;
//=============================================================================//
procedure TMainFrm.NewSubjectExecute(Sender: TObject);
var
Index:integer;
TempStr:String;
begin
With TAddFrm.Create(Self) Do
begin
Caption:='新建课题';
lbl_Caption.Caption:='课题名';
lbl_Info.Caption :='注意不要输入重复的课题,字数不要超过50个ASCII字符';
srb_borther.Visible :=False;
srb_son.Visible :=False;
if ShowModal=mrOk then
begin
Index:=scbb_Subject.Items.Add(sedt_caption.Text);
scbb_Subject.ItemIndex:=Index;
SaveIndexNode(nil,CIDSubject);
sTV_Main.Items.Clear;
TempStr:='<b>提示</b><p>'
+'新建好的课题是空的课题,您必须添加目录和文档到课题。<br><br>'
+'在没有根目录的时候是不能直接添加文档的,所以您至少要为该课题新建一个根节点(根目录)。<br>'
+'您可以点击“新建根节点(根目录)”在该课题下新建一个根目录。<br>';
DBookBrowser.DisplayModalPage('新建课题'+sedt_caption.Text,Tempstr);
end;
Free;
end;
end;
procedure TMainFrm.NewRootNodeExecute(Sender: TObject);
var
pi_id:^integer;
TmpNode:TTreeNode;
TempStr:String;
begin
New(pi_id);
with TAddFrm.Create(self) do
begin
Caption:='新建根类别';
lbl_Caption.Caption:='根类别名';
lbl_Info.Caption :='注意字数不要超过255个ASCII字符';
srb_borther.Visible :=False;
srb_son.Visible :=False;
if ShowModal=mrOk then
begin
pi_id^:=getRandomId('IndexData');
TmpNode:=sTV_Main.Items.AddObject(nil,sedt_caption.text,pi_id);
TmpNode.ImageIndex:=1;
TmpNode.SelectedIndex:=TmpNode.ImageIndex; //保持选中时和没有选中时节点图标相同
SaveIndexNode(TmpNode,CIDRootNode);
TmpNode.Selected :=True;
TempStr:='<b>提示</b><p>'
+'现在您可以选择添加文档,如果您想分得更细的话可以新建子类别<br><br>'
+'如果您还想新建根类别的话只需再次新建根类别。<br>';
DBookBrowser.DisplayModalPage('新建根类别'+sedt_caption.Text,Tempstr);
end;
free;
end;
end;
procedure TMainFrm.NewNodeExecute(Sender: TObject);
var
pi_id:^integer;
TmpNode:TTreeNode;
TempStr:string;
begin
New(pi_id);
if sTV_Main.Selected =nil then Exit;
if IsDocNode(sTV_Main.Selected) then
begin
MessageBox(Handle,'文档下面不能再添加类别!','提示',MB_OK + MB_ICONERROR);
Exit;
end;
with TAddFrm.Create(self) do
begin
Caption:='新建子类别';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -