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

📄 main.pas

📁 -个人文档管理专家V1.10版本源码
💻 PAS
📖 第 1 页 / 共 4 页
字号:
        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 + -