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

行业应用

开发平台:

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