MainUnit.~pas
上传用户:tj00001
上传日期:2007-01-07
资源大小:672k
文件大小:59k
源码类别:

行业应用

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. //(R)CopyRight KivenSoft International ,inc 1998
  3. //程序名称:电子书库
  4. //单元名称:主窗口单元
  5. //作    者:李会文
  6. //单元名称:主程序单元
  7. //开始时间:1998.07.28
  8. //最后修改:1999.07.22
  9. //---------------------------------------------------------------------------
  10. unit MainUnit;
  11. interface
  12. uses
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   Menus, StdCtrls, ComCtrls, CommCtrl, ExtCtrls, ToolWin, ShellApi, Registry,
  15.   SrmUnit, SrmConst, ShlObj, FileCtrl, RichEdit, ImgList, KvLabel, Buttons,
  16.   jpeg, ActnList;
  17. type
  18.   TSrmForm = class(TForm)
  19.     Splitter: TSplitter;
  20.     StatusBar: TStatusBar;
  21.     LeftForm: TPanel;
  22.     LeftBottomPanel: TPanel;
  23.     RightPanel: TPanel;
  24.     ImageList: TImageList;
  25.     SaveDialog: TSaveDialog;
  26.     OpenDialog: TOpenDialog;
  27.     FindDialog: TFindDialog;
  28.     ReplaceDialog: TReplaceDialog;
  29.     LeftPageControl: TPageControl;
  30.     RightPageControl: TPageControl;
  31.     IndexTabSheet: TTabSheet;
  32.     TreeView: TTreeView;
  33.     DrawTabSheet: TTabSheet;
  34.     PropertiyTabSheet: TTabSheet;
  35.     SearchTabSheet: TTabSheet;
  36.     ProTabSheet: TTabSheet;
  37.     DbAuthorEdit: TEdit;
  38.     DbPasswordEdit: TEdit;
  39.     DbBuildDateEdit: TEdit;
  40.     DbEditDateEdit: TEdit;
  41.     ContextAuthorEdit: TEdit;
  42.     ContextPasswordEdit: TEdit;
  43.     ContextPubDateEdit: TEdit;
  44.     ContextIndexEdit: TEdit;
  45.     SearchListBox: TListBox;
  46.     ContextTypeRadioGroup: TRadioGroup;
  47.     MainFormMenu: TMainMenu;
  48.     FileMenuItem: TMenuItem;
  49.     NewMenuItem: TMenuItem;
  50.     OpenMenuItem: TMenuItem;
  51.     SaveMenuItem: TMenuItem;
  52.     CloseMenuItem: TMenuItem;
  53.     N1: TMenuItem;
  54.     FImportMenuItem: TMenuItem;
  55.     DImportMenuItem: TMenuItem;
  56.     ExportMenuItem: TMenuItem;
  57.     N3: TMenuItem;
  58.     PrintMenuItem: TMenuItem;
  59.     N4: TMenuItem;
  60.     ListMenuItem: TMenuItem;
  61.     MenuItem2: TMenuItem;
  62.     MenuItem3: TMenuItem;
  63.     MenuItem4: TMenuItem;
  64.     MenuItem5: TMenuItem;
  65.     MyLoveMenuItem: TMenuItem;
  66.     MyLoveNextMenuItem: TMenuItem;
  67.     ExitMenuItem: TMenuItem;
  68.     EditMenuItem: TMenuItem;
  69.     UndoMenuItem: TMenuItem;
  70.     RedoMenuItem: TMenuItem;
  71.     N6: TMenuItem;
  72.     CutMenuItem: TMenuItem;
  73.     CopyMenuItem: TMenuItem;
  74.     PasteMenuItem: TMenuItem;
  75.     N7: TMenuItem;
  76.     SelAllMenuItem: TMenuItem;
  77.     N8: TMenuItem;
  78.     FindMenuItem: TMenuItem;
  79.     FindNextMenuItem: TMenuItem;
  80.     ReplaceMenuItem: TMenuItem;
  81.     N9: TMenuItem;
  82.     DelSpaceMenuItem: TMenuItem;
  83.     ViewMenuItem: TMenuItem;
  84.     ToolsMenuItem: TMenuItem;
  85.     StatusMenuItem: TMenuItem;
  86.     TitleMenuItem: TMenuItem;
  87.     ReadOnlyMenuItem: TMenuItem;
  88.     BigFontMenuItem: TMenuItem;
  89.     SmallFontMenuItem: TMenuItem;
  90.     N10: TMenuItem;
  91.     OptionsMenuItem: TMenuItem;
  92.     OperatorMenuItem: TMenuItem;
  93.     AddNodeMenuItem: TMenuItem;
  94.     AddSubNodeMenuItem: TMenuItem;
  95.     EditNodeMenuItem: TMenuItem;
  96.     DelNodeMenuItem: TMenuItem;
  97.     N11: TMenuItem;
  98.     SortMenuItem: TMenuItem;
  99.     N12: TMenuItem;
  100.     CompressMenuItem: TMenuItem;
  101.     CovertMenuItem: TMenuItem;
  102.     HelpMenuItem: TMenuItem;
  103.     AboutMenuItem: TMenuItem;
  104.     ReadmeMenuItem: TMenuItem;
  105.     N13: TMenuItem;
  106.     HomePageMenuItem: TMenuItem;
  107.     EMailMenuItem: TMenuItem;
  108.     OtherMenuItem: TMenuItem;
  109.     KivenLabel: TKvLabel;
  110.     N2: TMenuItem;
  111.     DbAuthorLabel: TKvLabel;
  112.     DbPasswordLabel: TKvLabel;
  113.     BuildDateLabel: TKvLabel;
  114.     DbEditDateLabel: TKvLabel;
  115.     ContextAuthorLabel: TKvLabel;
  116.     ContextPasswordLabel: TKvLabel;
  117.     ContextPubDateLabel: TKvLabel;
  118.     KvLabel1ContextIndexLabel: TKvLabel;
  119.     TreeViewPopupMenu: TPopupMenu;
  120.     AddNodePopMenuItem: TMenuItem;
  121.     AddSubNodePopMenuItem: TMenuItem;
  122.     DelNodePopMenuItem: TMenuItem;
  123.     EditNodePopMenuItem: TMenuItem;
  124.     N14: TMenuItem;
  125.     CutNodePopMenuItem: TMenuItem;
  126.     CopyNodePopMenuItem: TMenuItem;
  127.     PasteNodePopMenuItem: TMenuItem;
  128.     RichEditPopupMenu: TPopupMenu;
  129.     CutPopMenuItem: TMenuItem;
  130.     CopyPopMenuItem: TMenuItem;
  131.     PastePopMenuItem: TMenuItem;
  132.     SelAllPopMenuItem: TMenuItem;
  133.     N15: TMenuItem;
  134.     DelSpacePopMenuItem: TMenuItem;
  135.     SetTitlePopMenuItem: TMenuItem;
  136.     SetIndexPopMenuItem: TMenuItem;
  137.     SetAuthorPopMenuItem: TMenuItem;
  138.     RichEdit: TRichEdit;
  139.     RightTopPanel: TPanel;
  140.     TitleLabel: TKvLabel;
  141.     PrevSpeedButton: TSpeedButton;
  142.     NextSpeedButton: TSpeedButton;
  143.     ControlBar: TControlBar;
  144.     FileToolBar: TToolBar;
  145.     OpenToolButton: TToolButton;
  146.     SaveToolButton: TToolButton;
  147.     MyLoveToolButton: TToolButton;
  148.     PrintToolButton: TToolButton;
  149.     MenuToolBar: TToolBar;
  150.     FileToolButton: TToolButton;
  151.     EditToolButton: TToolButton;
  152.     ViewToolButton: TToolButton;
  153.     OperatorToolButton: TToolButton;
  154.     HelpToolButton: TToolButton;
  155.     EditToolBar: TToolBar;
  156.     CutToolButton: TToolButton;
  157.     CopyToolButton: TToolButton;
  158.     PasteToolButton: TToolButton;
  159.     FindToolButton: TToolButton;
  160.     ActionList: TActionList;
  161.     NewAction: TAction;
  162.     OpenAction: TAction;
  163.     SaveAction: TAction;
  164.     CloseAction: TAction;
  165.     FImportAction: TAction;
  166.     DImportAction: TAction;
  167.     ExportAction: TAction;
  168.     PrintAction: TAction;
  169.     MyLoveAction: TAction;
  170.     ExitAction: TAction;
  171.     UndoAction: TAction;
  172.     RedoAction: TAction;
  173.     CutAction: TAction;
  174.     CopyAction: TAction;
  175.     PasteAction: TAction;
  176.     SelAllAction: TAction;
  177.     FindAction: TAction;
  178.     FindNextAction: TAction;
  179.     ReplaceAction: TAction;
  180.     DelSpaceAction: TAction;
  181.     ToolsAction: TAction;
  182.     StatusAction: TAction;
  183.     ReadOnlyAction: TAction;
  184.     BigFontAction: TAction;
  185.     SmallFontAction: TAction;
  186.     OptionAction: TAction;
  187.     AddNodeAction: TAction;
  188.     AddSubNodeAction: TAction;
  189.     EditNodeAction: TAction;
  190.     DelNodeAction: TAction;
  191.     SortAction: TAction;
  192.     CompressAction: TAction;
  193.     CovertAction: TAction;
  194.     AboutAction: TAction;
  195.     ReadMeAction: TAction;
  196.     HomePageAction: TAction;
  197.     EMailAction: TAction;
  198.     OtherAction: TAction;
  199.     TitleAction: TAction;
  200.     ViewToolBar: TToolBar;
  201.     ReadOnlyToolButton: TToolButton;
  202.     ToolButton4: TToolButton;
  203.     BigFontToolButton: TToolButton;
  204.     SmallFontToolButton: TToolButton;
  205.     OperatorToolBar: TToolBar;
  206.     AddNodeToolButton: TToolButton;
  207.     AddSubNodeToolButton: TToolButton;
  208.     EditNodeToolButton: TToolButton;
  209.     DelNodeToolButton: TToolButton;
  210.     OtherToolBar: TToolBar;
  211.     ReadMeToolButton: TToolButton;
  212.     AboutToolButton: TToolButton;
  213.     ToolButton7: TToolButton;
  214.     HomePageToolButton: TToolButton;
  215.     EMailToolButton: TToolButton;
  216.     ToolButton8: TToolButton;
  217.     ExitToolButton: TToolButton;
  218.     ToolButton1: TToolButton;
  219.     ToolButton2: TToolButton;
  220.     ToolButton3: TToolButton;
  221.     WordWrapAction: TAction;
  222.     WordWrapMenuItem: TMenuItem;
  223.     WordWrapToolButton: TToolButton;
  224.     N5: TMenuItem;
  225.     TitleToolButton: TToolButton;
  226.     N16: TMenuItem;
  227.     ExportPopMenuItem: TMenuItem;
  228.     CParaAction: TAction;
  229.     DParaAction: TAction;
  230.     CParaMenuItem: TMenuItem;
  231.     DParaMenuItem: TMenuItem;
  232.     GbToBigAction: TAction;
  233.     BigToGbAction: TAction;
  234.     N17: TMenuItem;
  235.     GbToBigMenuItem: TMenuItem;
  236.     BigToGbMenuItem: TMenuItem;
  237.     procedure FormShow(Sender: TObject);
  238.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  239.     procedure FormDestroy(Sender: TObject);
  240.     procedure FormCreate(Sender: TObject);
  241.     procedure StatusBarDrawPanel(StatusBar: TStatusBar;
  242.       Panel: TStatusPanel; const Rect: TRect);
  243.     procedure NewMenuItemClick(Sender: TObject);
  244.     procedure CovertMenuItemClick(Sender: TObject);
  245.     procedure OpenMenuItemClick(Sender: TObject);
  246.     procedure TreeViewChange(Sender: TObject; Node: TTreeNode);
  247.     procedure CloseMenuItemClick(Sender: TObject);
  248.     procedure SaveMenuItemClick(Sender: TObject);
  249.     procedure TreeViewEdited(Sender: TObject; Node: TTreeNode;
  250.       var S: String);
  251.     procedure FImportMenuItemClick(Sender: TObject);
  252.     procedure ExportMenuItemClick(Sender: TObject);
  253.     procedure PrintMenuItemClick(Sender: TObject);
  254.     procedure ExitMenuItemClick(Sender: TObject);
  255.     procedure TreeViewChanging(Sender: TObject; Node: TTreeNode;
  256.       var AllowChange: Boolean);
  257.     procedure UndoMenuItemClick(Sender: TObject);
  258.     procedure RedoMenuItemClick(Sender: TObject);
  259.     procedure CutMenuItemClick(Sender: TObject);
  260.     procedure CopyMenuItemClick(Sender: TObject);
  261.     procedure PasteMenuItemClick(Sender: TObject);
  262.     procedure SelAllMenuItemClick(Sender: TObject);
  263.     procedure FindMenuItemClick(Sender: TObject);
  264.     procedure FindNextMenuItemClick(Sender: TObject);
  265.     procedure ReplaceMenuItemClick(Sender: TObject);
  266.     procedure DelSpaceMenuItemClick(Sender: TObject);
  267.     procedure FindDialogFind(Sender: TObject);
  268.     procedure ReplaceDialogReplace(Sender: TObject);
  269.     procedure ToolsMenuItemClick(Sender: TObject);
  270.     procedure StatusMenuItemClick(Sender: TObject);
  271.     procedure TitleMenuItemClick(Sender: TObject);
  272.     procedure ReadOnlyMenuItemClick(Sender: TObject);
  273.     procedure BigFontMenuItemClick(Sender: TObject);
  274.     procedure SmallFontMenuItemClick(Sender: TObject);
  275.     procedure OptionsMenuItemClick(Sender: TObject);
  276.     procedure AddNodeMenuItemClick(Sender: TObject);
  277.     procedure AddSubNodeMenuItemClick(Sender: TObject);
  278.     procedure EditNodeMenuItemClick(Sender: TObject);
  279.     procedure DelNodeMenuItemClick(Sender: TObject);
  280.     procedure SortMenuItemClick(Sender: TObject);
  281.     procedure CompressMenuItemClick(Sender: TObject);
  282.     procedure MyLoveMenuItemClick(Sender: TObject);
  283.     procedure HomePageMenuItemClick(Sender: TObject);
  284.     procedure AboutMenuItemClick(Sender: TObject);
  285.     procedure ReadmeMenuItemClick(Sender: TObject);
  286.     procedure EMailMenuItemClick(Sender: TObject);
  287.     procedure OtherMenuItemClick(Sender: TObject);
  288.     procedure DImportMenuItemClick(Sender: TObject);
  289.     procedure SetTitlePopMenuItemClick(Sender: TObject);
  290.     procedure TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
  291.       State: TDragState; var Accept: Boolean);
  292.     procedure TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer);
  293.     procedure CutNodePopMenuItemClick(Sender: TObject);
  294.     procedure CopyNodePopMenuItemClick(Sender: TObject);
  295.     procedure PasteNodePopMenuItemClick(Sender: TObject);
  296.     procedure TreeViewPopupMenuPopup(Sender: TObject);
  297.     procedure RichEditPopupMenuPopup(Sender: TObject);
  298.     procedure FileMenuItemClick(Sender: TObject);
  299.     procedure EditMenuItemClick(Sender: TObject);
  300.     procedure DbAuthorEditChange(Sender: TObject);
  301.     procedure ContextAuthorEditChange(Sender: TObject);
  302.     procedure SetAuthorPopMenuItemClick(Sender: TObject);
  303.     procedure SetIndexPopMenuItemClick(Sender: TObject);
  304.   
  305.     procedure PrevSpeedButtonClick(Sender: TObject);
  306.     procedure NextSpeedButtonClick(Sender: TObject);
  307.     procedure TreeViewExpanding(Sender: TObject; Node: TTreeNode;
  308.       var AllowExpansion: Boolean);
  309.     procedure ContextTypeRadioGroupClick(Sender: TObject);
  310.     procedure RichEditChange(Sender: TObject);
  311.     procedure ListMenuItemClick(Sender: TObject);
  312.     procedure TreeViewCompare(Sender: TObject; Node1, Node2: TTreeNode;
  313.       Data: Integer; var Compare: Integer);
  314.     procedure RichEditKeyDown(Sender: TObject; var Key: Word;
  315.       Shift: TShiftState);
  316.     procedure ControlBarDockOver(Sender: TObject; Source: TDragDockObject;
  317.       X, Y: Integer; State: TDragState; var Accept: Boolean);
  318.     procedure WordWrapMenuItemClick(Sender: TObject);
  319.     procedure CParaMenuItemClick(Sender: TObject);
  320.     procedure DParaMenuItemClick(Sender: TObject);
  321.     procedure GbToBigMenuItemClick(Sender: TObject);
  322.     procedure BigToGbMenuItemClick(Sender: TObject);
  323.   private
  324.     { Private declarations }
  325.     procedure MyShowHint(Sender:TObject); //应用程序提示函数
  326.   public
  327.     { Public declarations }
  328.   end;
  329. var
  330.   SrmForm: TSrmForm;
  331.   PanelHint:string;                  //在线提示
  332.   Srm: TSrmObject;   //Srm读写类
  333. implementation
  334. uses SrmAbout, InputPw, SrmOption, MainFun, RegUnit, MruUnit, ClipUnit,
  335.   GbBig;
  336. {$R *.DFM}
  337. //****************************************************************
  338. procedure TSrmForm.MyShowHint(Sender:TObject);
  339. begin
  340.   PanelHint:=GetLongHint(Application.Hint);
  341.   SrmForm.StatusBar.Refresh;
  342. end;
  343. //****************************************************************
  344. //窗体新建前----------------------------------------------------------------
  345. procedure TSrmForm.FormCreate(Sender: TObject);
  346. var
  347.   i:integer;
  348. begin
  349.   //变量初始化
  350.   SrmClip:=TSrmClip.Create;  //初始化自身剪贴板
  351.   AppIni:=TAppIni.Create;   //读入配置信息和状态信息
  352.   Mru:=TMru.Create;              //文件菜单的设置
  353.   Mru.ParentMenu:=FileMenuItem;
  354.   Mru.Position:=11;
  355.   Mru.Visible:=AppIni.FileListVisible;
  356.   for i:=4 downto 0 do Mru.Add(AppIni.FileList[i]);
  357.   MyLoveMenuItem.Enabled:=AppIni.MyLoveFile<>'';
  358.   MyLoveMenuItem.Visible:=AppIni.MyLoveVisible;
  359.   MyLoveNextMenuItem.Visible:=Appini.MyLoveVisible;
  360.   if ParamCount=1 then
  361.   begin
  362.     OpenSrm(ParamStr(1)); //带文件名参数运行时
  363.     exit;
  364.   end;
  365.   if AppIni.LoadNearFile then        //如果允许打开上次关闭时的文件
  366.     if AppIni.NearFile<>'' then        //否则打开上次关闭时的文件
  367.       if FileExists(AppIni.NearFile) then  //文件存在时
  368.       begin
  369.         OpenSrm(AppIni.NearFile);
  370.         if Srm<>nil then Caption:=csAppName+' - '+Srm.FileName;
  371.       end;
  372.   Application.OnHint:=MyShowHint;
  373. end;
  374. //窗体显示前----------------------------------------------------------------
  375. procedure TSrmForm.FormShow(Sender: TObject);
  376. begin
  377. //
  378. end;
  379. //窗体关闭前----------------------------------------------------------------
  380. procedure TSrmForm.FormClose(Sender: TObject; var Action: TCloseAction);
  381. begin
  382.   if Srm<>nil then
  383.     AppIni.NearFile:=Srm.FileName
  384.   else
  385.     AppIni.NearFile:='';
  386.   if CloseSrmQuery then
  387.     CloseSrm
  388.   else
  389.   begin
  390.     Action:=caNone;
  391.     exit;
  392.   end;
  393.   Action:=caFree;
  394. end;
  395. //窗体释放前----------------------------------------------------------------
  396. procedure TSrmForm.FormDestroy(Sender: TObject);
  397. var
  398.   i:integer;
  399. begin
  400.   for i:=0 to 4 do AppIni.FileList[i]:=Mru.FileList[i];
  401.   Mru.Free;
  402.   AppIni.Free;
  403.   SrmClip.Free;
  404. end;
  405. //****************************************************************
  406. //查找文本---------------------------------------------------------------
  407. procedure TSrmForm.FindDialogFind(Sender: TObject);
  408. var
  409.   FoundAt,StartPos,ToEnd:integer;
  410.   SearchFlag:TSearchTypes;
  411. begin
  412.   if frMatchCase in FindDialog.Options then
  413.     SearchFlag:=SearchFlag+[stMatchCase];
  414.   if frWholeWord in FindDialog.Options then
  415.     SearchFlag:=SearchFlag+[stWholeWord];
  416.   StartPos:=RichEdit.SelStart+RichEdit.SelLength;
  417.   ToEnd:=Length(RichEdit.Text)-StartPos;
  418.   FoundAt:=RichEdit.FindText(FindDialog.FindText,StartPos,ToEnd,
  419.                              SearchFlag);
  420.   if FoundAt<>-1 then
  421.   begin
  422.     RichEdit.SetFocus;
  423.     RichEdit.SelStart:=FoundAt;
  424.     RichEdit.SelLength:=Length(FindDialog.FindText);
  425.   end
  426.   else
  427.   begin
  428.     MessageBox(Handle,csFindError,csAppName,MB_OK or MB_ICONWARNING);
  429.   end;
  430. end;
  431. //替换文本---------------------------------------------------------------
  432. procedure TSrmForm.ReplaceDialogReplace(Sender: TObject);
  433. var
  434.   FoundAt,StartPos,ToEnd:integer;
  435.   SearchFlag:TSearchTypes;
  436. begin
  437.   if frMatchCase in ReplaceDialog.Options then
  438.     SearchFlag:=SearchFlag+[stMatchCase];
  439.   if frWholeWord in ReplaceDialog.Options then
  440.     SearchFlag:=SearchFlag+[stWholeWord];
  441.   StartPos:=0;
  442.   ToEnd:=Length(RichEdit.Text)-StartPos;
  443.   if frReplace in ReplaceDialog.Options then
  444.   begin
  445.     StartPos:=RichEdit.SelStart+RichEdit.SelLength;
  446.     FoundAt:=RichEdit.FindText(ReplaceDialog.FindText,StartPos,ToEnd,
  447.                                SearchFlag);
  448.     if FoundAt<>-1 then
  449.     begin
  450.       RichEdit.SetFocus;
  451.       RichEdit.SelStart := FoundAt;
  452.       RichEdit.SelLength := Length(ReplaceDialog.FindText);
  453.       RichEdit.SelText := ReplaceDialog.ReplaceText;
  454.       RichEdit.SelStart := FoundAt;
  455.       RichEdit.SelLength := Length(ReplaceDialog.ReplaceText);
  456.     end
  457.     else
  458.     begin
  459.       MessageBox(Handle,csFindError,csAppName,MB_OK or MB_ICONWARNING);
  460.     end;
  461.   end
  462.   else if frReplaceAll in ReplaceDialog.Options then
  463.   begin
  464.     StartPos:=0;
  465.     FoundAt:=0;
  466.     while FoundAt<>-1 do
  467.     begin
  468.       FoundAt:=RichEdit.FindText(ReplaceDialog.FindText,StartPos,ToEnd,
  469.                                  SearchFlag);
  470.       if FoundAt<>-1 then
  471.       begin
  472.         RichEdit.SetFocus;
  473.         RichEdit.SelStart := FoundAt;
  474.         RichEdit.SelLength:=Length(ReplaceDialog.FindText);
  475.         RichEdit.SelText:=ReplaceDialog.ReplaceText;
  476.         StartPos:=FoundAt+Length(ReplaceDialog.Findtext);
  477.         ToEnd:=Length(RichEdit.Text)-StartPos;
  478.       end
  479.       else
  480.       begin
  481.         MessageBox(Handle,csReplaceSucess,csAppName,0);
  482.         break;
  483.       end;
  484.     end;
  485.   end
  486.   else
  487.   begin
  488.     FindDialog.Options:=ReplaceDialog.Options;
  489.     FindDialog.FindText:=ReplaceDialog.FindText;
  490.     FindDialogFind(Sender);
  491.   end;
  492. end;
  493. //****************************************************************
  494. //节点改变前---------------------------------------------------------------
  495. procedure TSrmForm.TreeViewChanging(Sender: TObject; Node: TTreeNode;
  496.   var AllowChange: Boolean);
  497. var
  498.   Ps,UserPs:string;
  499. begin
  500.   AllowChange:=true;
  501.   if Srm=nil then exit;
  502.   SaveItem;
  503.   if Node.Data=pointer(-1) then exit;           //如果是新建节点则不检查口令
  504.   Ps:=Srm.GetItemPassword(integer(Node.Data));  //得要显示标题的口令
  505. {  if Ps<>'' then                                //口令不为空时
  506.   begin
  507.     with TInpwForm.Create(self) do
  508.     begin
  509.       Caption:=csAppName;
  510.       InputLabel.Caption:=csPasswordTitle;
  511.       if ShowModal=mrCancel then
  512.       begin
  513.        AllowChange:=false;
  514.       end;
  515.       UserPs:=Edit.Text;
  516.       if Ps<>UserPs then                        //输入口令不对时
  517.       begin
  518.         if ModalResult<>mrCancel then           //在口令输入框中没按Cancel按钮
  519.           Application.MessageBox(csPasswordError,csAppName,MB_OK);
  520.         AllowChange:=false;                     //不允许转移选择点
  521.       end;
  522.       Free;
  523.     end;
  524.   end; }
  525. end;
  526. //节点改变后---------------------------------------------------------------
  527. procedure TSrmForm.TreeViewChange(Sender: TObject; Node: TTreeNode);
  528. var
  529.   Ms:TMemoryStream;
  530. begin
  531.   if Srm=nil then exit;
  532.   if ((Node=nil) or (integer(Node.Data)=-1)) then  //无效节点或无内容
  533.   begin
  534.     ContextAuthorEdit.Text:='';
  535.     ContextPasswordEdit.Text:='';
  536.     ContextPubDateEdit.Text:=DateToStr(Date);
  537.     ContextIndexEdit.Text:='';
  538.     ContextTypeRadioGroup.ItemIndex:=1;
  539.     RichEdit.Text:='';
  540.     RichEdit.Modified:=false;
  541.     if Node<>nil then
  542.     begin
  543.       Srm.ItemHeadChanged:=true;
  544.       Srm.ItemDataChanged:=true;
  545.     end;
  546.     exit;
  547.   end;
  548.   Srm.ReadItemHead(integer(Node.Data));  //读入标题属性
  549.   case Srm.DataHead.Num of
  550.     0:                //无内容
  551.     begin
  552.       RichEdit.Text:='';
  553.     end;
  554.     1:
  555.     begin
  556.       Ms:=TMemoryStream.Create;
  557.       Srm.ReadItemData(Ms);
  558.       RichEdit.PlainText:=true; //和3.2版兼容
  559.       RichEdit.SetTextBuf(Ms.Memory);
  560.       RichEdit.PlainText:=false;//和3.2版兼容
  561.       Ms.Free;
  562.     end;
  563.   end;
  564.   Node.SelectedIndex:=Node.ImageIndex;  //设置标题属性
  565.   ContextAuthorEdit.Text:=string(Srm.DataHead.Author);
  566.   ContextPasswordEdit.Text:=String(Srm.DataHead.Password);
  567.   ContextPubDateEdit.Text:=DateToStr(Srm.DataHead.PubDate);
  568.   ContextIndexEdit.Text:=string(Srm.DataHead.SearchKey);
  569.   ContextTypeRadioGroup.ItemIndex:=Node.ImageIndex-1;
  570.   TitleLabel.Caption:=Node.Text;
  571.   StatusBar.Refresh;
  572.   RichEdit.Modified:=false;
  573.   Srm.ItemHeadChanged:=false;
  574.   Srm.ItemDataChanged:=false;
  575. end;
  576. //节点被编辑后------------------------------------------------------------
  577. procedure TSrmForm.TreeViewEdited(Sender: TObject; Node: TTreeNode;
  578.   var S: String);
  579. var
  580.   Id:integer;
  581. begin
  582.   S:=FormatTreeNodeString(S);
  583.   if S='' then S:=csNewDefaultTitle;
  584.   if Node.Parent=nil then Id:=0 else Id:=integer(Node.Parent.ItemId);
  585.   PostMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id);
  586.   TitleLabel.Caption:=S;
  587.   Srm.IndexChanged:=true;
  588. end;
  589. //标题排序函数-------------------------------------------------------
  590. procedure TSrmForm.TreeViewCompare(Sender: TObject; Node1,
  591.   Node2: TTreeNode; Data: Integer; var Compare: Integer);
  592. begin
  593.   if Node1.ImageIndex<Node2.ImageIndex then Compare:=-1
  594.   else if Node1.ImageIndex>Node2.ImageIndex then begin Compare:=1 end
  595.   else comPare:=CompareText(Node1.Text,Node2.Text);
  596. end;
  597. //树形视图拖动过程----------------------------------------------------------
  598. procedure TSrmForm.TreeViewDragOver(Sender, Source: TObject; X, Y: Integer;
  599.   State: TDragState; var Accept: Boolean);
  600. Var
  601.    NbPixels:Integer;
  602.    Info:TScrollInfo;
  603. begin
  604.      if Source<>TreeView then   
  605.      begin
  606.        Accept:=false;
  607.        exit;
  608.      end;
  609.      GetScrollInfo(TreeView.Handle,SB_VERT,Info);
  610.      if Info.nMin=Info.nMax then exit;
  611.      NbPixels:=Abs(TreeView.Font.Height);
  612.      if (Y<NbPixels) then
  613.      begin
  614.         TreeView.Perform(WM_VSCROLL,SB_LINEUP,0);
  615.         TreeView.Refresh;
  616.      end;
  617.      if (Y>TreeView.Height-NbPixels-16) then
  618.      begin
  619.         TreeView.Perform(WM_VSCROLL,SB_LINEDOWN,0);
  620.         TreeView.Refresh;
  621.      end;
  622. end;
  623. //树形视图拖动结束----------------------------------------------------------
  624. procedure TSrmForm.TreeViewDragDrop(Sender, Source: TObject; X,
  625.   Y: Integer);
  626. var
  627.   SNode,DNode:TTreeNode;
  628.   Id:integer;
  629. begin
  630.   SNode:=TreeView.Selected;  //得被拖动的标题
  631.   DNode:=TreeView.GetNodeAt(X,Y);  //得坐标处标题
  632.   if DNode<>SNode then
  633.     if DNode=nil then
  634.       SNode.MoveTo(TreeView.Items.GetFirstNode,naAdd)
  635.     else
  636.       SNode.MoveTo(DNode,naAddChild);
  637.   if SNode.Parent=nil then Id:=0 else Id:=integer(SNode.Parent.ItemId);
  638.   SendMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id);
  639.   srm.IndexChanged:=true;      //置索引改变为真
  640. end;
  641. //树形视图拖动结束----------------------------------------------------------
  642. //节点被扩展前------------------------------------------------------------
  643. procedure TSrmForm.TreeViewExpanding(Sender: TObject; Node: TTreeNode;
  644.   var AllowExpansion: Boolean);
  645. var
  646.   ps,UserPs:string;
  647. begin
  648.   AllowExpansion:=true;
  649.   if Node.Data=pointer(-1) then exit;
  650.   UserPs:=Srm.GetItemPassword(integer(Node.Data));
  651.   {if UserPs<>'' then
  652.   begin
  653.     with TInpwForm.Create(self) do
  654.     begin
  655.       Caption:=csAppName;
  656.       InputLabel.Caption:=csPasswordTitle;
  657.       if ShowModal=mrCancel then AllowExpansion:=false;
  658.       Ps:=Edit.Text;
  659.       if Ps<>UserPs then
  660.       begin
  661.         if ModalResult<>mrCancel then
  662.           MessageBox(Handle,csPasswordError,csAppName,MB_OK);
  663.         AllowExpansion:=false;
  664.       end;
  665.       Free;
  666.     end;
  667.   end;     }
  668. end;
  669. //设为标题----------------------------------------------------------
  670. procedure TSrmForm.SetTitlePopMenuItemClick(Sender: TObject);
  671. begin
  672.   TreeView.Selected.Text:=FormatTreeNodeString(RichEdit.SelText);
  673.   Srm.IndexChanged:=true;
  674.   TitleLabel.Caption:=TreeView.Selected.Text;
  675. end;
  676. //设为作者----------------------------------------------------------
  677. procedure TSrmForm.SetAuthorPopMenuItemClick(Sender: TObject);
  678. begin
  679.   ContextAuthorEdit.Text:=RichEdit.SelText;
  680.   Srm.ItemHeadChanged:=true;
  681. end;
  682. //设为关键字--------------------------------------------------------
  683. procedure TSrmForm.SetIndexPopMenuItemClick(Sender: TObject);
  684. var
  685.   TmpStr:string;
  686.   p: pchar;
  687. begin
  688.   TmpStr:=RichEdit.SelText;
  689.   if 51<Length(ContextIndexEdit.Text)+RichEdit.SelLength then
  690.   begin
  691.     Application.MessageBox(csIndexError,csAppName,MB_OK);
  692.     exit;
  693.   end;
  694.   p:=pchar(TmpStr);
  695.   while (p^<#33) and (P^<>#0) do inc(p);
  696.   if ContextIndexEdit.Text<>'' then
  697.     if ContextIndexEdit.Text[Length(ContextIndexEdit.Text)]<>'&' then
  698.       ContextIndexEdit.Text:=ContextIndexEdit.Text+'&';
  699.   ContextIndexEdit.Text:=ContextIndexEdit.Text+string(p);
  700.   Srm.ItemHeadChanged:=true;
  701. end;
  702. //编辑框菜单弹出时--------------------------------------------------
  703. procedure TSrmForm.RichEditPopupMenuPopup(Sender: TObject);
  704. begin
  705.   if Srm=nil then
  706.   begin
  707.     CutPopMenuItem.Enabled:=false;
  708.     CopyPopMenuItem.Enabled:=false;
  709.     PastePopMenuItem.Enabled:=false;
  710.     SetTitlePopMenuItem.Enabled:=false;
  711.     SetIndexPopMenuItem.Enabled:=false;
  712.     SelAllPopMenuItem.Enabled:=false;
  713.     SetAuthorPopMenuItem.Enabled:=false;
  714.     DelSpacePopMenuItem.Enabled:=false;
  715.   end
  716.   else
  717.   begin
  718.     OpenClipboard(Handle);
  719.     if GetClipboardData(CF_TEXT)=0 then  //剪贴板中没有文本时
  720.       PastePopMenuItem.Enabled:=false
  721.     else
  722.       PastePopMenuItem.enabled:=true;
  723.     CloseClipboard;
  724.     if RichEdit.SelLength>=RichEdit.GetTextLen then
  725.       SelAllPopMenuItem.Enabled:=false
  726.     else
  727.       SelAllPopMenuItem.Enabled:=true;
  728.     if richEdit.SelLength<>0 then
  729.     begin
  730.       CutPopMenuItem.Enabled:=true;
  731.       CopyPopMenuItem.Enabled:=true;
  732.       SetTitlePopMenuItem.Enabled:=true;
  733.       SetIndexPopMenuItem.Enabled:=true;
  734.       SetAuthorPopMenuItem.Enabled:=true;
  735.     end
  736.     else
  737.     begin
  738.       CutPopMenuItem.Enabled:=false;
  739.       CopyPopMenuItem.Enabled:=false;
  740.       SetTitlePopMenuItem.Enabled:=false;
  741.       SetIndexPopMenuItem.Enabled:=false;
  742.       SetAuthorPopMenuItem.Enabled:=false;
  743.     end;
  744.     DelSpacePopMenuItem.Enabled:=(RichEdit.Text<>'');
  745.   end;
  746. end;
  747. //剪切标题----------------------------------------------------------
  748. procedure TSrmForm.CutNodePopMenuItemClick(Sender: TObject);
  749. begin
  750.   SrmClip.Cut(TreeView.Selected);
  751. end;
  752. //复制标题----------------------------------------------------------
  753. procedure TSrmForm.CopyNodePopMenuItemClick(Sender: TObject);
  754. begin
  755.   SrmClip.Copy(TreeView.Selected);
  756. end;
  757. //粘贴标题----------------------------------------------------------
  758. procedure TSrmForm.PasteNodePopMenuItemClick(Sender: TObject);
  759. begin
  760.   SrmClip.Paste(TreeView.Selected);
  761. end;
  762. //弹出菜单时的动作--------------------------------------------------------
  763. procedure TSrmForm.TreeViewPopupMenuPopup(Sender: TObject);
  764. begin
  765.   if Srm=nil then
  766.   begin
  767.     DelNodePopMenuItem.Enabled:=false;
  768.     EditNodePopMenuItem.Enabled:=false;
  769.     AddSubNodePopMenuItem.Enabled:=false;
  770.     AddNodePopMenuItem.Enabled:=false;
  771.     CutNodePopMenuItem.Enabled:=false;
  772.     CopyNodePopMenuItem.Enabled:=false;
  773.     PasteNodePopMenuItem.Enabled:=false;
  774.     exit;
  775.   end;
  776.   AddNodePopMenuItem.Enabled:=true;
  777.   if TreeView.Selected=nil then
  778.   begin
  779.     DelNodePopMenuItem.Enabled:=false;
  780.     EditNodePopMenuItem.Enabled:=false;
  781.     AddSubNodePopMenuItem.Enabled:=false;
  782.     CutNodePopMenuItem.Enabled:=false;
  783.     CopyNodePopMenuItem.Enabled:=false;
  784.   end
  785.   else
  786.   begin
  787.     DelNodePopMenuItem.Enabled:=true;
  788.     EditNodePopMenuItem.Enabled:=true;
  789.     AddSubNodePopMenuItem.Enabled:=true;
  790.     CutNodePopMenuItem.Enabled:=true;
  791.     CopyNodePopMenuItem.Enabled:=true;
  792.   end;
  793.   if SrmClip.Node=nil then
  794.     PasteNodePopMenuItem.Enabled:=false
  795.   else
  796.     PasteNodePopMenuItem.Enabled:=true;
  797. end;
  798. //****************************************************************
  799. //---------------------------------------------------------------------
  800. procedure TSrmForm.StatusBarDrawPanel(StatusBar: TStatusBar;
  801.   Panel: TStatusPanel; const Rect: TRect);
  802. var
  803.   Text:string;
  804.   Rc:TRect;
  805. begin
  806.   Rc:=Rect;
  807.   Rc.Left:=Rc.Left+3;
  808.   if Panel=StatusBar.Panels[0] then
  809.   begin
  810.     Text:=csPanel1Text+IntToStr(TreeView.Items.Count);
  811.   end;
  812.   if Panel=StatusBar.Panels[1] then
  813.   begin
  814.     Text:=csPanel2Text+IntToStr(RichEdit.GetTextLen);
  815.   end;
  816.   if Panel=StatusBar.Panels[2] then
  817.   begin
  818.     Text:=PanelHint;
  819.   end;
  820.   with StatusBar.Canvas do
  821.   begin
  822.     Brush.Style := bsClear;
  823.     Font := StatusBar.Font;
  824.     Font.Color := clWhite;
  825.     OffsetRect(Rc,5,1);
  826.     DrawText(Handle, PChar(Text), Length(Text), Rc,(DT_VCENTER or DT_SINGLELINE));
  827.     OffsetRect(Rc,-1,-1);
  828.     Font:=StatusBar.Font;
  829.     DrawText(Handle, PChar(Text), Length(Text), Rc,(DT_VCENTER or DT_SINGLELINE));
  830.   end;
  831. end;
  832. //****************************************************************
  833. //新建数据文件-------------------------------------------------------------
  834. procedure TSrmForm.NewMenuItemClick(Sender: TObject);
  835. begin
  836.   with SaveDialog do
  837.   begin
  838.     DefaultExt:=csSrmExt;
  839.     Filter:=csSrmFilter;
  840.     Title:=csCreateTitle;
  841.   end;
  842.   if SaveDialog.Execute then
  843.   begin
  844.     if CloseSrmQuery then CloseSrm else exit;
  845.     Srm:=TSrmObject.Create(SaveDialog.FileName,fmCreate);
  846.     DbAuthorEdit.Text:='';
  847.     DbPasswordEdit.Text:='';
  848.     DbBuildDateEdit.Text:=DateToStr(Srm.FileHead.BuildDate);
  849.     DbeditDateEdit.Text:=DatetoStr(Srm.FileHead.EditDate);
  850.     Caption:=csAppName+' - '+SaveDialog.FileName;
  851.     Mru.Add(SaveDialog.FileName);
  852.   end;
  853. end;
  854. //打开数据文件------------------------------------------------------------
  855. procedure TSrmForm.OpenMenuItemClick(Sender: TObject);
  856. begin
  857.   with OpenDialog do
  858.   begin
  859.     DefaultExt:=csSrmExt;
  860.     Filter:=csSrmFilter;
  861.     Title:=csOpenTitle;
  862.     FileName:='';
  863.   end;
  864.   if OpenDialog.Execute then
  865.   begin
  866.     if CloseSrmQuery then CloseSrm else exit;
  867.     OpenSrm(OpenDialog.FileName);
  868.      if Srm=nil then
  869.       Caption:=csAppName
  870.      else
  871.      begin
  872.        Caption:=csAppName+' - '+OpenDialog.FileName;
  873.        Mru.Add(OpenDialog.FileName);
  874.      end;
  875.   end;
  876. end;
  877. //保存数据文件------------------------------------------------------------
  878. procedure TSrmForm.SaveMenuItemClick(Sender: TObject);
  879. begin
  880.   SaveSrm;
  881. end;
  882. //关闭数据文件------------------------------------------------------------
  883. procedure TSrmForm.CloseMenuItemClick(Sender: TObject);
  884. begin
  885.   if CloseSrmQuery then
  886.   begin
  887.     CloseSrm;
  888.     Caption:=csAppName;
  889.   end;
  890. end;
  891. //文件引入-----------------------------------------------------------------
  892. procedure TSrmForm.FImportMenuItemClick(Sender: TObject);
  893. var
  894.   Ps,UserPs:string;
  895.   Msh,Msd:TMemoryStream;
  896.   j:integer;
  897.   p:PTreeData;
  898.   AList: TStringList;
  899.   ALevel,AOldLevel:integer;
  900.   AParentNode:TTreeNode;
  901.   StrBuf:PChar;
  902.   ANode:TTreeNode;
  903.   i,n:integer;
  904.   Fn:string;
  905. begin
  906.   with OpenDialog do
  907.   begin
  908.     DefaultExt:=csTxtExt;
  909.     Filter:=csTxtFilter+'|'+csSrmFilter;
  910.     Title:=csOpenTitle;
  911.     FileName:='';
  912.   end;
  913.   if OpenDialog.Execute then
  914.   if ExtractFileExt(OpenDialog.Files.Strings[0])='.txt' then
  915.   begin
  916.     n:=OpenDialog.Files.Count-1;
  917.     RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘
  918.     for i:=0 to n do  //循环读入多重选择文件
  919.     begin
  920.       Fn:=ExtractFileName(OpenDialog.Files.Strings[i]);
  921.       Delete(Fn,Length(Fn)-3,4);
  922.       ANode:=TreeView.Items.AddObjectFirst(TreeView.Selected,Fn,pointer(-1));
  923.       ANode.ImageIndex:=2;
  924.       with Srm.DataHead do
  925.       begin
  926.         DataType:=2;
  927.         Author[0]:=#0;
  928.         Password[0]:=#0;
  929.       end;
  930.       TreeView.Selected:=ANode;
  931.       RichEdit.Lines.LoadFromFile(OpenDialog.Files.Strings[i]);
  932.     end;
  933.     StatusBar.Refresh;
  934.     RichEdit.Perform(WM_SETREDRAW,-1,0);  //允许重绘
  935.     Richedit.Refresh;
  936.   end
  937.   else
  938.  {
  939. begin
  940.   Result:=true;
  941.   Application.ProcessMessages;            //恢复原窗口
  942.   Srm:=TSrmObject.Create(Fn,fmOpenReadWrite);
  943.  { if Srm.FileHead.Password[0]<>#0 then    //密码保护
  944.   begin
  945.     InPwForm:=TInPwForm.Create(SrmForm);
  946.     with InPwForm do
  947.     begin
  948.       Caption:=csAppName;
  949.       InputLabel.Caption:=csPasswordTitle;
  950.       if ShowModal=mrCancel then
  951.       begin
  952.         Srm.Free;
  953.         Srm:=nil;
  954.         Free;
  955.         Result:=false;
  956.         Exit;
  957.       end;
  958.       Ps:=Edit.Text;
  959.       UserPs:=string(Srm.FileHead.Password);
  960.       if Ps<>UserPs then
  961.       begin
  962.         if ModalResult<>mrCancel then
  963.           Application.MessageBox(csAppName,csPasswordError,MB_OK);
  964.         Srm.Free;
  965.         Srm:=nil;
  966.         Result:=false;
  967.         Free;
  968.         Exit;
  969.       end;
  970.       Free;
  971.     end;
  972.   end;
  973.   Screen.Cursor:=crHourGlass;
  974.   Msh:=TMemoryStream.Create;
  975.   Msd:=TMemoryStream.Create;
  976.   Srm.LoadIndex(Msh,Msd);                 //装入索引
  977.   AList := TStringList.Create;
  978.   SrmForm.TreeView.Items.BeginUpdate;
  979.   AList.LoadFromStream(Msh);              //装入到字符串列表中
  980.   SendMessage(SrmForm.TreeView.Handle, TVM_DELETEITEM, 0, Longint(TVI_ROOT));
  981.   AOldLevel := 0;
  982.   AParentNode := nil;
  983.   n:=AList.Count-1;
  984.   p:=Msd.Memory;
  985.   for i:=0 to n do                        //根据TAB的多少得到相应级别
  986.   begin
  987.     StrBuf:=PChar(AList.Strings[i]);
  988.     ALevel:=0;
  989.     while StrBuf^=#9 do                   //得该项所在层数
  990.     begin
  991.       Inc(StrBuf);
  992.       Inc(ALevel);
  993.     end;
  994.     if (ALevel<AOldLevel) or (AParentNode<>nil) then
  995.     begin                                 //返回该项的上级节点
  996.       for j:=AOldLevel downto ALevel do
  997.       begin
  998.         AParentNode:=AParentNode.Parent;
  999.       end;
  1000.     end;
  1001.     AParentNode:=SrmForm.TreeView.Items.AddChildObject(AParentNode,StrBuf,
  1002.                                       pointer(p.Pos));
  1003.     AParentNode.ImageIndex:=p.DataType;   //得该节点类型
  1004.     AOldLevel:=ALevel;
  1005.     p:=pointer(integer(p)+sizeof(TTreeData));
  1006.   end;
  1007.   SrmForm.TreeView.Items.EndUpdate;
  1008.   AList.Free;
  1009.   Msd.Free;
  1010.   Msh.Free;
  1011.   with Srm.FileHead,SrmForm do            //显示文件属性
  1012.   begin
  1013.     DbAuthorEdit.Text:=String(Author);
  1014.     DbPasswordEdit.Text:=String(Password);
  1015.     DbBuildDateEdit.Text:=DateToStr(BuildDate);
  1016.     DbEditDateEdit.Text:=DateToStr(EditDate);
  1017.   end;
  1018.   SrmForm.TreeView.Selected:=nil;         //置当前选择项为空
  1019.   with Srm do
  1020.   begin
  1021.     DbChanged:=false;                     //数据库变动标志复原
  1022.     IndexChanged:=false;                  //索引变动标志复原
  1023.     ItemHeadChanged:=false;
  1024.     ItemDataChanged:=false;
  1025.   end;
  1026.   Screen.Cursor:=crDefault;
  1027. end;    }
  1028. end;
  1029. //目录引入-----------------------------------------------------------------
  1030. procedure TSrmForm.DImportMenuItemClick(Sender: TObject);
  1031. var
  1032.   Temps:WideString;
  1033.   Dir,Mask:string;
  1034.   ANode:TTreeNode;
  1035. begin
  1036.   Temps:='';
  1037. //  if not SelectDirectory(csAppName,Temps,Dir) then exit;
  1038.   Dir:=BrowseFolder;
  1039.   If Dir='' Then exit;
  1040.   ANode:=TreeView.Items.AddChildObjectFirst(TreeView.Selected,
  1041.        GetLastPathName(Dir),pointer(-1));
  1042.   ANode.ImageIndex:=1;
  1043.   with Srm.DataHead do
  1044.   begin
  1045.     DataType:=1;
  1046.     Author[0]:=#0;
  1047.     Password[0]:=#0;
  1048.   end;
  1049.   TreeView.Selected:=ANode;
  1050.   RichEdit.Modified:=true;
  1051.   if Dir[Length(Dir)]<>'' then Dir:=Dir+'';
  1052.   Mask:='*.'+csTxtExt;
  1053.   Screen.Cursor:=crHourGlass;
  1054.   RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘
  1055.   ImportDir(Dir,Mask);
  1056.   RichEdit.Perform(WM_SETREDRAW,-1,0);  //允许重绘
  1057.   Richedit.Refresh;
  1058.   StatusBar.Refresh;
  1059.   SCreen.Cursor:=crDefault;
  1060. end;
  1061. //导出标题内容--------------------------------------------------------------
  1062. procedure TSrmForm.ExportMenuItemClick(Sender: TObject);
  1063. var
  1064.   Dir:string;
  1065. //  i,n:integer;     //对别的格式要导出其附件
  1066.   function FormatFileName(Fn:string):string;
  1067.   var
  1068.     i,n:integer;
  1069.     c:char;
  1070.   begin
  1071.     Result:=Fn;
  1072.     n:=Length(Result);
  1073.     for i:=1 to n do
  1074.     begin
  1075.       c:=Result[i];
  1076.       if ((c=#92) or (c=#47) or (c=#58) or (c=#42) or (c=#63) or
  1077.            (c=#34) or (c=#60) or (c=#62) or (c=#124)) then
  1078.         Result[i]:='$';  //替换掉系统不接受的文件命名的字符
  1079.     end;
  1080.   end;
  1081.   procedure OutPutSrm(ANode:TTreeNode;Dir:string);
  1082.   var
  1083.     SNode:TTreeNode;
  1084.     Ms:TMemoryStream;
  1085.     Fh:integer;
  1086.     Path:string;
  1087.   begin
  1088.     Ms:=TMemoryStream.Create;
  1089.     Path:=Dir;
  1090.     SNode:=ANode.GetFirstChild;
  1091.     while SNode<>nil do
  1092.     begin
  1093.       if SNode.ImageIndex=1 then
  1094.       begin
  1095.         Dir:=Path+FormatFileName(SNode.Text);
  1096.         MkDir(Dir);
  1097.         Dir:=Dir+'';
  1098.         OutPutSrm(SNode,Dir);
  1099.       end
  1100.       else
  1101.       begin
  1102.         Srm.ReadItemHead(integer(SNode.Data));
  1103.         if ((Srm.DataHead.Password[0]=#0) and (Srm.DataHead.Num=1)) then
  1104.         begin       //没有口令的内容才导出
  1105.           Srm.ReadItemData(Ms);
  1106.           Fh:=FileCreate(Path+FormatFileName(SNode.Text)+'.'+csTxtExt);
  1107.           if Fh<>0 then FileWrite(Fh,Ms.Memory^,Ms.Size);
  1108.           FileClose(Fh);
  1109.         end;
  1110.       end;
  1111.       SNode:=SNode.GetNextSibling;
  1112.     end;
  1113.     Ms.Free;
  1114.   end;
  1115. begin
  1116.   if TreeView.Selected=nil then exit;
  1117.   if TreeView.Selected.GetFirstChild=nil then
  1118.   begin
  1119.     with SaveDialog do
  1120.     begin
  1121.       DefaultExt:=csTxtExt;
  1122.       Filter:=csTxtFilter;
  1123.       Title:=csSaveAsTitle;
  1124.       FileName:=TreeView.Selected.Text;
  1125.     end;
  1126.     if SaveDialog.Execute then
  1127.     begin
  1128.       RichEdit.Lines.SaveToFile(SaveDialog.FileName);
  1129.     end;
  1130.   end
  1131.   else
  1132.   begin
  1133.     Dir:=BrowseFolder;
  1134.     If Dir='' Then exit;
  1135.     if Dir[Length(Dir)]<>'' then Dir:=Dir+'';
  1136.     Dir:=Dir+FormatFileName(TreeView.Selected.Text);
  1137.     if DirectoryExists(Dir) then
  1138.     begin
  1139.       Application.MessageBox(csDirExists,csAppName,MB_OK or MB_ICONERROR);
  1140.       exit;
  1141.     end;
  1142.     MkDir(Dir);
  1143.     Dir:=Dir+'';
  1144.     Screen.Cursor:=crHourGlass;
  1145.     OutPutSrm(TreeView.Selected,Dir);
  1146.     Screen.Cursor:=crDefault;
  1147.   end;
  1148. end;
  1149. //打印内容------------------------------------------------------------------
  1150. procedure TSrmForm.PrintMenuItemClick(Sender: TObject);
  1151. begin
  1152.   if RichEdit.GetTextLen()=0 then
  1153.     RichEdit.Print(TitleLabel.Caption);
  1154. end;
  1155. //退出菜单-----------------------------------------------------------------
  1156. procedure TSrmForm.ExitMenuItemClick(Sender: TObject);
  1157. begin
  1158.   Close;
  1159. end;
  1160. //最近文件列表-----------------------------------------------------------------
  1161. procedure TSrmForm.ListMenuItemClick(Sender: TObject);
  1162. var
  1163.   Temps:string;
  1164. begin
  1165.   if CloseSrmQuery then closeSrm else exit;
  1166.   Temps:=Mru.FileList[TMenuItem(Sender).Tag];
  1167.   if Temps<>'' then
  1168.     if FileExists(Temps) then
  1169.      OpenSrm(Temps);
  1170.   if Srm=nil then
  1171.     Caption:=csAppName
  1172.   else
  1173.   begin
  1174.     Caption:=csAppName+' - '+Temps;
  1175.     Mru.Add(Temps);
  1176.   end;
  1177. end;
  1178. //我的最爱-----------------------------------------------------------------
  1179. procedure TSrmForm.MyLoveMenuItemClick(Sender: TObject);
  1180. begin
  1181.   if CloseSrmQuery then CloseSrm else exit;
  1182.   if AppIni.MyLoveFile<>'' then
  1183.     if FileExists(AppIni.MyLoveFile) then OpenSrm(AppIni.MyLoveFile);
  1184.   if Srm=nil then
  1185.     Caption:=csAppName
  1186.   else
  1187.     begin
  1188.       Caption:=csAppName+' - '+AppIni.MyLoveFile;
  1189.       Mru.Add(AppIni.MyLoveFile);
  1190.     end;
  1191. end;
  1192. //****************************************************************
  1193. //恢复菜单----------------------------------------------------------------
  1194. procedure TSrmForm.UndoMenuItemClick(Sender: TObject);
  1195. begin
  1196.   SendMessage(RichEdit.Handle,EM_UNDO,0,0);
  1197. end;
  1198. //---------------------------------------------------------------------
  1199. procedure TSrmForm.RedoMenuItemClick(Sender: TObject);
  1200. begin
  1201.   SendMessage(RichEdit.Handle,EM_UNDO,0,0);
  1202. end;
  1203. //重做菜单--------------------------------------------------------------
  1204. procedure TSrmForm.CutMenuItemClick(Sender: TObject);
  1205. begin
  1206.   SendMessage(GetFocus,WM_CUT,0,0);
  1207. end;
  1208. //拷贝------------------------------------------------------------------
  1209. procedure TSrmForm.CopyMenuItemClick(Sender: TObject);
  1210. begin
  1211.   SendMessage(GetFocus,WM_COPY,0,0);
  1212. end;
  1213. //粘贴----------------------------------------------------------------
  1214. procedure TSrmForm.PasteMenuItemClick(Sender: TObject);
  1215. begin
  1216.   SendMessage(GetFocus,WM_PASTE,0,0);
  1217. end;
  1218. //全选---------------------------------------------------------------
  1219. procedure TSrmForm.SelAllMenuItemClick(Sender: TObject);
  1220. begin
  1221.   RichEdit.SelectAll;
  1222. end;
  1223. //查找-----------------------------------------------------------------
  1224. procedure TSrmForm.FindMenuItemClick(Sender: TObject);
  1225. begin
  1226.   ReplaceDialog.ReplaceText:='';
  1227.   FindDialog.Execute;
  1228. end;
  1229. //查找下一个-------------------------------------------------------------
  1230. procedure TSrmForm.FindNextMenuItemClick(Sender: TObject);
  1231. begin
  1232.   if Length(ReplaceDialog.ReplaceText)<>0 then
  1233.   begin
  1234.     ReplaceDialog.Options:=ReplaceDialog.Options+[frReplace];
  1235.     ReplaceDialogReplace(Sender);
  1236.   end
  1237.   else if Length(FindDialog.FindText)<>0 then
  1238.   begin
  1239.     FindDialogFind(Sender);
  1240.   end
  1241.   else
  1242.     FindDialog.Execute;
  1243. end;
  1244. //替换------------------------------------------------------------------
  1245. procedure TSrmForm.ReplaceMenuItemClick(Sender: TObject);
  1246. begin
  1247.   ReplaceDialog.Execute;
  1248. end;
  1249. //删除空格---------------------------------------------------------------
  1250. procedure TSrmForm.DelSpaceMenuItemClick(Sender: TObject);
  1251. var
  1252.   i,Size:integer;
  1253.   OldBuf,NewBuf,TempOldBuf,TempNewBuf:pchar;
  1254. begin
  1255.   Size:=RichEdit.GetTextLen+2;
  1256.   GetMem(OldBuf,Size+1);
  1257.   GetMem(NewBuf,Size+1);
  1258.   TempOldBuf:=OldBuf;
  1259.   TempNewBuf:=NewBuf;
  1260.   RichEdit.GetTextBuf(OldBuf,Size);
  1261.   for i:=0 to Size do
  1262.   begin
  1263.     if TempOldBuf^=#32 then
  1264.     begin
  1265.       if ((pchar(integer(TempOldBuf-1))^>=#160) or
  1266.           (pchar(integer(TempOldBuf+1))^>=#160)) then
  1267.         inc(TempOldBuf)
  1268.       else
  1269.       begin
  1270.         TempNewBuf^:=TempOldBuf^;
  1271.         inc(TempNewBuf);
  1272.         inc(TempOldBuf);
  1273.       end;
  1274.     end
  1275.     else
  1276.     begin
  1277.       TempNewBuf^:=TempOldBuf^;
  1278.       inc(TempNewBuf);
  1279.       inc(TempOldBuf);
  1280.     end;
  1281.   end;
  1282.   TempNewBuf^:=#0;
  1283.   RichEdit.SetTextBuf(NewBuf);
  1284.   FreeMem(OldBuf);
  1285.   FreeMem(NewBuf);
  1286. end;
  1287. //合并成段---------------------------------------------------------------
  1288. procedure TSrmForm.CParaMenuItemClick(Sender: TObject);
  1289. var
  1290.   Stext,Dtext:pchar;
  1291.   OldStext,OldDtext:pchar;
  1292.   n:integer;
  1293. begin
  1294.   n:=RichEdit.SelLength;
  1295.   if n=0 then Exit;    //没有选择的文本则退出
  1296.   Inc(n);
  1297.   GetMem(OldStext,n);
  1298.   GetMem(OldDtext,n);  //分配内存准备COPY文本
  1299.   Stext:=OldStext;
  1300.   Dtext:=OldDtext;
  1301.   RichEdit.GetSelTextBuf(Stext,n);
  1302.   while Stext^<>#0 do
  1303.   begin
  1304.     if (Stext^=#10) or (Stext^=#13) then  //如果是回车换行符
  1305.       Inc(Stext)
  1306.     else
  1307.     begin
  1308.       Dtext^:=Stext^;
  1309.       Inc(Stext);
  1310.       Inc(Dtext);
  1311.     end;
  1312.   end;
  1313.   Inc(Dtext);
  1314.   Dtext^:=#0;
  1315.   RichEdit.SetSelTextBuf(OldDtext);
  1316.   FreeMem(OldStext);
  1317.   FreeMem(OldDtext);
  1318. end;
  1319. //分割段落---------------------------------------------------------------
  1320. procedure TSrmForm.DParaMenuItemClick(Sender: TObject);
  1321. var
  1322.   i,n:integer;
  1323.   s:string;
  1324. begin
  1325.   if (RichEdit.GetTextLen=0) or (not RichEdit.WordWrap) then Exit;
  1326.   Application.ProcessMessages;
  1327.   n:=RichEdit.Lines.Count-1;
  1328.   with TProgressBar.Create(self) do
  1329.   begin
  1330.     Parent:=StatusBar;
  1331.     Align:=alClient;
  1332.     Max:=n;
  1333.     StatusBar.Update;
  1334.     Screen.Cursor:=crHourGlass;
  1335.     RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘
  1336.     for i:=0 to n do
  1337.     begin
  1338.       s:=RichEdit.Lines[i];
  1339.       if s<>'' then RichEdit.Lines[i]:=Format('%s'#13#10,[s]);
  1340.       Position:=i;
  1341.     end;
  1342.     RichEdit.Perform(WM_SETREDRAW,-1,0);
  1343.     RichEdit.Refresh;
  1344.     Screen.Cursor:=crDefault;
  1345.     Free;
  1346.   end;
  1347. end;
  1348. //Gb To Big5转换--------------------------------------------------------
  1349. procedure TSrmForm.GbToBigMenuItemClick(Sender: TObject);
  1350. var
  1351.   Buf:pchar;
  1352.   n:integer;
  1353. begin
  1354.   n:=RichEdit.GetTextLen+1;
  1355.   GetMem(Buf,n);
  1356.   RichEdit.GetTextBuf(Buf,n);
  1357.   GbToBig(Buf);
  1358.   RichEdit.SetTextBuf(Buf);
  1359.   FreeMem(Buf);
  1360. end;
  1361. //Big5 To Gb转换--------------------------------------------------------
  1362. procedure TSrmForm.BigToGbMenuItemClick(Sender: TObject);
  1363. var
  1364.   Buf:pchar;
  1365.   n:integer;
  1366. begin
  1367.   n:=RichEdit.GetTextLen+1;
  1368.   GetMem(Buf,n);
  1369.   RichEdit.GetTextBuf(Buf,n);
  1370.   BigToGb(Buf);
  1371.   RichEdit.SetTextBuf(Buf);
  1372.   FreeMem(Buf);
  1373. end;
  1374. //****************************************************************
  1375. //工具栏显示---------------------------------------------------------
  1376. procedure TSrmForm.ToolsMenuItemClick(Sender: TObject);
  1377. begin
  1378. //
  1379. end;
  1380. //状态栏显示---------------------------------------------------------
  1381. procedure TSrmForm.StatusMenuItemClick(Sender: TObject);
  1382. var
  1383.   tmp:boolean;
  1384. begin
  1385.   tmp:=not StatusMenuItem.Checked;
  1386.   StatusMenuItem.Checked:=tmp;
  1387.   StatusBar.Visible:=tmp;
  1388. end;
  1389. //视图栏显示---------------------------------------------------------
  1390. procedure TSrmForm.TitleMenuItemClick(Sender: TObject);
  1391. var
  1392.   tmp:boolean;
  1393. begin
  1394.   tmp:=not TitleMenuItem.Checked;
  1395.   TitleMenuItem.Checked:=tmp;
  1396.   TitleToolButton.Down:=tmp;
  1397.   Splitter.Visible:=tmp;
  1398.   LeftForm.Visible:=tmp;
  1399. end;
  1400. //只读控制-----------------------------------------------------------
  1401. procedure TSrmForm.ReadOnlyMenuItemClick(Sender: TObject);
  1402. var
  1403.   tmp:boolean;
  1404. begin
  1405.   tmp:=not ReadOnlymenuItem.Checked;
  1406.   ReadOnlyMenuItem.Checked:=tmp;
  1407.   ReadOnlyToolButton.Down:=tmp;
  1408.   RichEdit.ReadOnly:=tmp;
  1409. end;
  1410. //自动换行------------------------------------------------------------
  1411. procedure TSrmForm.WordWrapMenuItemClick(Sender: TObject);
  1412. var
  1413.   tmp:boolean;
  1414. begin
  1415.   tmp:=not WordWrapMenuItem.Checked;
  1416.   WordWrapMenuItem.checked:=tmp;
  1417.   WordWrapToolButton.Down:=tmp;
  1418.   RichEdit.WordWrap:=tmp;
  1419. end;
  1420. //放大字体------------------------------------------------------------
  1421. procedure TSrmForm.BigFontMenuItemClick(Sender: TObject);
  1422. begin
  1423.   with RichEdit.Font do Size:=Size+1;
  1424. end;
  1425. //缩小字体--------------------------------------------------------------
  1426. procedure TSrmForm.SmallFontMenuItemClick(Sender: TObject);
  1427. begin
  1428.   with RichEdit.Font do Size:=Size-1;
  1429. end;
  1430. //选项设置--------------------------------------------------------------
  1431. procedure TSrmForm.OptionsMenuItemClick(Sender: TObject);
  1432. begin
  1433.   with TOptionForm.Create(self) do
  1434.   begin
  1435.     if ShowModal=mrOk then
  1436.     begin
  1437.       SetOpenSrmWithApp(SrmCheckBox.Checked);
  1438.       Mru.Visible:=FileListCheckBox.Checked;
  1439.       MyLoveMenuItem.Visible:=MyLoveCheckBox.Checked;
  1440.       MyLoveNextMenuItem.Visible:=MyLoveCheckBox.Checked;
  1441.       with AppIni do
  1442.       begin
  1443.         OpenSrmWithApp:=SrmCheckBox.Checked;
  1444.         LoadNearFile:=LoadSrmCheckBox.Checked;
  1445.         FileListVisible:=FileListCheckBox.checked;
  1446.         MyLoveVisible:=MyLoveCheckBox.Checked;
  1447.         SaveDbQuery:=SaveCheckBox.Checked;
  1448.         DelRecordQuery:=DelCheckBox.Checked;
  1449.         MyLoveFile:=MyLoveEdit.Text;
  1450.       end;
  1451.       TreeView.Color:=TvShape.Brush.Color;
  1452.       RichEdit.Color:=ReShape.Brush.Color;
  1453.       TreeView.Font:=TvLabel.Font;
  1454.       RichEdit.Font:=ReLabel.Font;
  1455.     end;
  1456.     Free;
  1457.   end;
  1458.   MyLoveMenuItem.Enabled:=AppIni.MyLoveFile<>'';
  1459. end;
  1460. //****************************************************************
  1461. //添加新节点----------------------------------------------------------
  1462. procedure TSrmForm.AddNodeMenuItemClick(Sender: TObject);
  1463. var
  1464.   ANode:TTreeNode;
  1465.   Id:integer;
  1466. begin
  1467.   ANode:=TreeView.Items.AddObjectFirst(TreeView.Selected,csNewDefaultTitle,
  1468.                                        pointer(-1));
  1469.   ANode.ImageIndex:=2;
  1470.   if ANode.Parent=nil then Id:=0 else Id:=integer(ANode.Parent.ItemId);
  1471.   SendMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id);   //自动排序当前同级标题
  1472.   TreeView.Selected:=ANode;
  1473.   ANode.EditText;
  1474.   StatusBar.Refresh;
  1475.   Srm.ItemDataChanged:=true;
  1476. end;
  1477. //添加新子节点--------------------------------------------------------
  1478. procedure TSrmForm.AddSubNodeMenuItemClick(Sender: TObject);
  1479. var
  1480.   ANode:TTreeNode;
  1481.   Id:integer;
  1482. begin
  1483.   ANode:=TreeView.Items.AddChildObjectFirst(TreeView.Selected,csNewDefaultTitle,
  1484.                                             pointer(-1));
  1485.   ANode.ImageIndex:=2;
  1486.   ANode.Parent.ImageIndex:=1;
  1487.   if ANode.Parent=nil then Id:=0 else Id:=integer(ANode.Parent.ItemId);
  1488.   SendMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id);
  1489.   TreeView.Selected:=ANode;
  1490.   ANode.EditText;
  1491.   StatusBar.Refresh;
  1492.   Srm.ItemDataChanged:=true;
  1493. end;
  1494. //编辑节点-------------------------------------------------------------
  1495. procedure TSrmForm.EditNodeMenuItemClick(Sender: TObject);
  1496. begin
  1497.   TreeView.Selected.EditText;
  1498.   Srm.IndexChanged:=true;
  1499. end;
  1500. //删除节点-------------------------------------------------------------
  1501. procedure TSrmForm.DelNodeMenuItemClick(Sender: TObject);
  1502. begin
  1503.   if AppIni.DelRecordQuery then
  1504.     if Application.MessageBox(csDeleteQuery,
  1505.            csAppName,MB_OKCANCEL or MB_ICONWARNING)<>IDOK then exit;
  1506.   TreeView.Selected.Delete;
  1507.   StatusBar.Refresh;
  1508.   Srm.IndexChanged:=true;
  1509. end;
  1510. //节点排序--------------------------------------------------------------
  1511. procedure TSrmForm.SortMenuItemClick(Sender: TObject);
  1512. begin
  1513.   Screen.Cursor:=crHourGlass;
  1514.   Application.ProcessMessages;
  1515.   TreeView.SortType:=stText;
  1516.   TreeView.AlphaSort;
  1517.   TreeView.SortType:=stNone;
  1518.   Srm.IndexChanged:=true;
  1519.   Screen.Cursor:=crDefault;
  1520. end;
  1521. //压缩数据库------------------------------------------------------------
  1522. procedure TSrmForm.CompressMenuItemClick(Sender: TObject);
  1523. var
  1524.   i,n:integer;
  1525.   Ms,Msh,Msd:TMemoryStream;
  1526.   ASrm:TSrmObject;
  1527.   AFileName,AoldFileName:string;
  1528.   ABuf:array[0..260] of char;
  1529.   ANode:TTreeNode;
  1530.   pBuf:PTreeData;
  1531. begin
  1532.   if Srm=nil then exit;  //如果没有打开的数据库则退出
  1533.   AOldFileName:=Srm.FileName;
  1534.   SaveSrm;
  1535.   GetTempFileName(pchar(ExtractFileDir(Srm.FileName)),'tmp',0,@ABuf[0]);
  1536.   AFileName:=string(ABuf);
  1537.   Ms:=TMemoryStream.Create;
  1538.   Msh:=TMemoryStream.Create;
  1539.   Msd:=TMemoryStream.Create;
  1540.   TreeView.SaveToStream(Msh);
  1541.   Msd.SetSize(sizeof(TTreeData)*TreeView.Items.Count);
  1542.   pBuf:=Msd.Memory;
  1543.   ASrm:=TSrmObject.Create(AFileName,fmCreate);
  1544.   n:=TreeView.Items.Count-1;
  1545.   ANode:=TreeView.Items.GetFirstNode;
  1546.   Screen.Cursor:=crHourGlass;
  1547.   Application.ProcessMessages;
  1548.   with TProgressBar.Create(self) do
  1549.   begin
  1550.     Parent:=StatusBar;
  1551.     Align:=alClient;
  1552.     Max:=n;
  1553.     StatusBar.Update;
  1554.     for i:=0 to n do
  1555.     begin
  1556.       Position:=i;
  1557.       Srm.ReadItemHead(integer(ANode.Data));
  1558.       Srm.ReadItemData(Ms);
  1559.       ASrm.DataHead:=Srm.DataHead;
  1560.       pBuf^.Pos:=ASrm.AddItemHead;
  1561.       if ANode.GetFirstChild<>nil then pBuf^.DataType:=1
  1562.       else pBuf^.DataType:=ANode.ImageIndex;
  1563.       ASrm.AddItemData(Ms);
  1564.       pBuf:=PTreeData(integer(pBuf)+sizeof(TTreeData));
  1565.       ANode:=ANode.GetNext;
  1566.     end;
  1567.     ASrm.FileHead:=Srm.FileHead;
  1568.     ASrm.SaveIndex(Msh,Msd);
  1569.     ASrm.SaveSrmFile;
  1570.     Free;
  1571.   end;
  1572.   Screen.Cursor:=crDefault;
  1573.   ASrm.Free;
  1574.   Ms.Free;
  1575.   Msh.Free;
  1576.   Msd.Free;
  1577.   CloseSrm;
  1578.   DeleteFile(AOldFileName);
  1579.   MoveFile(pchar(AFileName),pchar(AOldFileName));
  1580.   OpenSrm(AOldFileName);
  1581.   StatusBar.Refresh;
  1582. end;
  1583. //升级2.x版数据库-------------------------------------------------------
  1584. procedure TSrmForm.CovertMenuItemClick(Sender: TObject);
  1585. var
  1586.   Fn: string;
  1587.   F2,F3:integer;
  1588.   FTv:TTreeView;
  1589.   IdxBuf:PIntArray;
  1590.   Ms,Msh,Msd:TMemoryStream;
  1591.   i,n,size:integer;
  1592.   FSrm:TSrmObject;
  1593.   ANode:TTreeNode;
  1594. begin
  1595.   if CloseSrmQuery then CloseSrm else exit;  //关闭打开的数据文件
  1596.   //得打开文件名和要保存的文件名
  1597.   with OpenDialog do
  1598.   begin
  1599.     DefaultExt:=csTreExt;
  1600.     Filter:=csOldFilter;
  1601.     Title:=csOpenTitle;
  1602.   end;
  1603.   with SaveDialog do
  1604.   begin
  1605.     DefaultExt:=csSrmExt;
  1606.     Filter:=csSrmFilter;
  1607.     Title:=csSaveAsTitle;
  1608.   end;
  1609.   if not OpenDialog.Execute then Exit;
  1610.   if not SaveDialog.Execute then Exit;
  1611.   //旧数据文件不完整时
  1612.   Fn:=OpenDialog.FileName;
  1613.   Delete(Fn,Length(Fn)-2,3);
  1614.   if not (FileExists(Fn+csTreExt) and
  1615.           FileExists(Fn+csIdxExt) and
  1616.           FileExists(Fn+csDatExt)) then
  1617.   begin
  1618.     Application.MessageBox(csOldFileError,csAppName,MB_OK+MB_ICONSTOP);
  1619.     exit;
  1620.   end;
  1621.   FSrm:=TSrmObject.Create(SaveDialog.FileName,fmCreate);
  1622.   Ms:=TMemoryStream.Create;
  1623.   Msh:=TMemoryStream.Create;
  1624.   Msd:=TMemoryStream.Create;
  1625.   //装入标题到隐藏的视图中
  1626.   FTv:=TTreeView.Create(self);
  1627.   FTv.Parent:=self;
  1628.   FTv.Visible:=false;
  1629.   FTv.LoadFromFile(Fn+csTreExt);
  1630.   ANode:=FTv.Items.GetFirstNode;
  1631.   //读入索引
  1632.   GetMem(IdxBuf,sizeof(integer)*FTv.Items.Count);
  1633.   Msd.SetSize(sizeof(TTreeData)*FTv.Items.Count);
  1634.   F2:=FileOpen(Fn+csIdxExt,fmOpenRead);
  1635.   FileRead(F2,IdxBuf^,sizeof(integer)*FTv.Items.Count);
  1636.   F3:=FileOpen(Fn+csDatExt,fmOpenRead);
  1637.   n:=FTv.Items.Count-1;
  1638.   Screen.Cursor:=crHourGlass;
  1639.   Application.ProcessMessages;
  1640.   with TProgressBar.Create(self) do
  1641.   begin
  1642.     Parent:=StatusBar;
  1643.     Align:=alClient;
  1644.     Max:=n;
  1645.     StatusBar.Update;
  1646.     for i:=0 to n do
  1647.     begin
  1648.       Position:=i;
  1649.       //置数据段头缺省值
  1650.       with FSrm.DataHead do
  1651.       begin
  1652.         Author[0]:=#0;
  1653.         Password[0]:=#0;
  1654.         SearchKey[0]:=#0;
  1655.         Keep:=0;
  1656.         PubDate:=Now;
  1657.         if (ANode.GetFirstChild<>nil) then
  1658.           DataType:=1
  1659.         else
  1660.           DataType:=2;
  1661.         if IdxBuf^[i]=-1 then
  1662.           Num:=0
  1663.         else
  1664.           Num:=1;
  1665. //          Num:=0;
  1666.       end;
  1667.       PTdArray(Msd.Memory)^[i].DataType:=FSrm.DataHead.DataType;
  1668.       PTdArray(Msd.Memory)^[i].Pos:=FSrm.AddItemHead;
  1669.       //读入数据内容
  1670.       if IdxBuf^[i]<>-1 then
  1671.       begin
  1672.         FileSeek(F3,IdxBuf^[i],0);
  1673.         FileRead(F3,size,sizeof(integer));
  1674.         Ms.SetSize(size);
  1675.         FileRead(F3,Ms.Memory^,size);
  1676.         FSrm.AddItemData(Ms);
  1677.       end;
  1678.       ANode:=ANode.GetNext;
  1679.     end;
  1680.     Free;
  1681.   end;
  1682.   Screen.Cursor:=crDefault;
  1683.   //保存新文件索引
  1684.   FTv.SaveToStream(Msh);
  1685.   FSrm.SaveIndex(Msh,Msd);
  1686.   FSrm.SaveSrmFile;
  1687.   //释放内存
  1688.   FreeMem(IdxBuf);
  1689.   FileClose(F2);
  1690.   FileClose(F3);
  1691.   FTv.Free;
  1692.   Ms.Free;
  1693.   Msd.Free;
  1694.   Msh.Free;
  1695.   FSrm.Free;
  1696.   OpenSrm(SaveDialog.FileName);
  1697.   Mru.Add(SaveDialog.FileName);
  1698. end;
  1699. //****************************************************************
  1700. //关于本软件----------------------------------------------------------
  1701. procedure TSrmForm.AboutMenuItemClick(Sender: TObject);
  1702. begin
  1703.   with TAboutForm.Create(self) do
  1704.   begin
  1705.     ShowModal;
  1706.     Free;
  1707.   end;
  1708. end;
  1709. //帮助文件----------------------------------------------------------
  1710. procedure TSrmForm.ReadmeMenuItemClick(Sender: TObject);
  1711. var
  1712.   TmpStr :string;
  1713. begin
  1714.   TmpStr:=Application.ExeName;
  1715.   Delete(TmpStr,Length(TmpStr)-2,3);
  1716.   TmpStr:=TmpStr+csHlpExt;
  1717.   if Sender is TWinControl then
  1718.   begin
  1719.     if TWinControl(Sender).HelpContext=0 then
  1720.       WinHelp(Application.Handle,pchar(TmpStr),HELP_CONTEXT,10)
  1721.     else
  1722.       WinHelp(Application.Handle,pchar(TmpStr),HELP_CONTEXT,
  1723.               TWinControl(Sender).HelpContext);
  1724.   end
  1725.   else
  1726.       WinHelp(Application.Handle,pchar(TmpStr),HELP_CONTEXT,10);
  1727. end;
  1728. //作者主页----------------------------------------------------------
  1729. procedure TSrmForm.HomePageMenuItemClick(Sender: TObject);
  1730. begin
  1731.   ShellExecute(Application.Handle,nil,csHomePage,nil,nil,SW_SHOWNORMAL);
  1732. end;
  1733. //作者邮件----------------------------------------------------------
  1734. procedure TSrmForm.EMailMenuItemClick(Sender: TObject);
  1735. begin
  1736.   ShellExecute(Application.Handle,nil,csEMail,nil,nil,SW_SHOWNORMAL);
  1737. end;
  1738. //技术支持----------------------------------------------------------
  1739. procedure TSrmForm.OtherMenuItemClick(Sender: TObject);
  1740. begin
  1741.   Application.MessageBox(csTechniqueSupport,csAppName,MB_OK+MB_ICONSTOP);
  1742. end;
  1743. //****************************************************************
  1744. //弹出文件菜单时-----------------------------------------
  1745. procedure TSrmForm.FileMenuItemClick(Sender: TObject);
  1746. begin
  1747.   if Srm=nil then    //没有打开的数据库时
  1748.   begin
  1749.     SaveMenuItem.Enabled:=false;
  1750.     CloseMenuItem.Enabled:=false;
  1751.     FImportMenuItem.Enabled:=false;
  1752.     DImportMenuItem.Enabled:=false;
  1753.   end
  1754.   else
  1755.   begin
  1756.     SaveMenuItem.Enabled:=true;
  1757.     CloseMenuItem.Enabled:=true;
  1758.     FImportMenuItem.Enabled:=true;
  1759.     DImportMenuItem.Enabled:=true;
  1760.     end;
  1761.   if TreeView.Selected=nil then   //没有被选择的标题时
  1762.   begin
  1763.     ExportMenuItem.Enabled:=false;
  1764.     PrintMenuItem.Enabled:=false;
  1765.   end
  1766.   else
  1767.   begin
  1768.     ExportMenuItem.Enabled:=true;
  1769.     PrintMenuItem.Enabled:=true;
  1770.   end;
  1771. end;
  1772. //弹出编辑菜单时---------------------------------------------
  1773. procedure TSrmForm.EditMenuItemClick(Sender: TObject);
  1774. begin
  1775.   if RichEdit.SelLength=0 then  //没有被选择的文本时
  1776.   begin
  1777.     CutMenuItem.Enabled:=false;
  1778.     CopyMenuItem.Enabled:=false;
  1779.   end
  1780.   else
  1781.   begin
  1782.     CutMenuItem.Enabled:=true;
  1783.     CopyMenuItem.Enabled:=true;
  1784.   end;
  1785.   if RichEdit.Modified=false then  //内容还未被修改过时
  1786.   begin
  1787.     UndoMenuItem.Enabled:=false;
  1788.     RedoMenuItem.Enabled:=false;
  1789.   end
  1790.   else
  1791.   begin
  1792.     UndoMenuItem.Enabled:=true;
  1793.     RedoMenuItem.Enabled:=true;
  1794.   end;
  1795.   OpenClipboard(Handle);
  1796.   if GetClipboardData(CF_TEXT)=0 then  //剪贴板中没有文本时
  1797.     PasteMenuItem.Enabled:=false
  1798.   else
  1799.     PasteMenuItem.enabled:=true;
  1800.   CloseClipboard;
  1801.   if RichEdit.SelLength>=RichEdit.GetTextLen then
  1802.     SelAllMenuItem.Enabled:=false
  1803.   else
  1804.     SelAllMenuItem.Enabled:=true;
  1805. end;
  1806. //数据库属性编辑框有变动时--------------------------------------
  1807. procedure TSrmForm.DbAuthorEditChange(Sender: TObject);
  1808. begin
  1809.   if LeftPageControl.ActivePage=PropertiyTabSheet then
  1810.     Srm.DbChanged:=true;
  1811. end;
  1812. //标题属性编辑框有变动时----------------------------------------
  1813. procedure TSrmForm.ContextAuthorEditChange(Sender: TObject);
  1814. begin
  1815.   if RightPageControl.ActivePage=ProTabSheet then
  1816.     Srm.ItemHeadChanged:=true;
  1817. end;
  1818. procedure TSrmForm.ContextTypeRadioGroupClick(Sender: TObject);
  1819. begin
  1820.   if RightPageControl.ActivePage=ProTabSheet then
  1821.   begin
  1822.     Srm.DbChanged:=true;
  1823.     if TreeView.Selected<>nil then
  1824.       TreeView.Selected.ImageIndex:=ContextTypeRadioGroup.ItemIndex+1;
  1825.     Srm.ItemHeadChanged:=true;
  1826.     Srm.IndexChanged:=true;
  1827.   end;
  1828. end;
  1829. //上一标题-------------------------------------------------
  1830. procedure TSrmForm.PrevSpeedButtonClick(Sender: TObject);
  1831. begin
  1832.   if TreeView.Selected=nil then exit;
  1833.   if TreeView.Selected.GetPrev<>nil then
  1834.     TreeView.Selected:=TreeView.Selected.GetPrev;
  1835. end;
  1836. //下一标题-------------------------------------------------
  1837. procedure TSrmForm.NextSpeedButtonClick(Sender: TObject);
  1838. begin
  1839.   if TreeView.Selected=nil then exit;
  1840.   if TreeView.Selected.GetNext<>nil then
  1841.     TreeView.Selected:=TreeView.Selected.GetNext;
  1842. end;
  1843. //编辑框有变动时------------------------------------------
  1844. procedure TSrmForm.RichEditChange(Sender: TObject);
  1845. type
  1846.   TTextRange = record
  1847.     chrg: TCharRange;
  1848.     lpstrText: PChar;
  1849.   end;
  1850. var
  1851.   Idx:integer;
  1852.   Tr:TTextRange;
  1853.   s:string;
  1854. begin
  1855.   if RichEdit.SelStart=0 then exit;
  1856.   Idx:=RichEdit.SelStart-1;
  1857.   Tr.chrg.cpMin:=RichEdit.Perform(EM_FINDWORDBREAK,WB_LEFTBREAK,Idx);
  1858.   Tr.chrg.cpMax:=RichEdit.Perform(EM_FINDWORDBREAK,WB_RIGHTBREAK,Idx);
  1859.   if Tr.chrg.cpMin<Tr.chrg.cpMax then
  1860.   begin
  1861.       SetLength(s,Tr.chrg.cpMax-Tr.chrg.cpMin);
  1862.       Tr.lpstrText:= @S[1];
  1863.       RichEdit.Perform(EM_GETTEXTRANGE, 0, Integer(@Tr));
  1864.       s:=LowerCase(s);
  1865.       if s='http://' then
  1866.       begin
  1867.         RichEdit.Perform(EM_HIDESELECTION,1,1);
  1868.         RichEdit.Perform(EM_SETSEL,Tr.chrg.cpMin,Tr.chrg.cpMax);
  1869.         RichEdit.SelAttributes.Color:=clRed;
  1870.         RichEdit.Perform(EM_HIDESELECTION,0,0);
  1871.       end;
  1872.   end;
  1873. //  RichEdit.
  1874.   StatusBar.Refresh;
  1875. end;
  1876. //编辑框有按键事件时
  1877. procedure TSrmForm.RichEditKeyDown(Sender: TObject; var Key: Word;
  1878.   Shift: TShiftState);
  1879. //var
  1880. //  a:word;
  1881. begin
  1882. {
  1883.   a:=GetKeyboardLayout(0);
  1884.   if a<>$804 then                                       //如果不是中文输入法
  1885.     RichEdit.DefAttributes.CharSet:=RichEdit.Font.CharSet; //置当前字体为原字体
  1886. }
  1887. end;
  1888. procedure TSrmForm.ControlBarDockOver(Sender: TObject;
  1889.   Source: TDragDockObject; X, Y: Integer; State: TDragState;
  1890.   var Accept: Boolean);
  1891. begin
  1892.   Accept := (Source.Control is TToolBar);
  1893. end;
  1894. end.