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

📄 mainunit.pas

📁 一个漂亮的电子书籍阅读管理器
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    CutNodePopMenuItem.Enabled:=false;
    CopyNodePopMenuItem.Enabled:=false;
  end
  else
  begin
    DelNodePopMenuItem.Enabled:=true;
    EditNodePopMenuItem.Enabled:=true;
    AddSubNodePopMenuItem.Enabled:=true;
    CutNodePopMenuItem.Enabled:=true;
    CopyNodePopMenuItem.Enabled:=true;

  end;
  if SrmClip.Node=nil then
    PasteNodePopMenuItem.Enabled:=false
  else
    PasteNodePopMenuItem.Enabled:=true;
end;



//****************************************************************
//---------------------------------------------------------------------
procedure TSrmForm.StatusBarDrawPanel(StatusBar: TStatusBar;
  Panel: TStatusPanel; const Rect: TRect);
var
  Text:string;
  Rc:TRect;
begin
  Rc:=Rect;
  Rc.Left:=Rc.Left+3;
  if Panel=StatusBar.Panels[0] then
  begin
    Text:=csPanel1Text+IntToStr(TreeView.Items.Count);
  end;
  if Panel=StatusBar.Panels[1] then
  begin
    Text:=csPanel2Text+IntToStr(RichEdit.GetTextLen);
  end;
  if Panel=StatusBar.Panels[2] then
  begin
    Text:=PanelHint;
  end;
  with StatusBar.Canvas do
  begin
    Brush.Style := bsClear;
    Font := StatusBar.Font;
    Font.Color := clWhite;
    OffsetRect(Rc,5,1);
    DrawText(Handle, PChar(Text), Length(Text), Rc,(DT_VCENTER or DT_SINGLELINE));
    OffsetRect(Rc,-1,-1);
    Font:=StatusBar.Font;
    DrawText(Handle, PChar(Text), Length(Text), Rc,(DT_VCENTER or DT_SINGLELINE));
  end;
end;

//****************************************************************
//新建数据文件-------------------------------------------------------------
procedure TSrmForm.NewMenuItemClick(Sender: TObject);
begin
  with SaveDialog do
  begin
    DefaultExt:=csSrmExt;
    Filter:=csSrmFilter;
    Title:=csCreateTitle;
  end;
  if SaveDialog.Execute then
  begin
    if CloseSrmQuery then CloseSrm else exit;
    Srm:=TSrmObject.Create(SaveDialog.FileName,fmCreate);
    DbAuthorEdit.Text:='';
    DbPasswordEdit.Text:='';
    DbBuildDateEdit.Text:=DateToStr(Srm.FileHead.BuildDate);
    DbeditDateEdit.Text:=DatetoStr(Srm.FileHead.EditDate);
    Caption:=csAppName+' - '+SaveDialog.FileName;
    Mru.Add(SaveDialog.FileName);
  end;
end;
//打开数据文件------------------------------------------------------------
procedure TSrmForm.OpenMenuItemClick(Sender: TObject);
begin
  with OpenDialog do
  begin
    DefaultExt:=csSrmExt;
    Filter:=csSrmFilter;
    Title:=csOpenTitle;
    FileName:='';
  end;
  if OpenDialog.Execute then
  begin
    if CloseSrmQuery then CloseSrm else exit;
    OpenSrm(OpenDialog.FileName);
     if Srm=nil then
      Caption:=csAppName
     else
     begin
       Caption:=csAppName+' - '+OpenDialog.FileName;
       Mru.Add(OpenDialog.FileName);
     end;
  end;
end;
//保存数据文件------------------------------------------------------------
procedure TSrmForm.SaveMenuItemClick(Sender: TObject);
begin
  SaveSrm;
end;
//关闭数据文件------------------------------------------------------------
procedure TSrmForm.CloseMenuItemClick(Sender: TObject);
begin
  if CloseSrmQuery then
  begin
    CloseSrm;
    Caption:=csAppName;
  end;
end;
//文件引入-----------------------------------------------------------------
procedure TSrmForm.FImportMenuItemClick(Sender: TObject);
var

  Ps,UserPs:string;
  ms,Msh,Msd:TMemoryStream;
  j:integer;
  p:PTreeData;
  AList: TStringList;
  ALevel,AOldLevel:integer;
  AParentNode:TTreeNode;
  StrBuf:PChar;
  SrmImport:TSrmObject;
  ANode:TTreeNode;
  i,n:integer;
  Fn:string;
