www.pudn.com > srmsrc.zip > MainUnit.pas


//--------------------------------------------------------------------------- 
//(R)CopyRight KivenSoft International ,inc 1998 
//程序名称:电子书库 
//单元名称:主窗口单元 
//作    者:李会文 
//单元名称:主程序单元 
//开始时间:1998.07.28 
//最后修改:1999.07.22 
//--------------------------------------------------------------------------- 
unit MainUnit; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  Menus, StdCtrls, ComCtrls, CommCtrl, ExtCtrls, ToolWin, ShellApi, Registry, 
  SrmUnit, SrmConst, ShlObj, FileCtrl, RichEdit, ImgList, KvLabel, Buttons, 
  jpeg, ActnList; 
 
type 
 
  TSrmForm = class(TForm) 
    Splitter: TSplitter; 
    StatusBar: TStatusBar; 
    LeftForm: TPanel; 
    LeftBottomPanel: TPanel; 
    RightPanel: TPanel; 
    ImageList: TImageList; 
    SaveDialog: TSaveDialog; 
    OpenDialog: TOpenDialog; 
    FindDialog: TFindDialog; 
    ReplaceDialog: TReplaceDialog; 
    LeftPageControl: TPageControl; 
    RightPageControl: TPageControl; 
    IndexTabSheet: TTabSheet; 
    TreeView: TTreeView; 
    DrawTabSheet: TTabSheet; 
    PropertiyTabSheet: TTabSheet; 
    SearchTabSheet: TTabSheet; 
    ProTabSheet: TTabSheet; 
    DbAuthorEdit: TEdit; 
    DbPasswordEdit: TEdit; 
    DbBuildDateEdit: TEdit; 
    DbEditDateEdit: TEdit; 
    ContextAuthorEdit: TEdit; 
    ContextPasswordEdit: TEdit; 
    ContextPubDateEdit: TEdit; 
    ContextIndexEdit: TEdit; 
    SearchListBox: TListBox; 
    ContextTypeRadioGroup: TRadioGroup; 
    MainFormMenu: TMainMenu; 
    FileMenuItem: TMenuItem; 
    NewMenuItem: TMenuItem; 
    OpenMenuItem: TMenuItem; 
    SaveMenuItem: TMenuItem; 
    CloseMenuItem: TMenuItem; 
    N1: TMenuItem; 
    FImportMenuItem: TMenuItem; 
    DImportMenuItem: TMenuItem; 
    ExportMenuItem: TMenuItem; 
    N3: TMenuItem; 
    PrintMenuItem: TMenuItem; 
    N4: TMenuItem; 
    ListMenuItem: TMenuItem; 
    MenuItem2: TMenuItem; 
    MenuItem3: TMenuItem; 
    MenuItem4: TMenuItem; 
    MenuItem5: TMenuItem; 
    MyLoveMenuItem: TMenuItem; 
    MyLoveNextMenuItem: TMenuItem; 
    ExitMenuItem: TMenuItem; 
    EditMenuItem: TMenuItem; 
    UndoMenuItem: TMenuItem; 
    RedoMenuItem: TMenuItem; 
    N6: TMenuItem; 
    CutMenuItem: TMenuItem; 
    CopyMenuItem: TMenuItem; 
    PasteMenuItem: TMenuItem; 
    N7: TMenuItem; 
    SelAllMenuItem: TMenuItem; 
    N8: TMenuItem; 
    FindMenuItem: TMenuItem; 
    FindNextMenuItem: TMenuItem; 
    ReplaceMenuItem: TMenuItem; 
    N9: TMenuItem; 
    DelSpaceMenuItem: TMenuItem; 
    ViewMenuItem: TMenuItem; 
    ToolsMenuItem: TMenuItem; 
    StatusMenuItem: TMenuItem; 
    TitleMenuItem: TMenuItem; 
    ReadOnlyMenuItem: TMenuItem; 
    BigFontMenuItem: TMenuItem; 
    SmallFontMenuItem: TMenuItem; 
    N10: TMenuItem; 
    OptionsMenuItem: TMenuItem; 
    OperatorMenuItem: TMenuItem; 
    AddNodeMenuItem: TMenuItem; 
    AddSubNodeMenuItem: TMenuItem; 
    EditNodeMenuItem: TMenuItem; 
    DelNodeMenuItem: TMenuItem; 
    N11: TMenuItem; 
    SortMenuItem: TMenuItem; 
    N12: TMenuItem; 
    CompressMenuItem: TMenuItem; 
    CovertMenuItem: TMenuItem; 
    HelpMenuItem: TMenuItem; 
    AboutMenuItem: TMenuItem; 
    ReadmeMenuItem: TMenuItem; 
    N13: TMenuItem; 
    HomePageMenuItem: TMenuItem; 
    EMailMenuItem: TMenuItem; 
    OtherMenuItem: TMenuItem; 
    KivenLabel: TKvLabel; 
    N2: TMenuItem; 
    DbAuthorLabel: TKvLabel; 
    DbPasswordLabel: TKvLabel; 
    BuildDateLabel: TKvLabel; 
    DbEditDateLabel: TKvLabel; 
    ContextAuthorLabel: TKvLabel; 
    ContextPasswordLabel: TKvLabel; 
    ContextPubDateLabel: TKvLabel; 
    KvLabel1ContextIndexLabel: TKvLabel; 
    TreeViewPopupMenu: TPopupMenu; 
    AddNodePopMenuItem: TMenuItem; 
    AddSubNodePopMenuItem: TMenuItem; 
    DelNodePopMenuItem: TMenuItem; 
    EditNodePopMenuItem: TMenuItem; 
    N14: TMenuItem; 
    CutNodePopMenuItem: TMenuItem; 
    CopyNodePopMenuItem: TMenuItem; 
    PasteNodePopMenuItem: TMenuItem; 
    RichEditPopupMenu: TPopupMenu; 
    CutPopMenuItem: TMenuItem; 
    CopyPopMenuItem: TMenuItem; 
    PastePopMenuItem: TMenuItem; 
    SelAllPopMenuItem: TMenuItem; 
    N15: TMenuItem; 
    DelSpacePopMenuItem: TMenuItem; 
    SetTitlePopMenuItem: TMenuItem; 
    SetIndexPopMenuItem: TMenuItem; 
    SetAuthorPopMenuItem: TMenuItem; 
    RichEdit: TRichEdit; 
    RightTopPanel: TPanel; 
    TitleLabel: TKvLabel; 
    PrevSpeedButton: TSpeedButton; 
    NextSpeedButton: TSpeedButton; 
    ControlBar: TControlBar; 
    FileToolBar: TToolBar; 
    OpenToolButton: TToolButton; 
    SaveToolButton: TToolButton; 
    MyLoveToolButton: TToolButton; 
    PrintToolButton: TToolButton; 
    MenuToolBar: TToolBar; 
    FileToolButton: TToolButton; 
    EditToolButton: TToolButton; 
    ViewToolButton: TToolButton; 
    OperatorToolButton: TToolButton; 
    HelpToolButton: TToolButton; 
    EditToolBar: TToolBar; 
    CutToolButton: TToolButton; 
    CopyToolButton: TToolButton; 
    PasteToolButton: TToolButton; 
    FindToolButton: TToolButton; 
    ActionList: TActionList; 
    NewAction: TAction; 
    OpenAction: TAction; 
    SaveAction: TAction; 
    CloseAction: TAction; 
    FImportAction: TAction; 
    DImportAction: TAction; 
    ExportAction: TAction; 
    PrintAction: TAction; 
    MyLoveAction: TAction; 
    ExitAction: TAction; 
    UndoAction: TAction; 
    RedoAction: TAction; 
    CutAction: TAction; 
    CopyAction: TAction; 
    PasteAction: TAction; 
    SelAllAction: TAction; 
    FindAction: TAction; 
    FindNextAction: TAction; 
    ReplaceAction: TAction; 
    DelSpaceAction: TAction; 
    ToolsAction: TAction; 
    StatusAction: TAction; 
    ReadOnlyAction: TAction; 
    BigFontAction: TAction; 
    SmallFontAction: TAction; 
    OptionAction: TAction; 
    AddNodeAction: TAction; 
    AddSubNodeAction: TAction; 
    EditNodeAction: TAction; 
    DelNodeAction: TAction; 
    SortAction: TAction; 
    CompressAction: TAction; 
    CovertAction: TAction; 
    AboutAction: TAction; 
    ReadMeAction: TAction; 
    HomePageAction: TAction; 
    EMailAction: TAction; 
    OtherAction: TAction; 
    TitleAction: TAction; 
    ViewToolBar: TToolBar; 
    ReadOnlyToolButton: TToolButton; 
    ToolButton4: TToolButton; 
    BigFontToolButton: TToolButton; 
    SmallFontToolButton: TToolButton; 
    OperatorToolBar: TToolBar; 
    AddNodeToolButton: TToolButton; 
    AddSubNodeToolButton: TToolButton; 
    EditNodeToolButton: TToolButton; 
    DelNodeToolButton: TToolButton; 
    OtherToolBar: TToolBar; 
    ReadMeToolButton: TToolButton; 
    AboutToolButton: TToolButton; 
    ToolButton7: TToolButton; 
    HomePageToolButton: TToolButton; 
    EMailToolButton: TToolButton; 
    ToolButton8: TToolButton; 
    ExitToolButton: TToolButton; 
    ToolButton1: TToolButton; 
    ToolButton2: TToolButton; 
    ToolButton3: TToolButton; 
    WordWrapAction: TAction; 
    WordWrapMenuItem: TMenuItem; 
    WordWrapToolButton: TToolButton; 
    N5: TMenuItem; 
    TitleToolButton: TToolButton; 
    N16: TMenuItem; 
    ExportPopMenuItem: TMenuItem; 
    CParaAction: TAction; 
    DParaAction: TAction; 
    CParaMenuItem: TMenuItem; 
    DParaMenuItem: TMenuItem; 
    GbToBigAction: TAction; 
    BigToGbAction: TAction; 
    N17: TMenuItem; 
    GbToBigMenuItem: TMenuItem; 
    BigToGbMenuItem: TMenuItem; 
    ToolBar1: TToolBar; 
    KvLabel1: TKvLabel; 
    Edit1: TEdit; 
    procedure FormShow(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure FormDestroy(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure StatusBarDrawPanel(StatusBar: TStatusBar; 
      Panel: TStatusPanel; const Rect: TRect); 
    procedure NewMenuItemClick(Sender: TObject); 
    procedure CovertMenuItemClick(Sender: TObject); 
    procedure OpenMenuItemClick(Sender: TObject); 
    procedure TreeViewChange(Sender: TObject; Node: TTreeNode); 
    procedure CloseMenuItemClick(Sender: TObject); 
    procedure SaveMenuItemClick(Sender: TObject); 
    procedure TreeViewEdited(Sender: TObject; Node: TTreeNode; 
      var S: String); 
    procedure FImportMenuItemClick(Sender: TObject); 
    procedure ExportMenuItemClick(Sender: TObject); 
    procedure PrintMenuItemClick(Sender: TObject); 
    procedure ExitMenuItemClick(Sender: TObject); 
    procedure TreeViewChanging(Sender: TObject; Node: TTreeNode; 
      var AllowChange: Boolean); 
    procedure UndoMenuItemClick(Sender: TObject); 
    procedure RedoMenuItemClick(Sender: TObject); 
    procedure CutMenuItemClick(Sender: TObject); 
    procedure CopyMenuItemClick(Sender: TObject); 
    procedure PasteMenuItemClick(Sender: TObject); 
    procedure SelAllMenuItemClick(Sender: TObject); 
    procedure FindMenuItemClick(Sender: TObject); 
    procedure FindNextMenuItemClick(Sender: TObject); 
    procedure ReplaceMenuItemClick(Sender: TObject); 
    procedure DelSpaceMenuItemClick(Sender: TObject); 
    procedure FindDialogFind(Sender: TObject); 
    procedure ReplaceDialogReplace(Sender: TObject); 
    procedure ToolsMenuItemClick(Sender: TObject); 
    procedure StatusMenuItemClick(Sender: TObject); 
    procedure TitleMenuItemClick(Sender: TObject); 
    procedure ReadOnlyMenuItemClick(Sender: TObject); 
    procedure BigFontMenuItemClick(Sender: TObject); 
    procedure SmallFontMenuItemClick(Sender: TObject); 
    procedure OptionsMenuItemClick(Sender: TObject); 
    procedure AddNodeMenuItemClick(Sender: TObject); 
    procedure AddSubNodeMenuItemClick(Sender: TObject); 
    procedure EditNodeMenuItemClick(Sender: TObject); 
    procedure DelNodeMenuItemClick(Sender: TObject); 
    procedure SortMenuItemClick(Sender: TObject); 
    procedure CompressMenuItemClick(Sender: TObject); 
    procedure MyLoveMenuItemClick(Sender: TObject); 
    procedure HomePageMenuItemClick(Sender: TObject); 
    procedure AboutMenuItemClick(Sender: TObject); 
    procedure ReadmeMenuItemClick(Sender: TObject); 
    procedure EMailMenuItemClick(Sender: TObject); 
    procedure OtherMenuItemClick(Sender: TObject); 
    procedure DImportMenuItemClick(Sender: TObject); 
    procedure SetTitlePopMenuItemClick(Sender: TObject); 
    procedure TreeViewDragOver(Sender, Source: TObject; X, Y: Integer; 
      State: TDragState; var Accept: Boolean); 
    procedure TreeViewDragDrop(Sender, Source: TObject; X, Y: Integer); 
    procedure CutNodePopMenuItemClick(Sender: TObject); 
    procedure CopyNodePopMenuItemClick(Sender: TObject); 
    procedure PasteNodePopMenuItemClick(Sender: TObject); 
    procedure TreeViewPopupMenuPopup(Sender: TObject); 
    procedure RichEditPopupMenuPopup(Sender: TObject); 
    procedure FileMenuItemClick(Sender: TObject); 
    procedure EditMenuItemClick(Sender: TObject); 
    procedure DbAuthorEditChange(Sender: TObject); 
    procedure ContextAuthorEditChange(Sender: TObject); 
    procedure SetAuthorPopMenuItemClick(Sender: TObject); 
    procedure SetIndexPopMenuItemClick(Sender: TObject); 
 
    procedure PrevSpeedButtonClick(Sender: TObject); 
    procedure NextSpeedButtonClick(Sender: TObject); 
    procedure TreeViewExpanding(Sender: TObject; Node: TTreeNode; 
      var AllowExpansion: Boolean); 
    procedure ContextTypeRadioGroupClick(Sender: TObject); 
    procedure RichEditChange(Sender: TObject); 
    procedure ListMenuItemClick(Sender: TObject); 
    procedure TreeViewCompare(Sender: TObject; Node1, Node2: TTreeNode; 
      Data: Integer; var Compare: Integer); 
    procedure RichEditKeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState); 
    procedure ControlBarDockOver(Sender: TObject; Source: TDragDockObject; 
      X, Y: Integer; State: TDragState; var Accept: Boolean); 
    procedure WordWrapMenuItemClick(Sender: TObject); 
    procedure CParaMenuItemClick(Sender: TObject); 
    procedure DParaMenuItemClick(Sender: TObject); 
    procedure GbToBigMenuItemClick(Sender: TObject); 
    procedure BigToGbMenuItemClick(Sender: TObject); 
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; 
      Shift: TShiftState); 
    procedure SearchListBoxClick(Sender: TObject); 
  private 
      procedure MyShowHint(Sender:TObject); //应用程序提示函数 
  public 
    { Public declarations } 
  end; 
 
var 
  SrmForm: TSrmForm; 
  PanelHint:string;                  //在线提示 
  Srm: TSrmObject;   //Srm读写类 
 
 
implementation 
 
uses SrmAbout, InputPw, SrmOption, MainFun, RegUnit, MruUnit, ClipUnit, 
  GbBig; 
 
 
{$R *.DFM} 
 
//**************************************************************** 
procedure TSrmForm.MyShowHint(Sender:TObject); 
begin 
  PanelHint:=GetLongHint(Application.Hint); 
  SrmForm.StatusBar.Refresh; 
end; 
//**************************************************************** 
//窗体新建前---------------------------------------------------------------- 
procedure TSrmForm.FormCreate(Sender: TObject); 
var 
  i:integer; 
begin 
  //变量初始化 
  SrmClip:=TSrmClip.Create;  //初始化自身剪贴板 
  AppIni:=TAppIni.Create;   //读入配置信息和状态信息 
 
  Mru:=TMru.Create;              //文件菜单的设置 
  Mru.ParentMenu:=FileMenuItem; 
  Mru.Position:=11; 
  Mru.Visible:=AppIni.FileListVisible; 
  for i:=4 downto 0 do Mru.Add(AppIni.FileList[i]); 
  MyLoveMenuItem.Enabled:=AppIni.MyLoveFile<>''; 
  MyLoveMenuItem.Visible:=AppIni.MyLoveVisible; 
  MyLoveNextMenuItem.Visible:=Appini.MyLoveVisible; 
 
  if ParamCount=1 then 
  begin 
    OpenSrm(ParamStr(1)); //带文件名参数运行时 
    exit; 
  end; 
  if AppIni.LoadNearFile then        //如果允许打开上次关闭时的文件 
    if AppIni.NearFile<>'' then        //否则打开上次关闭时的文件 
      if FileExists(AppIni.NearFile) then  //文件存在时 
      begin 
        OpenSrm(AppIni.NearFile); 
        if Srm<>nil then Caption:=csAppName+' - '+Srm.FileName; 
      end; 
  Application.OnHint:=MyShowHint; 
end; 
//窗体显示前---------------------------------------------------------------- 
procedure TSrmForm.FormShow(Sender: TObject); 
begin 
// 
end; 
//窗体关闭前---------------------------------------------------------------- 
procedure TSrmForm.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
  if Srm<>nil then 
    AppIni.NearFile:=Srm.FileName 
  else 
    AppIni.NearFile:=''; 
  if CloseSrmQuery then 
    CloseSrm 
  else 
  begin 
    Action:=caNone; 
    exit; 
  end; 
  Action:=caFree; 
end; 
//窗体释放前---------------------------------------------------------------- 
procedure TSrmForm.FormDestroy(Sender: TObject); 
var 
  i:integer; 
begin 
  for i:=0 to 4 do AppIni.FileList[i]:=Mru.FileList[i]; 
  Mru.Free; 
  AppIni.Free; 
  SrmClip.Free; 
end; 
 
 
//**************************************************************** 
//查找文本--------------------------------------------------------------- 
procedure TSrmForm.FindDialogFind(Sender: TObject); 
var 
  FoundAt,StartPos,ToEnd:integer; 
  SearchFlag:TSearchTypes; 
begin 
  if frMatchCase in FindDialog.Options then 
    SearchFlag:=SearchFlag+[stMatchCase]; 
  if frWholeWord in FindDialog.Options then 
    SearchFlag:=SearchFlag+[stWholeWord]; 
  StartPos:=RichEdit.SelStart+RichEdit.SelLength; 
  ToEnd:=Length(RichEdit.Text)-StartPos; 
  FoundAt:=RichEdit.FindText(FindDialog.FindText,StartPos,ToEnd, 
                             SearchFlag); 
  if FoundAt<>-1 then 
  begin 
    RichEdit.SetFocus; 
    RichEdit.SelStart:=FoundAt; 
    RichEdit.SelLength:=Length(FindDialog.FindText); 
  end 
  else 
  begin 
    MessageBox(Handle,csFindError,csAppName,MB_OK or MB_ICONWARNING); 
  end; 