begin
  with OpenDialog do
  begin
    DefaultExt:=csTxtExt;
    Filter:=csTxtFilter+'|'+csSrmFilter; //*
    Title:=csOpenTitle;
    FileName:='';
  end;
  if OpenDialog.Execute then
   
    RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘
    for i:=0 to OpenDialog.Files.Count-1 do  //循环读入多重选择文件

  if lowercase(ExtractFileExt(OpenDialog.Files.Strings[i]))='.srm'  then //*导入SRM文件
   begin
 SrmImport:=TSrmObject.Create(OpenDialog.Files.Strings[i],fmOpenReadWrite);
  if SrmImport.FileHead.Password[0]<>#0 then    //密码保护
  begin
    InPwForm:=TInPwForm.Create(SrmForm);
    with InPwForm do
    begin
      Caption:=csAppName;
      InputLabel.Caption:=csPasswordTitle;
      if ShowModal=mrCancel then
      begin
        SrmImport.Free;
        Free;
        break;
      end;
      Ps:=Edit.Text;
      UserPs:=string(SrmImport.FileHead.Password);
      if Ps<>UserPs then
      begin
        if ModalResult<>mrCancel then
          Application.MessageBox(csAppName,csPasswordError,MB_OK);
        SrmImport.Free;
        Free;
        break;
      end;
      Free;
    end;
  end;
  Screen.Cursor:=crHourGlass;
  Msh:=TMemoryStream.Create;
  Msd:=TMemoryStream.Create;
  SrmImport.LoadIndex(Msh,Msd);                 //装入索引
  AList := TStringList.Create;
  SrmForm.TreeView.Items.BeginUpdate;
  AList.LoadFromStream(Msh);     //装入到字符串列表中
  AOldLevel:=0   ;     //计算当前节点的级数
  AParentNode :=Nil;
  p:=Msd.Memory;
  for n:=0 to AList.Count-1 do                        //根据TAB的多少得到相应级别
  begin
    StrBuf:=PChar(AList.Strings[n]);
    ALevel:=0;
    while StrBuf^=#9 do                   //得该项所在层数
    begin
      Inc(StrBuf);
      Inc(ALevel);
    end;
    if (ALevel<AOldLevel) or (AParentNode<>nil) then
    begin                                 //返回该项的上级节点
      for j:=AOldLevel downto ALevel do
      begin
        AParentNode:=AParentNode.Parent;
      end;
    end;
    AParentNode:=SrmForm.TreeView.Items.AddChildObject(AParentNode,StrBuf,
                                     pointer(-1));
    AParentNode.ImageIndex:=p.DataType;   //得该节点类型
    AOldLevel:=ALevel;
    SrmImport.ReadItemHead(integer(p.pos));
    srm.DataHead :=SrmImport.DataHead ;  //读入标题属性
    TreeView.Selected :=AParentNode;
  case SrmImport.DataHead.Num of
    0:                //无内容
    begin
      RichEdit.Text:='';
    end;
    1:
    begin
      Ms:=TMemoryStream.Create;
      SrmImport.ReadItemData(Ms);
      RichEdit.PlainText:=true; //和3.2版兼容
      RichEdit.SetTextBuf(Ms.Memory);
      RichEdit.PlainText:=false;//和3.2版兼容
      Ms.Free;
    end;
  end;

    //Srm.ItemDataChanged:=true;
        p:=pointer(integer(p)+sizeof(TTreeData));
  end;
  SrmForm.TreeView.Items.EndUpdate;
  AList.Free;
  Msd.Free;
  Msh.Free;
   SrmImport.Free;
   TreeView.Selected:=SrmForm.TreeView.Items[0];         //置当前选择项为空
   TreeView.FullCollapse;

  end
else
  begin

      Fn:=ExtractFileName(OpenDialog.Files.Strings[i]);
      Delete(Fn,Length(Fn)-3,4);
      ANode:=TreeView.Items.AddObjectFirst(TreeView.Selected,Fn,pointer(-1));
      ANode.ImageIndex:=2;
      with Srm.DataHead do
      begin
        DataType:=2;
        Author[0]:=#0;
        Password[0]:=#0;
      end;
      TreeView.Selected:=ANode;
      RichEdit.Lines.LoadFromFile(OpenDialog.Files.Strings[i]);
    end  ;
    StatusBar.Refresh;
    RichEdit.Perform(WM_SETREDRAW,-1,0);  //允许重绘
    Richedit.Refresh;
    Screen.Cursor:=crDefault;

end;
//目录引入-----------------------------------------------------------------
procedure TSrmForm.DImportMenuItemClick(Sender: TObject);
var
  Temps:WideString;
  Dir,Mask:string;
  ANode:TTreeNode;
begin
  Temps:='';