end; 
//替换文本--------------------------------------------------------------- 
procedure TSrmForm.ReplaceDialogReplace(Sender: TObject); 
var 
  FoundAt,StartPos,ToEnd:integer; 
  SearchFlag:TSearchTypes; 
begin 
  if frMatchCase in ReplaceDialog.Options then 
    SearchFlag:=SearchFlag+[stMatchCase]; 
  if frWholeWord in ReplaceDialog.Options then 
    SearchFlag:=SearchFlag+[stWholeWord]; 
  StartPos:=0; 
  ToEnd:=Length(RichEdit.Text)-StartPos; 
 
  if frReplace in ReplaceDialog.Options then 
  begin 
    StartPos:=RichEdit.SelStart+RichEdit.SelLength; 
    FoundAt:=RichEdit.FindText(ReplaceDialog.FindText,StartPos,ToEnd, 
                               SearchFlag); 
    if FoundAt<>-1 then 
    begin 
      RichEdit.SetFocus; 
      RichEdit.SelStart := FoundAt; 
      RichEdit.SelLength := Length(ReplaceDialog.FindText); 
      RichEdit.SelText := ReplaceDialog.ReplaceText; 
      RichEdit.SelStart := FoundAt; 
      RichEdit.SelLength := Length(ReplaceDialog.ReplaceText); 
    end 
    else 
    begin 
      MessageBox(Handle,csFindError,csAppName,MB_OK or MB_ICONWARNING); 
    end; 
  end 
  else if frReplaceAll in ReplaceDialog.Options then 
  begin 
    StartPos:=0; 
    FoundAt:=0; 
    while FoundAt<>-1 do 
    begin 
      FoundAt:=RichEdit.FindText(ReplaceDialog.FindText,StartPos,ToEnd, 
                                 SearchFlag); 
      if FoundAt<>-1 then 
      begin 
        RichEdit.SetFocus; 
        RichEdit.SelStart := FoundAt; 
        RichEdit.SelLength:=Length(ReplaceDialog.FindText); 
        RichEdit.SelText:=ReplaceDialog.ReplaceText; 
        StartPos:=FoundAt+Length(ReplaceDialog.Findtext); 
        ToEnd:=Length(RichEdit.Text)-StartPos; 
      end 
      else 
      begin 
        MessageBox(Handle,csReplaceSucess,csAppName,0); 
        break; 
      end; 
    end; 
  end 
  else 
  begin 
    FindDialog.Options:=ReplaceDialog.Options; 
    FindDialog.FindText:=ReplaceDialog.FindText; 
    FindDialogFind(Sender); 
  end; 
end; 
 
 
//**************************************************************** 
//节点改变前--------------------------------------------------------------- 
procedure TSrmForm.TreeViewChanging(Sender: TObject; Node: TTreeNode; 
  var AllowChange: Boolean); 
var 
  Ps,UserPs:string; 
begin 
  AllowChange:=true; 
 
  if Srm=nil then exit; 
  SaveItem; 
 
  if Node.Data=pointer(-1) then exit;           //如果是新建节点则不检查口令 
  Ps:=Srm.GetItemPassword(integer(Node.Data));  //得要显示标题的口令 
  if Ps<>'' then                                //口令不为空时 
  begin 
    with TInpwForm.Create(self) do 
    begin 
      Caption:=csAppName; 
      InputLabel.Caption:=csPasswordTitle; 
      if ShowModal=mrCancel then 
      begin 
       AllowChange:=false; 
      end; 
      UserPs:=Edit.Text; 
      if Ps<>UserPs then                        //输入口令不对时 
      begin 
        if ModalResult<>mrCancel then           //在口令输入框中没按Cancel按钮 
          Application.MessageBox(csPasswordError,csAppName,MB_OK); 
        AllowChange:=false;                     //不允许转移选择点 
      end; 
      Free; 
    end; 
  end; 
  end; 
//节点改变后--------------------------------------------------------------- 
procedure TSrmForm.TreeViewChange(Sender: TObject; Node: TTreeNode); 
var 
  Ms:TMemoryStream; 
begin 
 
  if Srm=nil then exit; 
  if ((Node=nil) or (integer(Node.Data)=-1)) then  //无效节点或无内容 
  begin 
    ContextAuthorEdit.Text:=''; 
    ContextPasswordEdit.Text:=''; 
    ContextPubDateEdit.Text:=DateToStr(Date); 
    ContextIndexEdit.Text:=''; 
    ContextTypeRadioGroup.ItemIndex:=1; 
    RichEdit.Text:=''; 
    RichEdit.Modified:=false; 
    if Node<>nil then 
    begin 
      Srm.ItemHeadChanged:=true; 
      Srm.ItemDataChanged:=true; 
    end; 
    exit; 
  end; 
 
  Srm.ReadItemHead(integer(Node.Data));  //读入标题属性 
  case Srm.DataHead.Num of 
    0:                //无内容 
    begin 
      RichEdit.Text:=''; 
    end; 
    1: 
    begin 
      Ms:=TMemoryStream.Create; 
      Srm.ReadItemData(Ms); 
      RichEdit.PlainText:=true; //和3.2版兼容 
      RichEdit.SetTextBuf(Ms.Memory); 
      RichEdit.PlainText:=false;//和3.2版兼容 
      Ms.Free; 
    end; 
  end; 
 
  Node.SelectedIndex:=Node.ImageIndex;  //设置标题属性 
 
  ContextAuthorEdit.Text:=string(Srm.DataHead.Author); 
  ContextPasswordEdit.Text:=String(Srm.DataHead.Password); 
  ContextPubDateEdit.Text:=DateToStr(Srm.DataHead.PubDate); 
  ContextIndexEdit.Text:=string(Srm.DataHead.SearchKey); 
  ContextTypeRadioGroup.ItemIndex:=Node.ImageIndex-1; 
  TitleLabel.Caption:=Node.Text; 
  StatusBar.Refresh; 
 
  RichEdit.Modified:=false; 
  Srm.ItemHeadChanged:=false; 
  Srm.ItemDataChanged:=false; 
end; 
//节点被编辑后------------------------------------------------------------ 
procedure TSrmForm.TreeViewEdited(Sender: TObject; Node: TTreeNode; 
  var S: String); 
var 
  Id:integer; 
begin 
  S:=FormatTreeNodeString(S); 
  if S='' then S:=csNewDefaultTitle; 
  if Node.Parent=nil then Id:=0 else Id:=integer(Node.Parent.ItemId); 
  PostMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id); 
  TitleLabel.Caption:=S; 
  Srm.IndexChanged:=true; 
end; 
//标题排序函数------------------------------------------------------- 
procedure TSrmForm.TreeViewCompare(Sender: TObject; Node1, 
  Node2: TTreeNode; Data: Integer; var Compare: Integer); 
begin 
  if Node1.ImageIndexNode2.ImageIndex then begin Compare:=1 end 
  else comPare:=CompareText(Node1.Text,Node2.Text); 
end; 
//树形视图拖动过程---------------------------------------------------------- 
procedure TSrmForm.TreeViewDragOver(Sender, Source: TObject; X, Y: Integer; 
  State: TDragState; var Accept: Boolean); 
Var 
   NbPixels:Integer; 
   Info:TScrollInfo; 
begin 
     if Source<>TreeView then 
     begin 
       Accept:=false; 
       exit; 
     end; 
     GetScrollInfo(TreeView.Handle,SB_VERT,Info); 
     if Info.nMin=Info.nMax then exit; 
     NbPixels:=Abs(TreeView.Font.Height); 
 
     if (YTreeView.Height-NbPixels-16) then 
     begin 
        TreeView.Perform(WM_VSCROLL,SB_LINEDOWN,0); 
        TreeView.Refresh; 
     end; 
end; 
//树形视图拖动结束---------------------------------------------------------- 
procedure TSrmForm.TreeViewDragDrop(Sender, Source: TObject; X, 
  Y: Integer); 
var 
  SNode,DNode:TTreeNode; 
  Id:integer; 
begin 
  SNode:=TreeView.Selected;  //得被拖动的标题 
  DNode:=TreeView.GetNodeAt(X,Y);  //得坐标处标题 
  if DNode<>SNode then 
    if DNode=nil then 
      SNode.MoveTo(TreeView.Items.GetFirstNode,naAdd) 
    else 
    begin 
      SNode.MoveTo(DNode,naAddChild); 
     end; 
  if DNode=nil then Id:=0 else Id:=integer(DNode.ItemId); 
  SendMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id); 
  srm.IndexChanged:=true;      //置索引改变为真 
end; 
//树形视图拖动结束---------------------------------------------------------- 
 
//节点被扩展前------------------------------------------------------------ 
procedure TSrmForm.TreeViewExpanding(Sender: TObject; Node: TTreeNode; 
  var AllowExpansion: Boolean); 
var 
  ps,UserPs:string; 
begin 
  AllowExpansion:=true; 
 
  if Node.Data=pointer(-1) then exit; 
 
  UserPs:=Srm.GetItemPassword(integer(Node.Data)); 
  if UserPs<>'' then 
  begin 
    with TInpwForm.Create(self) do 
    begin 
      Caption:=csAppName; 
      InputLabel.Caption:=csPasswordTitle; 
      if ShowModal=mrCancel then AllowExpansion:=false; 
      Ps:=Edit.Text; 
      if Ps<>UserPs then 
      begin 
        if ModalResult<>mrCancel then 
          MessageBox(Handle,csPasswordError,csAppName,MB_OK); 
        AllowExpansion:=false; 
      end; 
      Free; 
    end; 
  end; 
end; 
 
//设为标题---------------------------------------------------------- 
procedure TSrmForm.SetTitlePopMenuItemClick(Sender: TObject); 
begin 
  TreeView.Selected.Text:=FormatTreeNodeString(RichEdit.SelText); 
  Srm.IndexChanged:=true; 
  TitleLabel.Caption:=TreeView.Selected.Text; 
end; 
//设为作者---------------------------------------------------------- 
procedure TSrmForm.SetAuthorPopMenuItemClick(Sender: TObject); 
begin 
  ContextAuthorEdit.Text:=RichEdit.SelText; 
  Srm.ItemHeadChanged:=true; 
end; 
//设为关键字-------------------------------------------------------- 
procedure TSrmForm.SetIndexPopMenuItemClick(Sender: TObject); 
var 
  TmpStr:string; 
  p: pchar; 
begin 
  TmpStr:=RichEdit.SelText; 
  if 51#0) do inc(p); 
  if ContextIndexEdit.Text<>'' then 
    if ContextIndexEdit.Text[Length(ContextIndexEdit.Text)]<>'&' then 
      ContextIndexEdit.Text:=ContextIndexEdit.Text+'&'; 
  ContextIndexEdit.Text:=ContextIndexEdit.Text+string(p); 
  Srm.ItemHeadChanged:=true; 
end; 
//编辑框菜单弹出时-------------------------------------------------- 
procedure TSrmForm.RichEditPopupMenuPopup(Sender: TObject); 
begin 
  if Srm=nil then 
  begin 
    CutPopMenuItem.Enabled:=false; 
    CopyPopMenuItem.Enabled:=false; 
    PastePopMenuItem.Enabled:=false; 
    SetTitlePopMenuItem.Enabled:=false; 
    SetIndexPopMenuItem.Enabled:=false; 
    SelAllPopMenuItem.Enabled:=false; 
    SetAuthorPopMenuItem.Enabled:=false; 
    DelSpacePopMenuItem.Enabled:=false; 
  end 
  else 
  begin 
    OpenClipboard(Handle); 
    if GetClipboardData(CF_TEXT)=0 then  //剪贴板中没有文本时 
      PastePopMenuItem.Enabled:=false 
    else 
      PastePopMenuItem.enabled:=true; 
    CloseClipboard; 
    if RichEdit.SelLength>=RichEdit.GetTextLen then 
      SelAllPopMenuItem.Enabled:=false 
    else 
      SelAllPopMenuItem.Enabled:=true; 
    if richEdit.SelLength<>0 then 
    begin 
      CutPopMenuItem.Enabled:=true; 
      CopyPopMenuItem.Enabled:=true; 
      SetTitlePopMenuItem.Enabled:=true; 
      SetIndexPopMenuItem.Enabled:=true; 
      SetAuthorPopMenuItem.Enabled:=true; 
    end 
    else 
    begin 
      CutPopMenuItem.Enabled:=false; 
      CopyPopMenuItem.Enabled:=false; 
      SetTitlePopMenuItem.Enabled:=false; 
      SetIndexPopMenuItem.Enabled:=false; 
      SetAuthorPopMenuItem.Enabled:=false; 
    end; 
    DelSpacePopMenuItem.Enabled:=(RichEdit.Text<>''); 
  end; 
end; 
//剪切标题---------------------------------------------------------- 
procedure TSrmForm.CutNodePopMenuItemClick(Sender: TObject); 
begin 
  SrmClip.Cut(TreeView.Selected); 
end; 
//复制标题---------------------------------------------------------- 
procedure TSrmForm.CopyNodePopMenuItemClick(Sender: TObject); 
begin 
  SrmClip.Copy(TreeView.Selected); 
end; 
//粘贴标题---------------------------------------------------------- 
procedure TSrmForm.PasteNodePopMenuItemClick(Sender: TObject); 
begin 
  SrmClip.Paste(TreeView.Selected); 
end; 
//弹出菜单时的动作-------------------------------------------------------- 
procedure TSrmForm.TreeViewPopupMenuPopup(Sender: TObject); 
begin 
  if Srm=nil then 
  begin 
    DelNodePopMenuItem.Enabled:=false; 
    EditNodePopMenuItem.Enabled:=false; 
    AddSubNodePopMenuItem.Enabled:=false; 
    AddNodePopMenuItem.Enabled:=false; 
    CutNodePopMenuItem.Enabled:=false; 
    CopyNodePopMenuItem.Enabled:=false; 
    PasteNodePopMenuItem.Enabled:=false; 
    exit; 
  end; 
 
  AddNodePopMenuItem.Enabled:=true; 
  if TreeView.Selected=nil then 
  begin 
    DelNodePopMenuItem.Enabled:=false; 
    EditNodePopMenuItem.Enabled:=false; 
    AddSubNodePopMenuItem.Enabled:=false; 
    CutNodePopMenuItem.Enabled:=false; 
    CopyNodePopMenuItem.Enabled:=false; 
  end 
  else 
  begin 
    DelNodePopMenuItem.Enabled:=true; 
    EditNodePopMenuItem.Enabled:=true; 
    AddSubNodePopMenuItem.Enabled:=true; 
    CutNodePopMenuItem.Enabled:=true; 
    CopyNodePopMenuItem.Enabled:=true; 
 
  end; 
  if SrmClip.Node=nil then 
    PasteNodePopMenuItem.Enabled:=false 
  else 
    PasteNodePopMenuItem.Enabled:=true; 
end; 
 
 
 
//**************************************************************** 
//--------------------------------------------------------------------- 
procedure TSrmForm.StatusBarDrawPanel(StatusBar: TStatusBar; 
  Panel: TStatusPanel; const Rect: TRect); 
var 
  Text:string; 
  Rc:TRect; 
begin 
  Rc:=Rect; 
  Rc.Left:=Rc.Left+3; 
  if Panel=StatusBar.Panels[0] then 
  begin 
    Text:=csPanel1Text+IntToStr(TreeView.Items.Count); 
  end; 
  if Panel=StatusBar.Panels[1] then 
  begin 
    Text:=csPanel2Text+IntToStr(RichEdit.GetTextLen); 
  end; 
  if Panel=StatusBar.Panels[2] then 
  begin 
    Text:=PanelHint; 
  end; 
  with StatusBar.Canvas do 
  begin 
    Brush.Style := bsClear; 
    Font := StatusBar.Font; 
    Font.Color := clWhite; 
    OffsetRect(Rc,5,1); 
    DrawText(Handle, PChar(Text), Length(Text), Rc,(DT_VCENTER or DT_SINGLELINE)); 
    OffsetRect(Rc,-1,-1); 
    Font:=StatusBar.Font; 
    DrawText(Handle, PChar(Text), Length(Text), Rc,(DT_VCENTER or DT_SINGLELINE)); 
  end; 
end; 
 
//**************************************************************** 
//新建数据文件------------------------------------------------------------- 
procedure TSrmForm.NewMenuItemClick(Sender: TObject); 
begin 
  with SaveDialog do 
  begin 
    DefaultExt:=csSrmExt; 
    Filter:=csSrmFilter; 
    Title:=csCreateTitle; 
  end; 
  if SaveDialog.Execute then 
  begin 
    if CloseSrmQuery then CloseSrm else exit; 
    Srm:=TSrmObject.Create(SaveDialog.FileName,fmCreate); 
    DbAuthorEdit.Text:=''; 
    DbPasswordEdit.Text:=''; 
    DbBuildDateEdit.Text:=DateToStr(Srm.FileHead.BuildDate); 
    DbeditDateEdit.Text:=DatetoStr(Srm.FileHead.EditDate); 
    Caption:=csAppName+' - '+SaveDialog.FileName; 
    Mru.Add(SaveDialog.FileName); 
  end; 
end; 
//打开数据文件------------------------------------------------------------ 
procedure TSrmForm.OpenMenuItemClick(Sender: TObject); 
begin 
  with OpenDialog do 
  begin 
    DefaultExt:=csSrmExt; 
    Filter:=csSrmFilter; 
    Title:=csOpenTitle; 
    FileName:=''; 
  end; 
  if OpenDialog.Execute then 
  begin 
    if CloseSrmQuery then CloseSrm else exit; 
    OpenSrm(OpenDialog.FileName); 
     if Srm=nil then 
      Caption:=csAppName 
     else 
     begin 
       Caption:=csAppName+' - '+OpenDialog.FileName; 
       Mru.Add(OpenDialog.FileName); 
     end; 
  end; 
end; 
//保存数据文件------------------------------------------------------------ 
procedure TSrmForm.SaveMenuItemClick(Sender: TObject); 
begin 
  SaveSrm; 
end; 
//关闭数据文件------------------------------------------------------------ 
procedure TSrmForm.CloseMenuItemClick(Sender: TObject); 
begin 
  if CloseSrmQuery then 
  begin 
    CloseSrm; 
    Caption:=csAppName; 
  end; 
end; 
//文件引入----------------------------------------------------------------- 
procedure TSrmForm.FImportMenuItemClick(Sender: TObject); 
var 
 
  Ps,UserPs:string; 
  ms,Msh,Msd:TMemoryStream; 
  j:integer; 
  p:PTreeData; 
  AList: TStringList; 
  ALevel,AOldLevel:integer; 
  AParentNode:TTreeNode; 
  StrBuf:PChar; 
  SrmImport:TSrmObject; 
  ANode:TTreeNode; 
  i,n:integer; 
  Fn:string; 
begin 
  with OpenDialog do 
  begin 
    DefaultExt:=csTxtExt; 
    Filter:=csTxtFilter+'|'+csSrmFilter; //* 
    Title:=csOpenTitle; 
    FileName:=''; 
  end; 
  if OpenDialog.Execute then 
    
    RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘 
    for i:=0 to OpenDialog.Files.Count-1 do  //循环读入多重选择文件 
 
  if lowercase(ExtractFileExt(OpenDialog.Files.Strings[i]))='.srm'  then //*导入SRM文件 
   begin 
 SrmImport:=TSrmObject.Create(OpenDialog.Files.Strings[i],fmOpenReadWrite); 
  if SrmImport.FileHead.Password[0]<>#0 then    //密码保护 
  begin 
    InPwForm:=TInPwForm.Create(SrmForm); 
    with InPwForm do 
    begin 
      Caption:=csAppName; 
      InputLabel.Caption:=csPasswordTitle; 
      if ShowModal=mrCancel then 
      begin 
        SrmImport.Free; 
        Free; 
        break; 
      end; 
      Ps:=Edit.Text; 
      UserPs:=string(SrmImport.FileHead.Password); 
      if Ps<>UserPs then 
      begin 
        if ModalResult<>mrCancel then 
          Application.MessageBox(csAppName,csPasswordError,MB_OK); 
        SrmImport.Free; 
        Free; 
        break; 
      end; 
      Free; 
    end; 
  end; 
  Screen.Cursor:=crHourGlass; 
  Msh:=TMemoryStream.Create; 
  Msd:=TMemoryStream.Create; 
  SrmImport.LoadIndex(Msh,Msd);                 //装入索引 
  AList := TStringList.Create; 
  SrmForm.TreeView.Items.BeginUpdate; 
  AList.LoadFromStream(Msh);     //装入到字符串列表中 
  AOldLevel:=0   ;     //计算当前节点的级数 
  AParentNode :=Nil; 
  p:=Msd.Memory; 
  for n:=0 to AList.Count-1 do                        //根据TAB的多少得到相应级别 
  begin 
    StrBuf:=PChar(AList.Strings[n]); 
    ALevel:=0; 
    while StrBuf^=#9 do                   //得该项所在层数 
    begin 
      Inc(StrBuf); 
      Inc(ALevel); 
    end; 
    if (ALevelnil) then 
    begin                                 //返回该项的上级节点 
      for j:=AOldLevel downto ALevel do 
      begin 
        AParentNode:=AParentNode.Parent; 
      end; 
    end; 
    AParentNode:=SrmForm.TreeView.Items.AddChildObject(AParentNode,StrBuf, 
                                     pointer(-1)); 
    AParentNode.ImageIndex:=p.DataType;   //得该节点类型 
    AOldLevel:=ALevel; 
    SrmImport.ReadItemHead(integer(p.pos)); 
    srm.DataHead :=SrmImport.DataHead ;  //读入标题属性 
    TreeView.Selected :=AParentNode; 
  case SrmImport.DataHead.Num of 
    0:                //无内容 
    begin 
      RichEdit.Text:=''; 
    end; 
    1: 
    begin 
      Ms:=TMemoryStream.Create; 
      SrmImport.ReadItemData(Ms); 
      RichEdit.PlainText:=true; //和3.2版兼容 
      RichEdit.SetTextBuf(Ms.Memory); 
      RichEdit.PlainText:=false;//和3.2版兼容 
      Ms.Free; 
    end; 
  end; 
 
    //Srm.ItemDataChanged:=true; 
        p:=pointer(integer(p)+sizeof(TTreeData)); 
  end; 
  SrmForm.TreeView.Items.EndUpdate; 
  AList.Free; 
  Msd.Free; 
  Msh.Free; 
   SrmImport.Free; 
   TreeView.Selected:=SrmForm.TreeView.Items[0];         //置当前选择项为空 
   TreeView.FullCollapse; 
 
  end 
else 
  begin 
 
      Fn:=ExtractFileName(OpenDialog.Files.Strings[i]); 
      Delete(Fn,Length(Fn)-3,4); 
      ANode:=TreeView.Items.AddObjectFirst(TreeView.Selected,Fn,pointer(-1)); 
      ANode.ImageIndex:=2; 
      with Srm.DataHead do 
      begin 
        DataType:=2; 
        Author[0]:=#0; 
        Password[0]:=#0; 
      end; 
      TreeView.Selected:=ANode; 
      RichEdit.Lines.LoadFromFile(OpenDialog.Files.Strings[i]); 
    end  ; 
    StatusBar.Refresh; 
    RichEdit.Perform(WM_SETREDRAW,-1,0);  //允许重绘 
    Richedit.Refresh; 
    Screen.Cursor:=crDefault; 
 
end; 
//目录引入----------------------------------------------------------------- 
procedure TSrmForm.DImportMenuItemClick(Sender: TObject); 
var 
  Temps:WideString; 
  Dir,Mask:string; 
  ANode:TTreeNode; 
begin 
  Temps:=''; 
//  if not SelectDirectory(csAppName,Temps,Dir) then exit; 
  Dir:=BrowseFolder; 
  If Dir='' Then exit; 
  ANode:=TreeView.Items.AddChildObjectFirst(TreeView.Selected, 
       GetLastPathName(Dir),pointer(-1)); 
  ANode.ImageIndex:=1; 
  with Srm.DataHead do 
  begin 
    DataType:=1; 
    Author[0]:=#0; 
    Password[0]:=#0; 
  end; 
  TreeView.Selected:=ANode; 
  RichEdit.Modified:=true; 
  if Dir[Length(Dir)]<>'\' then Dir:=Dir+'\'; 
  Mask:='*.'+csTxtExt; 
  Screen.Cursor:=crHourGlass; 
  RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘 
  ImportDir(Dir,Mask); 
  RichEdit.Perform(WM_SETREDRAW,-1,0);  //允许重绘 
  Richedit.Refresh; 
  StatusBar.Refresh; 
  SCreen.Cursor:=crDefault; 
end; 
//导出标题内容-------------------------------------------------------------- 
procedure TSrmForm.ExportMenuItemClick(Sender: TObject); 
var 
  Dir:string; 
//  i,n:integer;     //对别的格式要导出其附件 
 
  function FormatFileName(Fn:string):string; 
  var 
    i,n:integer; 
    c:char; 
  begin 
    Result:=Fn; 
    n:=Length(Result); 
    for i:=1 to n do 
    begin 
      c:=Result[i]; 
      if ((c=#92) or (c=#47) or (c=#58) or (c=#42) or (c=#63) or 
           (c=#34) or (c=#60) or (c=#62) or (c=#124)) then 
        Result[i]:='$';  //替换掉系统不接受的文件命名的字符 
    end; 
  end; 
  procedure OutPutSrm(ANode:TTreeNode;Dir:string); 
  var 
    SNode:TTreeNode; 
    Ms:TMemoryStream; 
    Fh:integer; 
    Path:string; 
  begin 
    Ms:=TMemoryStream.Create; 
    Path:=Dir; 
    SNode:=ANode.GetFirstChild; 
    while SNode<>nil do 
    begin 
      if SNode.ImageIndex=1 then 
      begin 
        Dir:=Path+FormatFileName(SNode.Text); 
        MkDir(Dir); 
        Dir:=Dir+'\'; 
        OutPutSrm(SNode,Dir); 
      end 
      else 
      begin 
        Srm.ReadItemHead(integer(SNode.Data)); 
        if ((Srm.DataHead.Password[0]=#0) and (Srm.DataHead.Num=1)) then 
        begin       //没有口令的内容才导出 
          Srm.ReadItemData(Ms); 
          Fh:=FileCreate(Path+FormatFileName(SNode.Text)+'.'+csTxtExt); 
          if Fh<>0 then FileWrite(Fh,Ms.Memory^,Ms.Size); 
          FileClose(Fh); 
        end; 
      end; 
      SNode:=SNode.GetNextSibling; 
    end; 
    Ms.Free; 
  end; 
begin 
  if TreeView.Selected=nil then exit; 
  if TreeView.Selected.GetFirstChild=nil then 
  begin 
    with SaveDialog do 
    begin 
      DefaultExt:=csTxtExt; 
      Filter:=csTxtFilter; 
      Title:=csSaveAsTitle; 
      FileName:=TreeView.Selected.Text; 
    end; 
    if SaveDialog.Execute then 
    begin 
      RichEdit.Lines.SaveToFile(SaveDialog.FileName); 
    end; 
  end 
  else 
  begin 
    Dir:=BrowseFolder; 
    If Dir='' Then exit; 
    if Dir[Length(Dir)]<>'\' then Dir:=Dir+'\'; 
    Dir:=Dir+FormatFileName(TreeView.Selected.Text); 
    if DirectoryExists(Dir) then 
    begin 
      Application.MessageBox(csDirExists,csAppName,MB_OK or MB_ICONERROR); 
      exit; 
    end; 
    MkDir(Dir); 
    Dir:=Dir+'\'; 
    Screen.Cursor:=crHourGlass; 
    OutPutSrm(TreeView.Selected,Dir); 
    Screen.Cursor:=crDefault; 
  end; 
end; 
//打印内容------------------------------------------------------------------ 
procedure TSrmForm.PrintMenuItemClick(Sender: TObject); 
begin 
  if RichEdit.GetTextLen()=0 then 
    RichEdit.Print(TitleLabel.Caption); 
end; 
//退出菜单----------------------------------------------------------------- 
procedure TSrmForm.ExitMenuItemClick(Sender: TObject); 
begin 
  Close; 
end; 
//最近文件列表----------------------------------------------------------------- 
procedure TSrmForm.ListMenuItemClick(Sender: TObject); 
var 
  Temps:string; 
begin 
  if CloseSrmQuery then closeSrm else exit; 
  Temps:=Mru.FileList[TMenuItem(Sender).Tag]; 
  if Temps<>'' then 
    if FileExists(Temps) then 
     OpenSrm(Temps); 
  if Srm=nil then 
    Caption:=csAppName 
  else 
  begin 
    Caption:=csAppName+' - '+Temps; 
    Mru.Add(Temps); 
  end; 
end; 
//我的最爱----------------------------------------------------------------- 
procedure TSrmForm.MyLoveMenuItemClick(Sender: TObject); 
begin 
  if CloseSrmQuery then CloseSrm else exit; 
  if AppIni.MyLoveFile<>'' then 
    if FileExists(AppIni.MyLoveFile) then OpenSrm(AppIni.MyLoveFile); 
  if Srm=nil then 
    Caption:=csAppName 
  else 
    begin 
      Caption:=csAppName+' - '+AppIni.MyLoveFile; 
      Mru.Add(AppIni.MyLoveFile); 
    end; 
end; 
 
 
 
//**************************************************************** 
//恢复菜单---------------------------------------------------------------- 
procedure TSrmForm.UndoMenuItemClick(Sender: TObject); 
begin 
  SendMessage(RichEdit.Handle,EM_UNDO,0,0); 
end; 
 
//--------------------------------------------------------------------- 
procedure TSrmForm.RedoMenuItemClick(Sender: TObject); 
begin 
  SendMessage(RichEdit.Handle,EM_UNDO,0,0); 
end; 
 
//重做菜单-------------------------------------------------------------- 
procedure TSrmForm.CutMenuItemClick(Sender: TObject); 
begin 
  SendMessage(GetFocus,WM_CUT,0,0); 
end; 
 
//拷贝------------------------------------------------------------------ 
procedure TSrmForm.CopyMenuItemClick(Sender: TObject); 
begin 
  SendMessage(GetFocus,WM_COPY,0,0); 
end; 
 
//粘贴---------------------------------------------------------------- 
procedure TSrmForm.PasteMenuItemClick(Sender: TObject); 
begin 
  SendMessage(GetFocus,WM_PASTE,0,0); 
end; 
 
//全选--------------------------------------------------------------- 
procedure TSrmForm.SelAllMenuItemClick(Sender: TObject); 
begin 
  RichEdit.SelectAll; 
end; 
 
//查找----------------------------------------------------------------- 
procedure TSrmForm.FindMenuItemClick(Sender: TObject); 
begin 
  ReplaceDialog.ReplaceText:=''; 
  FindDialog.Execute; 
end; 
 
//查找下一个------------------------------------------------------------- 
procedure TSrmForm.FindNextMenuItemClick(Sender: TObject); 
begin 
  if Length(ReplaceDialog.ReplaceText)<>0 then 
  begin 
    ReplaceDialog.Options:=ReplaceDialog.Options+[frReplace]; 
    ReplaceDialogReplace(Sender); 
  end 
  else if Length(FindDialog.FindText)<>0 then 
  begin 
    FindDialogFind(Sender); 
  end 
  else 
    FindDialog.Execute; 
end; 
 
//替换------------------------------------------------------------------ 
procedure TSrmForm.ReplaceMenuItemClick(Sender: TObject); 
begin 
  ReplaceDialog.Execute; 
end; 
//删除空格--------------------------------------------------------------- 
procedure TSrmForm.DelSpaceMenuItemClick(Sender: TObject); 
var 
  i,Size:integer; 
  OldBuf,NewBuf,TempOldBuf,TempNewBuf:pchar; 
begin 
  Size:=RichEdit.GetTextLen+2; 
  GetMem(OldBuf,Size+1); 
  GetMem(NewBuf,Size+1); 
  TempOldBuf:=OldBuf; 
  TempNewBuf:=NewBuf; 
  RichEdit.GetTextBuf(OldBuf,Size); 
  for i:=0 to Size do 
  begin 
    if TempOldBuf^=#32 then 
    begin 
      if ((pchar(integer(TempOldBuf-1))^>=#160) or 
          (pchar(integer(TempOldBuf+1))^>=#160)) then 
        inc(TempOldBuf) 
      else 
      begin 
        TempNewBuf^:=TempOldBuf^; 
        inc(TempNewBuf); 
        inc(TempOldBuf); 
      end; 
    end 
    else 
    begin 
      TempNewBuf^:=TempOldBuf^; 
      inc(TempNewBuf); 
      inc(TempOldBuf); 
    end; 
  end; 
  TempNewBuf^:=#0; 
  RichEdit.SetTextBuf(NewBuf); 
  FreeMem(OldBuf); 
  FreeMem(NewBuf); 
end; 
//合并成段--------------------------------------------------------------- 
procedure TSrmForm.CParaMenuItemClick(Sender: TObject); 
var 
  Stext,Dtext:pchar; 
  OldStext,OldDtext:pchar; 
  n:integer; 
begin 
  n:=RichEdit.SelLength; 
  if n=0 then Exit;    //没有选择的文本则退出 
 
  Inc(n); 
  GetMem(OldStext,n); 
  GetMem(OldDtext,n);  //分配内存准备COPY文本 
  Stext:=OldStext; 
  Dtext:=OldDtext; 
 
  RichEdit.GetSelTextBuf(Stext,n); 
  while Stext^<>#0 do 
  begin 
    if (Stext^=#10) or (Stext^=#13) then  //如果是回车换行符 
      Inc(Stext) 
    else 
    begin 
      Dtext^:=Stext^; 
      Inc(Stext); 
      Inc(Dtext); 
    end; 
  end; 
  Inc(Dtext); 
  Dtext^:=#0; 
  RichEdit.SetSelTextBuf(OldDtext); 
 
  FreeMem(OldStext); 
  FreeMem(OldDtext); 
end; 
//分割段落--------------------------------------------------------------- 
procedure TSrmForm.DParaMenuItemClick(Sender: TObject); 
var 
  i,n:integer; 
  s:string; 
begin 
  if (RichEdit.GetTextLen=0) or (not RichEdit.WordWrap) then Exit; 
 
  Application.ProcessMessages; 
 
  n:=RichEdit.Lines.Count-1; 
  with TProgressBar.Create(self) do 
  begin 
    Parent:=StatusBar; 
    Align:=alClient; 
    Max:=n; 
    StatusBar.Update; 
    Screen.Cursor:=crHourGlass; 
    RichEdit.Perform(WM_SETREDRAW,0,0);  //禁止重绘 
    for i:=0 to n do 
    begin 
      s:=RichEdit.Lines[i]; 
      if s<>'' then RichEdit.Lines[i]:=Format('%s'#13#10,[s]); 
      Position:=i; 
    end; 
    RichEdit.Perform(WM_SETREDRAW,-1,0); 
    RichEdit.Refresh; 
    Screen.Cursor:=crDefault; 
    Free; 
  end; 
end; 
//Gb To Big5转换-------------------------------------------------------- 
procedure TSrmForm.GbToBigMenuItemClick(Sender: TObject); 
var 
  Buf:pchar; 
  n:integer; 
begin 
  n:=RichEdit.GetTextLen+1; 
  GetMem(Buf,n); 
  RichEdit.GetTextBuf(Buf,n); 
  GbToBig(Buf); 
  RichEdit.SetTextBuf(Buf); 
  FreeMem(Buf); 
end; 
//Big5 To Gb转换-------------------------------------------------------- 
procedure TSrmForm.BigToGbMenuItemClick(Sender: TObject); 
var 
  Buf:pchar; 
  n:integer; 
begin 
  n:=RichEdit.GetTextLen+1; 
  GetMem(Buf,n); 
  RichEdit.GetTextBuf(Buf,n); 
  BigToGb(Buf); 
  RichEdit.SetTextBuf(Buf); 
  FreeMem(Buf); 
end; 
 
 
//**************************************************************** 
//工具栏显示--------------------------------------------------------- 
procedure TSrmForm.ToolsMenuItemClick(Sender: TObject); 
begin 
// 
end; 
//状态栏显示--------------------------------------------------------- 
procedure TSrmForm.StatusMenuItemClick(Sender: TObject); 
var 
  tmp:boolean; 
begin 
  tmp:=not StatusMenuItem.Checked; 
  StatusMenuItem.Checked:=tmp; 
  StatusBar.Visible:=tmp; 
end; 
//视图栏显示--------------------------------------------------------- 
procedure TSrmForm.TitleMenuItemClick(Sender: TObject); 
var 
  tmp:boolean; 
begin 
  tmp:=not TitleMenuItem.Checked; 
  TitleMenuItem.Checked:=tmp; 
  TitleToolButton.Down:=tmp; 
  Splitter.Visible:=tmp; 
  LeftForm.Visible:=tmp; 
end; 
//只读控制----------------------------------------------------------- 
procedure TSrmForm.ReadOnlyMenuItemClick(Sender: TObject); 
var 
  tmp:boolean; 
begin 
  tmp:=not ReadOnlymenuItem.Checked; 
  ReadOnlyMenuItem.Checked:=tmp; 
  ReadOnlyToolButton.Down:=tmp; 
  RichEdit.ReadOnly:=tmp; 
end; 
//自动换行------------------------------------------------------------ 
procedure TSrmForm.WordWrapMenuItemClick(Sender: TObject); 
var 
  tmp:boolean; 
begin 
  tmp:=not WordWrapMenuItem.Checked; 
  WordWrapMenuItem.checked:=tmp; 
  WordWrapToolButton.Down:=tmp; 
  RichEdit.WordWrap:=tmp; 
end; 
//放大字体------------------------------------------------------------ 
procedure TSrmForm.BigFontMenuItemClick(Sender: TObject); 
begin 
  with RichEdit.Font do Size:=Size+1; 
end; 
//缩小字体-------------------------------------------------------------- 
procedure TSrmForm.SmallFontMenuItemClick(Sender: TObject); 
begin 
  with RichEdit.Font do Size:=Size-1; 
end; 
//选项设置-------------------------------------------------------------- 
procedure TSrmForm.OptionsMenuItemClick(Sender: TObject); 
begin 
  with TOptionForm.Create(self) do 
  begin 
    if ShowModal=mrOk then 
    begin 
      SetOpenSrmWithApp(SrmCheckBox.Checked); 
      Mru.Visible:=FileListCheckBox.Checked; 
      MyLoveMenuItem.Visible:=MyLoveCheckBox.Checked; 
      MyLoveNextMenuItem.Visible:=MyLoveCheckBox.Checked; 
      with AppIni do 
      begin 
        OpenSrmWithApp:=SrmCheckBox.Checked; 
        LoadNearFile:=LoadSrmCheckBox.Checked; 
        FileListVisible:=FileListCheckBox.checked; 
        MyLoveVisible:=MyLoveCheckBox.Checked; 
        SaveDbQuery:=SaveCheckBox.Checked; 
        DelRecordQuery:=DelCheckBox.Checked; 
        MyLoveFile:=MyLoveEdit.Text; 
      end; 
      TreeView.Color:=TvShape.Brush.Color; 
      RichEdit.Color:=ReShape.Brush.Color; 
      TreeView.Font:=TvLabel.Font; 
      RichEdit.Font:=ReLabel.Font; 
    end; 
    Free; 
  end; 
  MyLoveMenuItem.Enabled:=AppIni.MyLoveFile<>''; 
end; 
 
 
 
 
 
//**************************************************************** 
//添加新节点---------------------------------------------------------- 
procedure TSrmForm.AddNodeMenuItemClick(Sender: TObject); 
var 
  ANode:TTreeNode; 
  Id:integer; 
begin 
  ANode:=TreeView.Items.AddObjectFirst(TreeView.Selected,csNewDefaultTitle, 
                                       pointer(-1)); 
  ANode.ImageIndex:=2; 
  if ANode.Parent=nil then Id:=0 else Id:=integer(ANode.Parent.ItemId); 
  SendMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id);   //自动排序当前同级标题 
  TreeView.Selected:=ANode; 
 
  ANode.EditText; 
  StatusBar.Refresh; 
  Srm.ItemDataChanged:=true; 
end; 
//添加新子节点-------------------------------------------------------- 
procedure TSrmForm.AddSubNodeMenuItemClick(Sender: TObject); 
var 
  ANode:TTreeNode; 
  Id:integer; 
begin 
  ANode:=TreeView.Items.AddChildObjectFirst(TreeView.Selected,csNewDefaultTitle, 
                                            pointer(-1)); 
  ANode.ImageIndex:=2; 
  ANode.Parent.ImageIndex:=1; 
  if ANode.Parent=nil then Id:=0 else Id:=integer(ANode.Parent.ItemId); 
  SendMessage(TreeView.Handle,TVM_SORTCHILDREN,0,Id); 
  TreeView.Selected:=ANode; 
  ANode.EditText; 
  StatusBar.Refresh; 
  Srm.ItemDataChanged:=true; 
end; 
//编辑节点------------------------------------------------------------- 
procedure TSrmForm.EditNodeMenuItemClick(Sender: TObject); 
begin 
if TreeView.Selected <>nil then 
begin 
  TreeView.Selected.EditText; 
  Srm.IndexChanged:=true; 
end; 
end; 
//删除节点------------------------------------------------------------- 
procedure TSrmForm.DelNodeMenuItemClick(Sender: TObject); 
begin 
  if AppIni.DelRecordQuery then 
    if Application.MessageBox(csDeleteQuery, 
           csAppName,MB_OKCANCEL or MB_ICONWARNING)<>IDOK then exit; 
  TreeView.Selected.Delete; 
  StatusBar.Refresh; 
  Srm.IndexChanged:=true; 
end; 
//节点排序-------------------------------------------------------------- 
procedure TSrmForm.SortMenuItemClick(Sender: TObject); 
begin 
  Screen.Cursor:=crHourGlass; 
  Application.ProcessMessages; 
 
  TreeView.SortType:=stText; 
  TreeView.AlphaSort; 
  TreeView.SortType:=stNone; 
  Srm.IndexChanged:=true; 
  Screen.Cursor:=crDefault; 
end; 
//压缩数据库------------------------------------------------------------ 
procedure TSrmForm.CompressMenuItemClick(Sender: TObject); 
var 
  i,n:integer; 
  Ms,Msh,Msd:TMemoryStream; 
  ASrm:TSrmObject; 
  AFileName,AoldFileName:string; 
  ABuf:array[0..260] of char; 
  ANode:TTreeNode; 
  pBuf:PTreeData; 
begin 
  if Srm=nil then exit;  //如果没有打开的数据库则退出 
 
  AOldFileName:=Srm.FileName; 
  SaveSrm; 
 
  GetTempFileName(pchar(ExtractFileDir(Srm.FileName)),'tmp',0,@ABuf[0]); 
  AFileName:=string(ABuf); 
  Ms:=TMemoryStream.Create; 
  Msh:=TMemoryStream.Create; 
  Msd:=TMemoryStream.Create; 
  TreeView.SaveToStream(Msh); 
  Msd.SetSize(sizeof(TTreeData)*TreeView.Items.Count); 
  pBuf:=Msd.Memory; 
  ASrm:=TSrmObject.Create(AFileName,fmCreate); 
  n:=TreeView.Items.Count-1; 
  ANode:=TreeView.Items.GetFirstNode; 
  Screen.Cursor:=crHourGlass; 
  Application.ProcessMessages; 
 
  with TProgressBar.Create(self) do 
  begin 
    Parent:=StatusBar; 
    Align:=alClient; 
    Max:=n; 
    StatusBar.Update; 
    for i:=0 to n do 
    begin 
      Position:=i; 
      Srm.ReadItemHead(integer(ANode.Data)); 
      Srm.ReadItemData(Ms); 
      ASrm.DataHead:=Srm.DataHead; 
      pBuf^.Pos:=ASrm.AddItemHead; 
      if ANode.GetFirstChild<>nil then pBuf^.DataType:=1 
      else pBuf^.DataType:=ANode.ImageIndex; 
      ASrm.AddItemData(Ms); 
      pBuf:=PTreeData(integer(pBuf)+sizeof(TTreeData)); 
      ANode:=ANode.GetNext; 
    end; 
    ASrm.FileHead:=Srm.FileHead; 
    ASrm.SaveIndex(Msh,Msd); 
    ASrm.SaveSrmFile; 
    Free; 
  end; 
 
  Screen.Cursor:=crDefault; 
  ASrm.Free; 
  Ms.Free; 
  Msh.Free; 
  Msd.Free; 
 
  CloseSrm; 
  DeleteFile(AOldFileName); 
  MoveFile(pchar(AFileName),pchar(AOldFileName)); 
  OpenSrm(AOldFileName); 
 
  StatusBar.Refresh; 
end; 
//升级2.x版数据库------------------------------------------------------- 
procedure TSrmForm.CovertMenuItemClick(Sender: TObject); 
var 
  Fn: string; 
  F2,F3:integer; 
  FTv:TTreeView; 
  IdxBuf:PIntArray; 
  Ms,Msh,Msd:TMemoryStream; 
  i,n,size:integer; 
  FSrm:TSrmObject; 
  ANode:TTreeNode; 
begin 
  if CloseSrmQuery then CloseSrm else exit;  //关闭打开的数据文件 
  //得打开文件名和要保存的文件名 
  with OpenDialog do 
  begin 
    DefaultExt:=csTreExt; 
    Filter:=csOldFilter; 
    Title:=csOpenTitle; 
  end; 
  with SaveDialog do 
  begin 
    DefaultExt:=csSrmExt; 
    Filter:=csSrmFilter; 
    Title:=csSaveAsTitle; 
  end; 
  if not OpenDialog.Execute then Exit; 
  if not SaveDialog.Execute then Exit; 
  //旧数据文件不完整时 
  Fn:=OpenDialog.FileName; 
  Delete(Fn,Length(Fn)-2,3); 
  if not (FileExists(Fn+csTreExt) and 
          FileExists(Fn+csIdxExt) and 
          FileExists(Fn+csDatExt)) then 
  begin 
    Application.MessageBox(csOldFileError,csAppName,MB_OK+MB_ICONSTOP); 
    exit; 
  end; 
 
  FSrm:=TSrmObject.Create(SaveDialog.FileName,fmCreate); 
  Ms:=TMemoryStream.Create; 
  Msh:=TMemoryStream.Create; 
  Msd:=TMemoryStream.Create; 
  //装入标题到隐藏的视图中 
  FTv:=TTreeView.Create(self); 
  FTv.Parent:=self; 
  FTv.Visible:=false; 
  FTv.LoadFromFile(Fn+csTreExt); 
  ANode:=FTv.Items.GetFirstNode; 
  //读入索引 
  GetMem(IdxBuf,sizeof(integer)*FTv.Items.Count); 
  Msd.SetSize(sizeof(TTreeData)*FTv.Items.Count); 
  F2:=FileOpen(Fn+csIdxExt,fmOpenRead); 
  FileRead(F2,IdxBuf^,sizeof(integer)*FTv.Items.Count); 
 
  F3:=FileOpen(Fn+csDatExt,fmOpenRead); 
 
  n:=FTv.Items.Count-1; 
  Screen.Cursor:=crHourGlass; 
  Application.ProcessMessages; 
  with TProgressBar.Create(self) do 
  begin 
    Parent:=StatusBar; 
    Align:=alClient; 
    Max:=n; 
    StatusBar.Update; 
 
    for i:=0 to n do 
    begin 
      Position:=i; 
      //置数据段头缺省值 
      with FSrm.DataHead do 
      begin 
        Author[0]:=#0; 
        Password[0]:=#0; 
        SearchKey[0]:=#0; 
        Keep:=0; 
        PubDate:=Now; 
        if (ANode.GetFirstChild<>nil) then 
          DataType:=1 
        else 
          DataType:=2; 
        if IdxBuf^[i]=-1 then 
          Num:=0 
        else 
          Num:=1; 
//          Num:=0; 
      end; 
      PTdArray(Msd.Memory)^[i].DataType:=FSrm.DataHead.DataType; 
      PTdArray(Msd.Memory)^[i].Pos:=FSrm.AddItemHead; 
      //读入数据内容 
      if IdxBuf^[i]<>-1 then 
      begin 
        FileSeek(F3,IdxBuf^[i],0); 
        FileRead(F3,size,sizeof(integer)); 
        Ms.SetSize(size); 
        FileRead(F3,Ms.Memory^,size); 
        FSrm.AddItemData(Ms); 
      end; 
      ANode:=ANode.GetNext; 
    end; 
    Free; 
  end; 
  Screen.Cursor:=crDefault; 
  //保存新文件索引 
  FTv.SaveToStream(Msh); 
  FSrm.SaveIndex(Msh,Msd); 
  FSrm.SaveSrmFile; 
  //释放内存 
  FreeMem(IdxBuf); 
  FileClose(F2); 
  FileClose(F3); 
  FTv.Free; 
  Ms.Free; 
  Msd.Free; 
  Msh.Free; 
  FSrm.Free; 
  OpenSrm(SaveDialog.FileName); 
  Mru.Add(SaveDialog.FileName); 
end; 
 
 
 
//**************************************************************** 
//关于本软件---------------------------------------------------------- 
procedure TSrmForm.AboutMenuItemClick(Sender: TObject); 
begin 
  with TAboutForm.Create(self) do 
  begin 
    ShowModal; 
    Free; 
  end; 
end; 
//帮助文件---------------------------------------------------------- 
procedure TSrmForm.ReadmeMenuItemClick(Sender: TObject); 
var 
  TmpStr :string; 
begin 
  TmpStr:=Application.ExeName; 
  Delete(TmpStr,Length(TmpStr)-2,3); 
  TmpStr:=TmpStr+csHlpExt; 
  if Sender is TWinControl then 
  begin 
    if TWinControl(Sender).HelpContext=0 then 
      WinHelp(Application.Handle,pchar(TmpStr),HELP_CONTEXT,10) 
    else 
      WinHelp(Application.Handle,pchar(TmpStr),HELP_CONTEXT, 
              TWinControl(Sender).HelpContext); 
  end 
  else 
      WinHelp(Application.Handle,pchar(TmpStr),HELP_CONTEXT,10); 
end; 
//作者主页---------------------------------------------------------- 
procedure TSrmForm.HomePageMenuItemClick(Sender: TObject); 
begin 
  ShellExecute(Application.Handle,nil,csHomePage,nil,nil,SW_SHOWNORMAL); 
end; 
//作者邮件---------------------------------------------------------- 
procedure TSrmForm.EMailMenuItemClick(Sender: TObject); 
begin 
  ShellExecute(Application.Handle,nil,csEMail,nil,nil,SW_SHOWNORMAL); 
end; 
//技术支持---------------------------------------------------------- 
procedure TSrmForm.OtherMenuItemClick(Sender: TObject); 
begin 
  Application.MessageBox(csTechniqueSupport,csAppName,MB_OK+MB_ICONSTOP); 
end; 
 
 
 
 
//**************************************************************** 
 
 
//弹出文件菜单时----------------------------------------- 
procedure TSrmForm.FileMenuItemClick(Sender: TObject); 
begin 
  if Srm=nil then    //没有打开的数据库时 
  begin 
    SaveMenuItem.Enabled:=false; 
    CloseMenuItem.Enabled:=false; 
    FImportMenuItem.Enabled:=false; 
    DImportMenuItem.Enabled:=false; 
  end 
  else 
  begin 
    SaveMenuItem.Enabled:=true; 
    CloseMenuItem.Enabled:=true; 
    FImportMenuItem.Enabled:=true; 
    DImportMenuItem.Enabled:=true; 
    end; 
 
  if TreeView.Selected=nil then   //没有被选择的标题时 
  begin 
    ExportMenuItem.Enabled:=false; 
    PrintMenuItem.Enabled:=false; 
  end 
  else 
  begin 
    ExportMenuItem.Enabled:=true; 
    PrintMenuItem.Enabled:=true; 
  end; 
end; 
//弹出编辑菜单时--------------------------------------------- 
procedure TSrmForm.EditMenuItemClick(Sender: TObject); 
begin 
  if RichEdit.SelLength=0 then  //没有被选择的文本时 
  begin 
    CutMenuItem.Enabled:=false; 
    CopyMenuItem.Enabled:=false; 
  end 
  else 
  begin 
    CutMenuItem.Enabled:=true; 
    CopyMenuItem.Enabled:=true; 
  end; 
  if RichEdit.Modified=false then  //内容还未被修改过时 
  begin 
    UndoMenuItem.Enabled:=false; 
    RedoMenuItem.Enabled:=false; 
  end 
  else 
  begin 
    UndoMenuItem.Enabled:=true; 
    RedoMenuItem.Enabled:=true; 
  end; 
  OpenClipboard(Handle); 
  if GetClipboardData(CF_TEXT)=0 then  //剪贴板中没有文本时 
    PasteMenuItem.Enabled:=false 
  else 
    PasteMenuItem.enabled:=true; 
  CloseClipboard; 
  if RichEdit.SelLength>=RichEdit.GetTextLen then 
    SelAllMenuItem.Enabled:=false 
  else 
    SelAllMenuItem.Enabled:=true; 
end; 
 
//数据库属性编辑框有变动时-------------------------------------- 
procedure TSrmForm.DbAuthorEditChange(Sender: TObject); 
begin 
  if LeftPageControl.ActivePage=PropertiyTabSheet then 
    Srm.DbChanged:=true; 
end; 
//标题属性编辑框有变动时---------------------------------------- 
procedure TSrmForm.ContextAuthorEditChange(Sender: TObject); 
begin 
  if RightPageControl.ActivePage=ProTabSheet then 
    Srm.ItemHeadChanged:=true; 
end; 
 
procedure TSrmForm.ContextTypeRadioGroupClick(Sender: TObject); 
begin 
  if RightPageControl.ActivePage=ProTabSheet then 
  begin 
    Srm.DbChanged:=true; 
    if TreeView.Selected<>nil then 
      TreeView.Selected.ImageIndex:=ContextTypeRadioGroup.ItemIndex+1; 
    Srm.ItemHeadChanged:=true; 
    Srm.IndexChanged:=true; 
  end; 
end; 
 
//上一标题------------------------------------------------- 
procedure TSrmForm.PrevSpeedButtonClick(Sender: TObject); 
begin 
if   LeftPageControl.ActivePage=IndexTabsheet then 
begin 
  if TreeView.Selected=nil then exit; 
  if TreeView.Selected.GetPrev<>nil then 
    TreeView.Selected:=TreeView.Selected.GetPrev; 
end 
else 
if LeftPageControl.ActivePage=SearchTabSheet then 
begin 
if SearchListBox.ItemIndex<>0 then 
SearchListBox.ItemIndex:=SearchListBox.itemIndex-1; 
TreeView.Selected := TreeView.Items[LongInt(SearchListBox.Items.objects 
[SearchListBox.ItemIndex])] 
end; 
end; 
//下一标题------------------------------------------------- 
procedure TSrmForm.NextSpeedButtonClick(Sender: TObject); 
begin 
if   LeftPageControl.ActivePage=IndexTabsheet then 
begin 
  if TreeView.Selected=nil then exit; 
  if TreeView.Selected.GetNext<>nil then 
    TreeView.Selected:=TreeView.Selected.GetNext; 
end 
else 
if LeftPageControl.ActivePage=SearchTabSheet then 
begin 
 
SearchListBox.ItemIndex:=SearchListBox.itemIndex+1; 
TreeView.Selected := TreeView.Items[LongInt(SearchListBox.Items.objects 
[SearchListBox.ItemIndex])]; 
end; 
end; 
 
 
 
 
 
//编辑框有变动时------------------------------------------ 
procedure TSrmForm.RichEditChange(Sender: TObject); 
type 
  TTextRange = record 
    chrg: TCharRange; 
    lpstrText: PChar; 
  end; 
var 
  Idx:integer; 
  Tr:TTextRange; 
  s:string; 
begin 
  if RichEdit.SelStart=0 then exit; 
  Idx:=RichEdit.SelStart-1; 
  Tr.chrg.cpMin:=RichEdit.Perform(EM_FINDWORDBREAK,WB_LEFTBREAK,Idx); 
  Tr.chrg.cpMax:=RichEdit.Perform(EM_FINDWORDBREAK,WB_RIGHTBREAK,Idx); 
  if Tr.chrg.cpMin$804 then                                       //如果不是中文输入法 
    RichEdit.DefAttributes.CharSet:=RichEdit.Font.CharSet; //置当前字体为原字体 
} 
end; 
 
procedure TSrmForm.ControlBarDockOver(Sender: TObject; 
  Source: TDragDockObject; X, Y: Integer; State: TDragState; 
  var Accept: Boolean); 
begin 
  Accept := (Source.Control is TToolBar); 
end; 
 
procedure TSrmForm.Edit1KeyDown(Sender: TObject; var Key: Word; 
  Shift: TShiftState); 
var i:integer; 
begin 
if integer(key)=13 then     //*如果是回车的话 
begin 
SearchListBox.Items.Clear; 
for i:=0 to TreeView.Items.Count-1 do 
   begin 
 if Pos(Lowercase(edit1.Text),Lowercase(TreeView.Items[i].Text))<>0 then 
SearchListBox.items.AddObject(TreeView.Items[i].Text,TObject(i)); 
 //*查找,把节点号也加入到STRINGS类中去! 
end; 
LeftPageControl.ActivePage :=SearchTabSheet; 
RichEdit.Lines.Clear; 
end; 
end; 
 
procedure TSrmForm.SearchListBoxClick(Sender: TObject); 
begin 
TreeView.Selected := TreeView.Items[LongInt(SearchListBox.Items.objects[SearchListBox.ItemIndex])]; 
end; 
 
end.