//  if not SelectDirectory(csAppName,Temps,Dir) then exit;
  Dir:=BrowseFolder;
  If Dir='' Then exit;
  ANode:=TreeView.Items.AddChildObjectFirst(TreeView.Selected,
       GetLastPathName(Dir),pointer(-1));
  ANode.ImageIndex:=1;
  with Srm.DataHead do
  begin
    DataType:=1;
    Author[0]:=#0;
    Password[0]:=#0;
  end;
  TreeView.Selected:=ANode;
  RichEdit.Modified:=true;
  if Dir[Length(Dir)]<>'\' then Dir:=Dir+'\';
  Mask:='*.'+csTxtExt;
  Screen.Cursor:=crHourGlass;
  RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘
  ImportDir(Dir,Mask);
  RichEdit.Perform(WM_SETREDRAW,-1,0);  //允许重绘
  Richedit.Refresh;
  StatusBar.Refresh;
  SCreen.Cursor:=crDefault;
end;
//导出标题内容--------------------------------------------------------------
procedure TSrmForm.ExportMenuItemClick(Sender: TObject);
var
  Dir:string;
//  i,n:integer;     //对别的格式要导出其附件

  function FormatFileName(Fn:string):string;
  var
    i,n:integer;
    c:char;
  begin
    Result:=Fn;
    n:=Length(Result);
    for i:=1 to n do
    begin
      c:=Result[i];
      if ((c=#92) or (c=#47) or (c=#58) or (c=#42) or (c=#63) or
           (c=#34) or (c=#60) or (c=#62) or (c=#124)) then
        Result[i]:='$';  //替换掉系统不接受的文件命名的字符
    end;
  end;
  procedure OutPutSrm(ANode:TTreeNode;Dir:string);
  var
    SNode:TTreeNode;
    Ms:TMemoryStream;
    Fh:integer;
    Path:string;
  begin
    Ms:=TMemoryStream.Create;
    Path:=Dir;
    SNode:=ANode.GetFirstChild;
    while SNode<>nil do
    begin
      if SNode.ImageIndex=1 then
      begin
        Dir:=Path+FormatFileName(SNode.Text);
        MkDir(Dir);
        Dir:=Dir+'\';
        OutPutSrm(SNode,Dir);
      end
      else
      begin
        Srm.ReadItemHead(integer(SNode.Data));
        if ((Srm.DataHead.Password[0]=#0) and (Srm.DataHead.Num=1)) then
        begin       //没有口令的内容才导出
          Srm.ReadItemData(Ms);
          Fh:=FileCreate(Path+FormatFileName(SNode.Text)+'.'+csTxtExt);
          if Fh<>0 then FileWrite(Fh,Ms.Memory^,Ms.Size);
          FileClose(Fh);
        end;
      end;
      SNode:=SNode.GetNextSibling;
    end;
    Ms.Free;
  end;
begin
  if TreeView.Selected=nil then exit;
  if TreeView.Selected.GetFirstChild=nil then
  begin
    with SaveDialog do
    begin
      DefaultExt:=csTxtExt;
      Filter:=csTxtFilter;
      Title:=csSaveAsTitle;
      FileName:=TreeView.Selected.Text;
    end;
    if SaveDialog.Execute then
    begin
      RichEdit.Lines.SaveToFile(SaveDialog.FileName);
    end;
  end
  else
  begin
    Dir:=BrowseFolder;
    If Dir='' Then exit;
    if Dir[Length(Dir)]<>'\' then Dir:=Dir+'\';
    Dir:=Dir+FormatFileName(TreeView.Selected.Text);
    if DirectoryExists(Dir) then
    begin
      Application.MessageBox(csDirExists,csAppName,MB_OK or MB_ICONERROR);
      exit;
    end;
    MkDir(Dir);
    Dir:=Dir+'\';
    Screen.Cursor:=crHourGlass;
    OutPutSrm(TreeView.Selected,Dir);
    Screen.Cursor:=crDefault;
  end;
end;
//打印内容------------------------------------------------------------------
procedure TSrmForm.PrintMenuItemClick(Sender: TObject);
begin
  if RichEdit.GetTextLen()=0 then
    RichEdit.Print(TitleLabel.Caption);
end;
//退出菜单-----------------------------------------------------------------
procedure TSrmForm.ExitMenuItemClick(Sender: TObject);
begin
  Close;
end;
//最近文件列表-----------------------------------------------------------------
procedure TSrmForm.ListMenuItemClick(Sender: TObject);
var
  Temps:string;
begin
  if CloseSrmQuery then closeSrm else exit;
  Temps:=Mru.FileList[TMenuItem(Sender).Tag];
  if Temps<>'' then
    if FileExists(Temps) then
     OpenSrm(Temps);
  if Srm=nil then
    Caption:=csAppName
  else
  begin
    Caption:=csAppName+' - '+Temps;
    Mru.Add(Temps);
  end;
end;
//我的最爱-----------------------------------------------------------------
procedure TSrmForm.MyLoveMenuItemClick(Sender: TObject);
begin
  if CloseSrmQuery then CloseSrm else exit;
  if AppIni.MyLoveFile<>'' then

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -