捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
 
广告
评论:DELPHI笔记及代码
google220 41226 2010/12/5 13:16:36
你看能不能提供数据库结构?谢谢。
wuhaihao11 39013 2009/11/10 14:42:13
是的,改了ACCESS头,但是最主要的是这个树形结构表的应用。他可以用到很多地方。
lovezyp 38943 2009/11/1 0:06:51
呵呵,楼主吧access的文件头修改了,不过里面9个表只有3个表有数据,而且这3个表也基本没多少数据
zhtx 35978 2008/10/30 8:15:15
小心有木马!
hyd_lucky 35250 2008/8/11 10:09:16
非常感谢,可以借鉴一些东西
xian129 34796 2008/6/28 10:28:46
向无私奉献的人们致敬!
alecau 34766 2008/6/24 21:11:25
谢谢! 学习下!!!
lin_xx 34339 2008/5/30 10:31:58
謝謝樓主,學習一下:)
qq757526555 34102 2008/5/15 20:14:33
好使,可以用来学习用.谢谢
qq757526555 34088 2008/5/14 16:09:21
谢谢楼主,感动中.
ruiki 34041 2008/5/8 21:37:23
首先,说声报歉,因为涉及某公司利益,及作者的意愿,而且到很多的控件和框架问题;不能公布所有的,只是把主界面的代码公布出来;..
ruiki 34040 2008/5/8 21:34:32
unit FrmMain;

interface

uses
  RQServer,RQClient,RQUtils,
  //自定义
  ConCommon,ConNote_Knowledge,SysParamsTab,
  //
  WinSkinData, RQ,RQSplit,RQMemo, RQPageList,RQTreeView, RQEdit, RQCmdEdit, RQStringGrid,
  //
  DB, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus,  ExtCtrls, StdCtrls,  Mask,  ComCtrls, ToolWin, ImgList, Buttons,
  Grids, Tabs,ComObj,OleCtrls, SHDocVw, ActiveX,ShellApi,
  fcTreeView, RQPanel, XPMan, RQCoolTrayIcon;

type
  TFrm_Main = class(TForm)
    mmMain: TMainMenu;
    mi_system: TMenuItem;
    mi_changepassword: TMenuItem;
    mi_exit: TMenuItem;
    mi_div: TMenuItem;
    pnl_Client: TPanel;
    cb_test: TComboBox;
    pnl_left: TPanel;
    spl_main: TRQSplitter;
    il_toolbar: TImageList;
    stat_main: TStatusBar;
    mni_save: TMenuItem;
    plst_left: TRQPageList;
    pnl_title: TPanel;
    lbl_note_title: TLabel;
    nb_client: TNotebook;
    rmemo_knowledge: TRQMemo;
    pm_knowledge: TPopupMenu;
    mni_knowledageAddNode: TMenuItem;
    mni_knowledageAddChildNode: TMenuItem;
    pm_knowledge_content: TPopupMenu;
    mni_knowledge_content_wordwrap: TMenuItem;
    mni_knowledge_content_selectall: TMenuItem;
    mni_knowledge_content_copy: TMenuItem;
    mni_knowledge_content_paste: TMenuItem;
    mni_knowledge_content_div1: TMenuItem;
    mni_knowledge_content_cut: TMenuItem;
    mni_knowledgeDiv1: TMenuItem;
    mni_knowledgeExpandCurNode: TMenuItem;
    mni_knowledgeExpandAllNode: TMenuItem;
    mni_div1: TMenuItem;
    mniknowledge_cut: TMenuItem;
    mniknowledge_paste: TMenuItem;
    pnl_list2_top: TPanel;
    div_3: TMenuItem;
    mni_export: TMenuItem;
    filepathDialog: TOpenDialog;
    mni_knowledageRenameNode: TMenuItem;
    mni_knowledageDeleteNode: TMenuItem;
    mni_insertCharactor: TMenuItem;
    mni_sort: TMenuItem;
    tlb_main: TToolBar;
    btn_save: TToolButton;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N1: TMenuItem;
    ilt_notetree: TImageList;
    mni_changeVCLSkin: TMenuItem;
    filedialog_main: TOpenDialog;
    N6: TMenuItem;
    N7: TMenuItem;
    tbset_client: TTabSet;
    N8: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N9: TMenuItem;
    vclSkin: TSkinData;
    mainTimer: TTimer;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    btn_splitShowHide: TSpeedButton;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    pnl_charactor: TRQPanel;
    grid_charactor: TRQStringGridEdit;
    trv_Knowledge: TRQTreeView;
    xpmnfst1: TXPManifest;
    mniSetNoteName: TMenuItem;
    rqpnlSetParams: TRQPanel;
    grideNodeName: TRQStringGridEdit;
    btnSet: TButton;
    btnCancel: TButton;
    edtTableName: TRQEdit;
    trv_Note: TRQTreeView;
    btn1: TToolButton;
    pmTray: TPopupMenu;
    N17: TMenuItem;
    rqcltrycn1: TRQCoolTrayIcon;
    btn2: TToolButton;
    pm1: TPopupMenu;
    tlbMain: TToolBar;
    ToolButton3: TToolButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure mi_exitClick(Sender: TObject);
    procedure mni_saveClick(Sender: TObject);
    procedure trv_KnowledgeEndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure mni_knowledageAddNodeClick(Sender: TObject);
    procedure mni_knowledageAddChildNodeClick(Sender: TObject);
    procedure mni_knowledge_content_wordwrapClick(Sender: TObject);
    procedure mni_knowledge_content_selectallClick(Sender: TObject);
    procedure mni_knowledge_content_copyClick(Sender: TObject);
    procedure mni_knowledge_content_pasteClick(Sender: TObject);
    procedure mni_knowledge_content_cutClick(Sender: TObject);
    procedure mni_knowledgeExpandCurNodeClick(Sender: TObject);
    procedure mni_knowledgeExpandAllNodeClick(Sender: TObject);
    procedure mniknowledge_cutClick(Sender: TObject);
    procedure mniknowledge_pasteClick(Sender: TObject);
    procedure mi_changepasswordClick(Sender: TObject);
    procedure mni_exportClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure mni_knowledageRenameNodeClick(Sender: TObject);
    procedure mni_knowledageDeleteNodeClick(Sender: TObject);
    procedure trv_KnowledgeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure btn_saveClick(Sender: TObject);
    procedure grid_charactorDblClick(Sender: TObject);
    procedure mni_sortClick(Sender: TObject);
    procedure rmemo_knowledgeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure N5Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure trv_KnowledgeEnter(Sender: TObject);
    procedure trv_NoteEnter(Sender: TObject);
    procedure trv_NoteKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure pnl_charactor_titleMouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure SpeedButton2Click(Sender: TObject);
    procedure trv_NoteDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure mni_changeVCLSkinClick(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure tbset_clientChange(Sender: TObject; NewTab: Integer;
      var AllowChange: Boolean);
    procedure N8Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure mainTimerTimer(Sender: TObject);
    procedure btn_saveGridExecuteFileInfoClick(Sender: TObject);
    procedure N16Click(Sender: TObject);
    procedure btn_splitShowHideClick(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure trv_KnowledgeChanging(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; var AllowChange: Boolean);
    procedure trv_KnowledgeChange(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode);
    procedure trv_KnowledgeEdited(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; var S: String);
    procedure trv_NoteChange(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode);
    procedure trv_NoteChanging(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; var AllowChange: Boolean);
    procedure trv_NoteEdited(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode; var S: String);
    procedure mniSetNoteNameClick(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure btnSetClick(Sender: TObject);
    procedure trv_NoteEndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure ToolButton2Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure rqcltrycn1Click(Sender: TObject);
    procedure N17Click(Sender: TObject);
    procedure rqcltrycn1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure rqcltrycn1DblClick(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure trv_KnowledgeDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure trv_KnowledgeDragDrop(Sender, Source: TObject; X,
      Y: Integer);
    procedure ToolButton3Click(Sender: TObject);
  private
    isShowBalliconHint:boolean;

    ConComm:TConCommon;
    ConNote_Knowledge:TConNote_Knowledge;
    //
    trv_nodeTempHeight:integer;
    knowledgePasteTreeNode: TfcTreeNode;
    notePaseTreeNode:TfcTreeNode;
    //
    { Private declarations }
  public
    procedure grideNodeNameInit();
    procedure updateNoteName(sParamCode,sParamValue:string);
    procedure wordwrapChange();

    procedure noteSelectMenuInit();
    procedure initForm();

    procedure menuSelectNodeClick(Sender: TObject);
    procedure initCharactorGrid();
    procedure pasteCutNode(oTree:TRQTreeView;nodeSource:TfcTreeNode);
    //保存操作
    procedure saveNoteContent(isHint:boolean=false);
    procedure winExecuteCommand(sCommand:String);
    //

     //初始化树开的数据; --- 传入的数据集有一定的格式;

     //导出节点的数据
     procedure exportChildNodeData(trvNote:TRQTreeView;oTreeNode:TfcTreeNode;sPath:String);
     procedure exportNodeDataFromTable(trvNote:TRQTreeView;oTreeNode:TfcTreeNode;sFileName:String);

     procedure initializationNoteTree(oTree:TRQTreeView;oClientDataSet:TResultSet);
     //查找某个节点的的上一级节点;
     //传入:  要查找的树,当前节点的ID,等级;
     function  findParentNode(oTree:TRQTreeView;sParentId:String;iFindLevel:Integer):TfcTreeNode;
     //设定节点的图标;
     procedure setNodeImage(node:TfcTreeNode);
     //设定选中时的节点的图标;
     procedure setSelectNodeImage(node:TfcTreeNode);

     //-------  新的标题的位置 --------
     //初始化标题;
     procedure initNoteTree(trvNote:TRQTreeView;sTableName:String);
     //取某个节点的数据;
     procedure getNoteTreeNodeContent(trvNote:TRQTreeView;oTreeNode:TfcTreeNode);
     //保存某个节点的数据;
     procedure saveNoteTreeNodeData(trvNote:TRQTreeView;oTreeNode:TfcTreeNode);
     //删除数据;
     function  deleteNoteTreeNodeData(oTree:TRQTreeView;curNode:TfcTreeNode):boolean;
     //
     procedure deleteNoteTreeNode(oTree:TRQTreeView);
     //同时保存当前节点的父节点的ID ;
     function saveNoteTreeNodeLevelId(oTree:TRQTreeView;curNode:TfcTreeNode):boolean;
     //
     procedure noteTreeNodeOnChange(oTree:TRQTreeView;curNode:TfcTreeNode);

     //新增加一个节点;
     procedure noteTreeAddNode(oTree:TRQTreeView);
     //新增加一个子节点;
     procedure noteTreeAddChildNode(oTree:TRQTreeView);
     //
     function  getNodeName(oTree:TRQTreeView;curNode:TfcTreeNode;iFlag:integer=0):String;
     //
     function  getNodeNumberText(oTree:TRQTreeView;curNode:TfcTreeNode;iAddNodeLevel:integer):integer;

     //导出一个节点到文本中;
     procedure noteTreeNodeExportToTxtFile(oTree:TRQTreeView);

    { Public declarations }
  end;

var
  Frm_Main: TFrm_Main;

implementation
uses
  IniFiles,RQComponent,Global,FrmChanngePassowrd,FrmDirectoryDialog;

 

{$R *.dfm}
function FormatFileName(sFileName:string):string;
var
  i,n:integer;
  c:char;
begin
  Result:=sFileName;
  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 TFrm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  self.saveNoteContent(true);
  ConComm.Free;
  ConNote_Knowledge.Free;
  try
    LoginOut();
  except
    Showmessage('退出异常');
  end;
end;

procedure TFrm_Main.FormCreate(Sender: TObject);
begin
  initForm();
end;


procedure TFrm_Main.mi_exitClick(Sender: TObject);
begin
  close();
end;

function TFrm_Main.findParentNode(oTree: TRQTreeView;
  sParentId: String;iFindLevel:Integer): TfcTreeNode;
var
  tempNode:TfcTreeNode;
  i,iNodeCount:Integer;
begin
  Result:=nil; //初始化为空;
  iNodeCount:=oTree.Items.Count;
  if (iNodeCount=0) then exit; //为空的话退出去;
  for i:=0 to  iNodeCount-1 do
  begin
    tempNode:=oTree.Items[i];
    if (tempNode.Level<>iFindLevel) then
      Continue;  //如果不是指定的等级就退出去;
    if(oTree.ID[tempNode]=sParentId)then
    begin
      //只有上一级节点和当前的一样的;才可以;
      Result:=tempNode;
      break; //退出;
    end;
  end;
end;

procedure TFrm_Main.initializationNoteTree(oTree: TRQTreeView;
  oClientDataSet: TResultSet);
var
  iLevel:Integer;
  sParentId,sCurRecordParentId:String;
  parentNode,curNode:TfcTreeNode;
  iHasChildren:integer;
begin
  if (oClientDataSet.RecordCount=0) then exit;
  try
    oTree.Items.BeginUpdate;
    oClientDataSet.first;
    parentNode:=nil; //初始化为空;
    sParentId:='0';
    while (not oClientDataSet.Eof) do
    begin
      iLevel:=oClientDataSet.FieldByName['NODE_LEVEL'].AsInteger;  //如果是0级的话;就不用比较上一级节点了;
      sCurRecordParentId:=oClientDataSet.FieldByName['P_NODE_ID'].AsString;   //上一级节点;
      iHasChildren:=StrtoInt(oClientDataSet.FieldByName['NODE_HasChildren'].AsString);
      if(iLevel=0)then
      begin
        parentNode:=nil;
        //为0级的,就放在第一位;
        curNode:= oTree.RQAddChild(parentNode,
          oClientDataSet.FieldValue['NODE_NAME'],
          oClientDataSet.FieldValue['NODE_ID'],
          oClientDataSet.FieldValue['NODE_NAME'],
          oClientDataSet.FieldValue['P_NODE_ID'],
          oClientDataSet.FieldValue['NODE_LEVEL'],
          iHasChildren,
          oClientDataSet.FieldByName['NODE_DATA'].AsString
          );
        curNode.ImageIndex:=1;
        curNode.SelectedIndex:=1;
        oClientDataSet.next;
        continue;
      end;
      //如果不是0级的话;
      { 在这里判断是不是上一级是否与上一级的一样;不一样的话;就要重新找上一级节点;

      }
      if(sParentId<>sCurRecordParentId)then
      begin
        //更新上一级节点;
        sParentId:=sCurRecordParentId;
        //查找当前的上一级;返回为空的话就说明没有;     些时的等级应该是当前等级的上一级了;
        parentNode:=findParentNode(oTree,sParentId,iLevel-1);
      end;

      if(parentNode<>nil)then
      begin
        curNode:=oTree.RQAddChild(parentNode,
          oClientDataSet.FieldValue['NODE_NAME'],
          oClientDataSet.FieldValue['NODE_ID'],
          oClientDataSet.FieldValue['NODE_NAME'],
          oClientDataSet.FieldValue['P_NODE_ID'],
          oClientDataSet.FieldValue['NODE_LEVEL'],
          iHasChildren,
          oClientDataSet.FieldValue['NODE_DATA']
          );
        curNode.ImageIndex:=1;
        curNode.SelectedIndex:=1;          
        if( (curNode.Parent<>nil) and (curNode.SelectedIndex<>0) )then
        begin
          curNode.Parent.ImageIndex:=0;
          curNode.Parent.SelectedIndex:=0;
        end;          
      end;
      oClientDataSet.next;
    end;
  finally
    oTree.Items.EndUpdate;
  end;

end;

procedure TFrm_Main.mni_saveClick(Sender: TObject);
begin
  saveNoteContent();
end;


procedure TFrm_Main.setNodeImage(node: TfcTreeNode);
begin
  if(node<>nil)then
  begin
    if(node.HasChildren)then
    begin
      node.ImageIndex:=0;
      node.SelectedIndex:=0;
    end
    else
    begin
      node.ImageIndex:=1;
      node.SelectedIndex:=1;
    end;
  end;
end;

procedure TFrm_Main.trv_KnowledgeEndDrag(Sender, Target: TObject; X,
  Y: Integer);
var
  oldSourceParentNode,nodeSource,nodeDesc:TfcTreeNode;
begin
  nodeSource:=trv_Knowledge.Selected;  //得被拖动的标题
  nodeDesc:=trv_Knowledge.GetNodeAt(X,Y);  //得坐标处标题
  oldSourceParentNode :=nodeSource.Parent;
  //self.lbl_note_title.Caption:='[源节点ID]:'+trv_note..ID[nodeSource]+' [源节点LEVEL]'+inttostr(nodeSource.Level);
  if nodeDesc<>nodeSource then
    if nodeDesc=nil then
    begin
      nodeSource.MoveTo(trv_Knowledge.Items.GetFirstNode,fcnaAdd);
    end
    else
      nodeSource.MoveTo(nodeDesc,fcnaAddChild);
   //self.Caption:='[源节点ID]:'+trv_note..ID[nodeSource]+' [源节点LEVEL]'+inttostr(nodeSource.Level);
   //如果失败就直接退出;
   if not self.saveNoteTreeNodeLevelId(trv_Knowledge,nodeSource) then exit;
   setNodeImage(oldSourceParentNode);
   setNodeImage(nodeDesc);
end;

procedure TFrm_Main.initNoteTree(trvNote:TRQTreeView;sTableName: String);
var
  sSql:String;
  oResult:TResultSet;
begin
  oResult:=TResultSet.Create(nil);
  try
    trvNote.Items.Clear;
    trvNote.stringValue:=sTableName;
    rmemo_knowledge.ConnStr:=trvNote.stringValue;
    self.ConNote_Knowledge.tableName:=trvNote.stringValue;
    sSql:=' SELECT ID AS  NODE_ID, NAME AS NODE_NAME ,PARENTID AS  P_NODE_ID,  '
       +' LEVEL_ID AS NODE_LEVEL ,HasChildren AS NODE_HasChildren,ContentId AS NODE_DATA FROM '+trvNote.stringValue+' WHERE 1=1 '
        +' AND  STATUS=''1'' ORDER BY LEVEL_ID,PARENTID,Name,Node_Index  ';
    ConComm.getData(oResult,sSql);
    if ((not oResult.IsEmpty) and (oResult.RecordCount>0))  then
    begin
      self.initializationNoteTree(trvNote,oResult);
    end;
  finally
    oResult.Free;
  end;
end;

procedure TFrm_Main.mni_knowledageAddNodeClick(Sender: TObject);
begin
  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    noteTreeAddNode(self.trv_Knowledge);
    exit;
  end;
  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    noteTreeAddNode(self.trv_Note);
  end;
end;

procedure TFrm_Main.mni_knowledageAddChildNodeClick(Sender: TObject);
begin
  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    noteTreeAddChildNode(self.trv_Knowledge);
    exit;
  end;

  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    noteTreeAddChildNode(self.trv_Note);
  end; 
end;

procedure TFrm_Main.saveNoteTreeNodeData(trvNote:TRQTreeView;oTreeNode: TfcTreeNode);
var
  reData:OleVariant;
  oMs:TMemoryStream;
  oData: OleVariant;
  oClientData:TResultSet;
begin
  try
    if oTreeNode=nil then exit;
    if (trvNote.ID[oTreeNode]='') then Exit; //如果ID为空的话就不保存;
    screen.Cursor:= crHourglass;

    oClientData:=TResultSet.Create(nil);
    oData:=VarArrayCreate([0,3],varVariant);
    oMs:=TMemoryStream.Create;
    {
    //旧的方式存放;是以文件存放的
    oMs.SetSize(rmemo_knowledge.GetTextLen+1);
    self.rmemo_knowledge.GetTextBuf(oMs.Memory,oMs.Size);
    }
    self.rmemo_knowledge.Lines.SaveToStream(oMs);
    //
    oClientData.FieldDefs.Clear;
    oClientData.FieldDefs.Add('ContentData',ftBlob);
    oClientData.CreateRecordSet;
    oClientData.Append;
    oMs.Position:=0;//这里要把位置设定到0位;否则无效果;
    (oClientData.FieldByName['ContentData']  as TBlobfield).LoadFromStream(oMs);
    oClientData.Post;
    if(oClientData.RecordCount=0)then exit;
    //
    self.ConNote_Knowledge.tableName:=trvNote.stringValue;
    reData:= self.ConNote_Knowledge.saveNodeData(trvNote.ID[oTreeNode],trvNote.Data[oTreeNode],'',oClientData.Data);
    oClientData.Free;
    oMs.Free;
    if(reData[0]=0)then
    begin
      trvNote.Data[oTreeNode]:=reData[1];
      Self.rmemo_knowledge.Modified:=false;
    end
    else
      Showmessage(reData[1]);
    screen.Cursor:= crDefault;
  except
    screen.Cursor:= crDefault;
    raise;
  end;

end;

procedure TFrm_Main.getNoteTreeNodeContent(trvNote:TRQTreeView;oTreeNode: TfcTreeNode);
var
  sId,sSql:String;
  reData:OleVariant;
  oClientData:TResultSet;
  msData:TMemoryStream;
begin
  oClientData:=TResultSet.Create(nil);
  try
    screen.Cursor:= crHourglass;
    rmemo_knowledge.ConnStr:=trvNote.stringValue;
    self.rmemo_knowledge.Lines.Clear;
    if oTreeNode=nil then exit;
    try
      sId:=trvNote.ID[oTreeNode];
      if(sId='') then sId:='0';
      sSql:=' SELECT  ContentData   FROM '+trvNote.stringValue+'  WHERE 1=1 AND  ID='+QuotedStr(sId);
      reData:= self.ConComm.query(sSql).toVariant;
      if(reData[0]=0)then
      begin
        oClientData.Data:=reData[2];
        if(not oClientData.IsEmpty) then
        begin
          msData:=TMemoryStream.Create;
          (oClientData.FieldByName['ContentData']  as TBlobfield).SaveToStream(msData);
          msData.Position:=0;

          //旧的方式设置;
          {
          self.rmemo_knowledge.SetTextBuf(msData.Memory);
          }
          {
          self.rmemo_knowledge.PlainText:=False;//这个是RTF用的要打开;
          }
          //
          rmemo_knowledge.Lines.LoadFromStream(msData);
          Self.rmemo_knowledge.Modified:=False; //设定是否有修改

          msData.Free
        end;
      end
      else
        Showmessage(reData[1]);
    except
      raise;
    end;

  finally
     screen.Cursor:= crDefault;  
     oClientData.Free
  end;

end;

function TFrm_Main.saveNoteTreeNodeLevelId(oTree: TRQTreeView;
  curNode: TfcTreeNode): boolean;
var
  reData:OleVariant;
  oClientDataSet:TResultSet;
  sCurParentId,sCurNodeId:String;
  //增加当前的序列号;
  procedure appendLevel(curNode:TfcTreeNode;oClientDataSet:TResultSet);
  var
    sLastNodeId,sTempNodeId:String;
    iCurFirstChildLevel,iFirstChildLevel:integer;
    vNextNode:TfcTreeNode;
  begin
    oClientDataSet.Append;
    oClientDataSet['NODE_ID']:=oTree.ID[curNode];
    oClientDataSet['Level_ID']:=inttostr(curNode.Level);
    //
    if(not curNode.HasChildren)then exit;

    iCurFirstChildLevel:=curNode.Level+1;
    iFirstChildLevel:=curNode.getFirstChild.Level;

    vNextNode:=curNode.GetLastChild;
    sLastNodeId:=oTree.ID[vNextNode];
    while(vNextNode<>nil) do
    begin
     sLastNodeId:=oTree.ID[vNextNode];
     vNextNode:=vNextNode.GetLastChild;
    end;


    vNextNode:=curNode.GetNext;
    while (vNextNode<>nil) do
    begin
      sTempNodeId:=oTree.ID[vNextNode];
      if(sTempNodeId=sLastNodeId)then
      begin
        oClientDataSet.Append;
        oClientDataSet['NODE_ID']:=sTempNodeId;
        oClientDataSet['Level_ID']:=inttostr(vNextNode.Level-iFirstChildLevel+iCurFirstChildLevel);
        break;
      end;
      oClientDataSet.Append;
      oClientDataSet['NODE_ID']:=sTempNodeId;
      oClientDataSet['Level_ID']:=inttostr(vNextNode.Level-iFirstChildLevel+iCurFirstChildLevel);
      vNextNode:=vNextNode.GetNext;
    end;
  end;
begin
  oClientDataSet:=TResultSet.Create(nil);
  try
    result:=false;
    try
      if (curNode=nil) then exit;
      //
      sCurNodeId:=oTree.ID[curNode];
      if(curNode.Parent=nil)then
      begin
        sCurParentId:='0';
        oTree.ParentID[curNode]:='0';
      end
      else
      begin
        sCurParentId:=oTree.ID[curNode.Parent];
        oTree.ParentID[curNode]:=oTree.ID[curNode.Parent];
      end;
      //
      oClientDataSet.FieldDefs.Clear;
      oClientDataSet.FieldDefs.Add('NODE_ID',ftString,10);
      oClientDataSet.FieldDefs.Add('Level_ID',ftString,10);
      oClientDataSet.CreateRecordSet;


       appendLevel(curNode,oClientDataSet);

      oClientDataSet.Post;
      self.ConNote_Knowledge.tableName:=oTree.stringValue;
      reData:=self.ConNote_Knowledge.saveNodesLevelid(sCurNodeId,sCurParentId,oClientDataSet.Data);
      if (reData[0]<>0) then
        Showmessage(reData[1])
      else
        result:=true;
    finally
      oClientDataSet.Free;
    end;
  except
    Result:=false;
  end;
end;

procedure TFrm_Main.mni_knowledge_content_wordwrapClick(Sender: TObject);
begin
  wordwrapChange();
end;

procedure TFrm_Main.mni_knowledge_content_selectallClick(Sender: TObject);
begin
  SendMessage(self.rmemo_knowledge.Handle, EM_SETSEL, 0, -1);
end;

procedure TFrm_Main.mni_knowledge_content_copyClick(Sender: TObject);
begin
  self.rmemo_knowledge.CopyToClipboard;
end;

procedure TFrm_Main.mni_knowledge_content_pasteClick(Sender: TObject);
begin
  self.rmemo_knowledge.PasteFromClipboard;
end;

procedure TFrm_Main.mni_knowledge_content_cutClick(Sender: TObject);
begin
  self.rmemo_knowledge.CutToClipboard;
end;



procedure TFrm_Main.mni_knowledgeExpandCurNodeClick(Sender: TObject);
begin
  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    trv_Knowledge.Selected.Expanded:=true;
    exit;
  end;

  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    trv_note.Selected.Expanded:=true;
  end;


end;

procedure TFrm_Main.mni_knowledgeExpandAllNodeClick(Sender: TObject);
begin
  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    trv_Knowledge.Selected.Expand(true);
    exit;
  end;

  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    trv_note.Selected.Expand(true);
  end;

end;

procedure TFrm_Main.mniknowledge_cutClick(Sender: TObject);
begin
  if(self.trv_Knowledge.Focused)then
  begin
    self.knowledgePasteTreeNode:=trv_Knowledge.Selected;
    exit;
  end;

  if(self.trv_Note.Focused)then
  begin
    self.notePaseTreeNode:=trv_note.Selected;
  end;

end;

procedure TFrm_Main.mniknowledge_pasteClick(Sender: TObject);
begin
  if(self.trv_Knowledge.Focused)then
  begin
    pasteCutNode(self.trv_Knowledge,self.knowledgePasteTreeNode);
    knowledgePasteTreeNode:=nil;
    exit;
  end;

  if(self.trv_Note.Focused)then
  begin
    pasteCutNode(self.trv_Note,self.notePaseTreeNode);
    notePaseTreeNode:=nil;
  end;

end;

procedure TFrm_Main.mi_changepasswordClick(Sender: TObject);
begin
  if( Application.FindComponent('Frm_ChanngePassowrd')=NIL) then
  begin
    Frm_ChanngePassowrd:=TFrm_ChanngePassowrd.Create(nil);
  end;
  Frm_ChanngePassowrd.ShowModal();
  Frm_ChanngePassowrd.Free();
end;

function RQSelectDirectory():String;
begin
  result:='';
  if (Application.FindComponent('Frm_DirectoryDialog')=nil) then
  begin
    Frm_DirectoryDialog:=TFrm_DirectoryDialog.Create(Nil);
  end;
  Frm_DirectoryDialog.ShowModal;
  result:=Frm_DirectoryDialog.directory;
  Frm_DirectoryDialog.Free;
end;

procedure TFrm_Main.mni_exportClick(Sender: TObject);
begin
  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    noteTreeNodeExportToTxtFile(trv_Knowledge);
    exit;
  end;

  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    noteTreeNodeExportToTxtFile(trv_note);
  end;

end;

procedure TFrm_Main.exportNodeDataFromTable(trvNote:TRQTreeView;oTreeNode: TfcTreeNode;sFileName:String);
var
  sId,sSql:String;
  reData:OleVariant;
  oClientData:TResultSet;
  //
  fileHandle:integer;
  msData:TMemoryStream;
begin
   oClientData:=TResultSet.Create(nil);
  try
    if oTreeNode=nil then exit;
    try
      sId:=trvNote.ID[oTreeNode];
      if(sId='') then sId:='0';
     sSql:=' SELECT  ContentData   FROM '+trvNote.stringValue+'  WHERE STATUS=''1'' AND  ID='+QuotedStr(sId);
     reData:= self.ConComm.query(sSql).toVariant;
     if(reData[0]=0)then
      begin
        oClientData.Data:=reData[2];
        if(not oClientData.IsEmpty) then
        begin
          //self.redt_content.PlainText:=True;
          msData:=TMemoryStream.Create;
          (oClientData.FieldByName['ContentData']  as TBlobfield).SaveToStream(msData);
          //文件导出;
          fileHandle:=FileCreate(sFileName);
          if fileHandle<>0 then FileWrite(fileHandle,msData.Memory^,msData.Size);
          FileClose(fileHandle);
          //
          msData.Free;
        end;
      end
      else
        Showmessage(reData[1]);
    except
      raise;
    end;

  finally
     oClientData.Free
  end;
end;


procedure TFrm_Main.exportChildNodeData(trvNote:TRQTreeView;oTreeNode: TfcTreeNode; sPath: String);
var
  sExportFileName:string;
  //iFileNameCount:integer;
  sNode:TfcTreeNode;
  Path:string;
begin
  Path:=sPath;
  sNode:=oTreeNode.getFirstChild;
  while SNode<>nil do
  begin
    if SNode.HasChildren then
    begin
      sPath:=Path+'\'+FormatFileName(SNode.Text);
      MkDir(sPath);
      sPath:=sPath;
      exportChildNodeData(trvNote,SNode,sPath);
    end
    else
    begin
      sExportFileName:=sPath+'\'+FormatFileName(SNode.Text)+'.txt';

      //iFileNameCount:=0;
      //while (FileExists(sExportFileName)) do
      //begin
      //  sExportFileName:=sPath+'\'+FormatFileName(SNode.Text)
      //   +'_'+inttostr(iFileNameCount)+'.txt';
      //  iFileNameCount:=iFileNameCount+1;
      //end;
      
      self.exportNodeDataFromTable(trvNote,SNode,sExportFileName);
    end;
    SNode:=SNode.GetNextSibling;
  end;
  //
end;

procedure TFrm_Main.FormShow(Sender: TObject);
begin
  plst_left.ActivePage:='工作笔记';
  nb_client.ActivePage:='WorkNote';
  //在这里初始化编辑框;
  self.rmemo_knowledge.WordWrap:=true;
  wordwrapChange();   //注意了:在这里会重新设置;
end;

procedure TFrm_Main.mni_knowledageRenameNodeClick(Sender: TObject);
begin
  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    self.trv_Knowledge.Selected.EditText;
    exit;
  end;

  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    self.trv_Note.Selected.EditText;
  end;

end;

procedure TFrm_Main.mni_knowledageDeleteNodeClick(Sender: TObject);
begin
  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    deleteNoteTreeNode(self.trv_Knowledge);
    exit;
  end;

  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    deleteNoteTreeNode(self.trv_Note);
  end;

end;

function TFrm_Main.deleteNoteTreeNodeData(oTree:TRQTreeView;curNode:TfcTreeNode):boolean;
var
  reData:OleVariant;
  oClientDataSet:TResultSet;
  sCurParentId,sCurNodeId:String;
  //增加当前的序列号;
  procedure appendLevel(curNode:TfcTreeNode;oClientDataSet:TResultSet);
  var
    sLastNodeId,sTempNodeId:String;
    iCurFirstChildLevel,iFirstChildLevel:integer;
    vNextNode:TfcTreeNode;
  begin
    oClientDataSet.Append;
    oClientDataSet['NODE_ID']:=oTree.ID[curNode];
    oClientDataSet['Level_ID']:=inttostr(curNode.Level);
    //
    if(not curNode.HasChildren)then exit;

    iCurFirstChildLevel:=curNode.Level+1;
    iFirstChildLevel:=curNode.getFirstChild.Level;

    vNextNode:=curNode.GetLastChild;
    sLastNodeId:=oTree.ID[vNextNode];
    while(vNextNode<>nil) do
    begin
     sLastNodeId:=oTree.ID[vNextNode];
     vNextNode:=vNextNode.GetLastChild;
    end;


    vNextNode:=curNode.GetNext;
    while (vNextNode<>nil) do
    begin
      sTempNodeId:=oTree.ID[vNextNode];
      if(sTempNodeId=sLastNodeId)then
      begin
        oClientDataSet.Append;
        oClientDataSet['NODE_ID']:=sTempNodeId;
        oClientDataSet['Level_ID']:=inttostr(vNextNode.Level-iFirstChildLevel+iCurFirstChildLevel);
        break;
      end;
      oClientDataSet.Append;
      oClientDataSet['NODE_ID']:=sTempNodeId;
      oClientDataSet['Level_ID']:=inttostr(vNextNode.Level-iFirstChildLevel+iCurFirstChildLevel);
      vNextNode:=vNextNode.GetNext;
    end;
  end;
begin
  oClientDataSet:=TResultSet.Create(nil);
  try
    result:=false;
    try
      if (curNode=nil) then exit;
      //
      sCurNodeId:=oTree.ID[curNode];
      if(curNode.Parent=nil)then
      begin
        sCurParentId:='0';
        oTree.ParentID[curNode]:='0';
      end
      else
      begin
        sCurParentId:=oTree.ID[curNode.Parent];
        oTree.ParentID[curNode]:=oTree.ID[curNode.Parent];
      end;
      //
      oClientDataSet.FieldDefs.Clear;
      oClientDataSet.FieldDefs.Add('NODE_ID',ftString,10);
      oClientDataSet.FieldDefs.Add('Level_ID',ftString,10);
      oClientDataSet.CreateRecordSet;


      appendLevel(curNode,oClientDataSet);

      oClientDataSet.Post;
      self.ConNote_Knowledge.tableName:=oTree.stringValue;
      reData:=self.ConNote_Knowledge.deleteNodeData(sCurNodeId,sCurParentId,oClientDataSet.Data);
      if (reData[0]<>0) then
        Showmessage(reData[1])
      else
        result:=true;
    finally
      oClientDataSet.Free;
    end;
  except
    Result:=false;
  end;
end;

procedure TFrm_Main.deleteNoteTreeNode(oTree:TRQTreeView);
var
  vSelectNode,vParentNode:TfcTreeNode;
begin
  vSelectNode:=oTree.Selected;
  if (vSelectNode=nil) then exit;
  if(Application.MessageBox(PChar('是否要删除当前的['+vSelectNode.Text+']的记录'),PChar('删除提示信息'),MB_YESNO)<>6) then
  begin
    exit;
  end;
  vParentNode:=vSelectNode;
  if(self.deleteNoteTreeNodeData(oTree,vSelectNode)) then
  begin
    vSelectNode.Delete;
    self.setNodeImage(vParentNode);
  end;
end;

procedure TFrm_Main.trv_KnowledgeKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if((Shift=[]) and (Key=46)) then
  begin
    if (not (Self.trv_Knowledge.IsEditing)) then
        deleteNoteTreeNode(self.trv_Knowledge);
  end;

end;

procedure TFrm_Main.btn_saveClick(Sender: TObject);
begin
  saveNoteContent();
end;

procedure TFrm_Main.initCharactorGrid;
var
  vHead:TStrings;
begin
  vHead:=TStringList.Create;  //  1       2        3         4       5        6        7
  // 列名|对应的字段|绑定的控件|列宽|对齐方式|列的格式|数据类型|
  vHead.Add('常用字符|||20|4|||');         //0
  vHead.Add('常用字符|||20|4|||');         //1
  vHead.Add('常用字符|||20|4|||');         //2
  vHead.Add('常用字符|||20|4|||');         //3
  vHead.Add('英文笔记|||100|4|||');          //4
  vHead.Add('英文笔记|||20|4|||');          //5
  vHead.Add('英文笔记|||20|4|||');          //6
  TRQForms.setGridHead(grid_charactor,vHead,1);
  grid_charactor.RowCount:=11;
  grid_charactor.Cells[0,1]:='※';
  grid_charactor.Cells[0,2]:='§';
  grid_charactor.Cells[0,3]:='$';
  grid_charactor.Cells[0,4]:='¥';
  grid_charactor.Cells[0,5]:='°';
  grid_charactor.Cells[0,6]:='¤';
  grid_charactor.Cells[0,7]:='№';
  grid_charactor.Cells[0,8]:='√';
  grid_charactor.Cells[0,9]:='…';
  grid_charactor.Cells[0,10]:='*';
  grid_charactor.Cells[0,11]:='';

  grid_charactor.Cells[1,1]:='∝';
  grid_charactor.Cells[1,2]:='≡';
  grid_charactor.Cells[1,3]:='∞';
  grid_charactor.Cells[1,4]:='∧';
  grid_charactor.Cells[1,5]:='∨';
  grid_charactor.Cells[1,6]:='∑';
  grid_charactor.Cells[1,7]:='∏';
  grid_charactor.Cells[1,8]:='≌';
  grid_charactor.Cells[1,9]:='';
  grid_charactor.Cells[1,10]:='';
  grid_charactor.Cells[1,11]:='';

  grid_charactor.Cells[2,1]:='≤';
  grid_charactor.Cells[2,2]:='≥';
  grid_charactor.Cells[2,3]:='×';
  grid_charactor.Cells[2,4]:='÷';
  grid_charactor.Cells[2,5]:='±';
  grid_charactor.Cells[2,6]:='≈';
  grid_charactor.Cells[2,7]:='<';
  grid_charactor.Cells[2,8]:='>';
  grid_charactor.Cells[2,9]:='≮';
  grid_charactor.Cells[2,10]:='≯';
  grid_charactor.Cells[2,11]:='∮';

  grid_charactor.Cells[3,1]:='/∫∪∩';
  grid_charactor.Cells[3,2]:='=∽∵∴⊥∥∠⌒';
  grid_charactor.Cells[3,3]:='≠∷∈+';
  grid_charactor.Cells[3,4]:='';
  grid_charactor.Cells[3,5]:='';
  grid_charactor.Cells[3,6]:='';
  grid_charactor.Cells[3,7]:='';
  grid_charactor.Cells[3,8]:='';
  grid_charactor.Cells[3,9]:='';
  grid_charactor.Cells[3,10]:='';
  grid_charactor.Cells[3,11]:='';

  //英文的;
  grid_charactor.Cells[4,1]:='--------** **--------'+#13;
  grid_charactor.Cells[4,2]:='…………………………'+#13;
  grid_charactor.Cells[4,3]:='';
  grid_charactor.Cells[4,4]:='';
  grid_charactor.Cells[4,5]:='';
  grid_charactor.Cells[4,6]:='';
  grid_charactor.Cells[4,7]:='';
  grid_charactor.Cells[4,8]:='';
  grid_charactor.Cells[4,9]:='';
  grid_charactor.Cells[4,10]:='';
  grid_charactor.Cells[4,11]:='';

  grid_charactor.Cells[5,1]:='□';
  grid_charactor.Cells[5,2]:='■';
  grid_charactor.Cells[5,3]:='☆';
  grid_charactor.Cells[5,4]:='★';
  grid_charactor.Cells[5,5]:='⊙';
  grid_charactor.Cells[5,6]:='◎';
  grid_charactor.Cells[5,7]:='△';
  grid_charactor.Cells[5,8]:='▲';
  grid_charactor.Cells[5,9]:='○';
  grid_charactor.Cells[5,10]:='●';
  grid_charactor.Cells[5,11]:='';

  grid_charactor.Cells[6,1]:='「」';
  grid_charactor.Cells[6,2]:='【】';
  grid_charactor.Cells[6,3]:='';
  grid_charactor.Cells[6,4]:='';
  grid_charactor.Cells[6,5]:='';
  grid_charactor.Cells[6,6]:='';
  grid_charactor.Cells[6,7]:='';
  grid_charactor.Cells[6,8]:='';
  grid_charactor.Cells[6,9]:='';
  grid_charactor.Cells[6,10]:='';
  grid_charactor.Cells[6,11]:='';

  grid_charactor.Cells[3,1]:='';
  grid_charactor.Cells[3,2]:='';
  grid_charactor.Cells[3,3]:='';
  grid_charactor.Cells[3,4]:='';
  grid_charactor.Cells[3,5]:='';
  grid_charactor.Cells[3,6]:='';
  grid_charactor.Cells[3,7]:='';
  grid_charactor.Cells[3,8]:='';
  grid_charactor.Cells[3,9]:='';
  grid_charactor.Cells[3,10]:='';
  grid_charactor.Cells[3,11]:='';

end;

procedure TFrm_Main.grid_charactorDblClick(Sender: TObject);
begin
  if(grid_charactor.Row=0) then
    exit;
  pnl_charactor.Hide;
  rmemo_knowledge.SelText:=grid_charactor.Cells[grid_charactor.Col,grid_charactor.Row];
end;

procedure TFrm_Main.mni_sortClick(Sender: TObject);
begin

  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    self.trv_Knowledge.Selected.AlphaSort();
    exit;
  end;

  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    self.trv_Note.Selected.AlphaSort();
  end;

end;

procedure TFrm_Main.rmemo_knowledgeKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  sCommand:String;
begin
  if ((ssCtrl in Shift) and (key=83)) then
  begin
    self.saveNoteContent();
  end;


end;

function  SetHTML(AHTML:  String;  AWebBrowser:  TWebBrowser):  Boolean;
var  
   Stream:  IStream;  
   hHTMLText:  HGLOBAL;  
   psi:  IPersistStreamInit;  
begin  
   Application.ProcessMessages;  
   try  
       hHTMLText  :=  GlobalAlloc(GPTR,  Length(AHTML)  +  1);  
       CopyMemory(Pointer(hHTMLText),  PChar(AHTML),  Length(AHTML));  
       CreateStreamOnHGlobal(hHTMLText,  True,  Stream);  
       AWebBrowser.Document.QueryInterface(IPersistStreamInit,  psi);

       psi.InitNew;  
       psi.Load(Stream);  
       Result  :=  True;  
   except  
       Result  :=  False;  
   end;  
   psi  :=  nil;  
   Stream  :=  nil;  
end;


procedure TFrm_Main.N5Click(Sender: TObject);
begin
 winExecuteCommand('calc.exe');
end;

procedure TFrm_Main.N4Click(Sender: TObject);
begin
 winExecuteCommand('mspaint.exe');
end;

procedure TFrm_Main.trv_KnowledgeEnter(Sender: TObject);
begin
  if( (trim(self.trv_Knowledge.stringValue)<>'')
   and (trim(self.rmemo_knowledge.ConnStr)<>'')
   and (self.rmemo_knowledge.ConnStr<>self.trv_Knowledge.stringValue) )then
  begin
    if( self.rmemo_knowledge.Modified) then
    begin
      if( Application.MessageBox('是否要保存?','提示',mb_yesno)=6 )then
      begin
        self.saveNoteTreeNodeData(self.trv_Note,self.trv_Note.Selected);
      end;
    end;

    noteTreeNodeOnChange(trv_Knowledge,trv_Knowledge.Selected);
  end;
end;

procedure TFrm_Main.trv_NoteEnter(Sender: TObject);
begin
  if( (trim(self.trv_Note.stringValue)<>'')
   and (trim(self.rmemo_knowledge.ConnStr)<>'')
   and (self.rmemo_knowledge.ConnStr<>self.trv_Note.stringValue) )then
  begin
    if(self.rmemo_knowledge.Modified) then
    begin
      if( Application.MessageBox('是否要保存?','提示',mb_yesno)=6 )then
      begin
        self.saveNoteTreeNodeData(self.trv_Knowledge,self.trv_Knowledge.Selected);
      end;
    end;
    //这个在进入时会发生变化事件;
    noteTreeNodeOnChange(self.trv_Note,self.trv_Note.Selected);
  end;
end;

procedure TFrm_Main.noteTreeNodeOnChange(oTree:TRQTreeView;curNode:TfcTreeNode);
var
 sTitle:String;
 parentNode: TfcTreeNode;
begin
  sTitle:='';
  lbl_note_title.Caption:='';
  getNoteTreeNodeContent(oTree,curNode);
  if(curNode<>nil)then
  begin
    sTitle:=oTree.Name[curNode];
    lbl_note_title.Caption:=sTitle;
    parentNode:=curNode.Parent;
    while (parentNode<>nil) do
    begin
      sTitle:='['+oTree.Name[parentNode]+']->'+sTitle;
      parentNode:=parentNode.Parent;
    end;
  end;
  stat_main.Panels[0].Text:=sTitle;
end;

procedure TFrm_Main.noteTreeAddNode(oTree: TRQTreeView);
var
  curNode,parentNode:TfcTreeNode;
  sId,sName,sParentId,sLevelId,sIndex,sContentId:String;
  reData:OleVariant;
begin
  try
    parentNode:=nil;
    curNode:=oTree.Selected;
    sName:=getNodeName(oTree,curNode,0);
    if(curNode=nil)then
    begin
      sLevelId:='0';
      sParentId:='0';
      sIndex:='0';
    end
    else
    begin
      parentNode:=curNode.Parent;
      if(parentNode=nil)then
      begin
        sLevelId:='0';
        sParentId:='0';
        sIndex:='0';
      end
      else
      begin
        sLevelId:=IntToStr(parentNode.Level+1);
        sParentId:=oTree.ID[parentNode];
        sIndex:=IntToStr(parentNode.Count);
      end;
    end;

    self.ConNote_Knowledge.tableName:=oTree.stringValue;
    reData:=self.ConNote_Knowledge.addNode(sName,sParentId,sLevelId,sIndex);
    if(VarIsEmpty(reData))then
      ShowMessage('返回为空');

    if(reData[0]=0)then
    begin
      sId:=reData[1];
      sContentId:=reData[2];
      curNode:=oTree.RQAddChild(parentNode,
          sName,
          sId,
          sName,
          sParentId,
          StrToInt(sLevelId),
          0,
          sContentId
          );
        curNode.ImageIndex:=1;
        curNode.SelectedIndex:=1;
        if( (curNode.Parent<>nil) and (curNode.SelectedIndex<>0) )then
        begin
          curNode.Parent.ImageIndex:=0;
          curNode.Parent.SelectedIndex:=0;
        end;
        curNode.Selected:=True;
        curNode.EditText;
    end
    else
      ShowMessage(reData[1]);
  except
    Raise;
  end;

end;

procedure TFrm_Main.noteTreeAddChildNode(oTree: TRQTreeView);
var
  curNode,parentNode:TfcTreeNode;
  sId,sName,sParentId,sLevelId,sIndex,sContentId:String;
  reData:OleVariant;
begin
  try
    curNode:=oTree.Selected;
    sName:=getNodeName(oTree,curNode,1);
    parentNode:=curNode;
    if(parentNode=nil)then
    begin
      sLevelId:='0';
      sParentId:='0';
      sIndex:='0';
    end
    else
    begin
      sLevelId:=IntToStr(parentNode.Level+1);
      sParentId:=oTree.ID[parentNode];
      sIndex:=IntToStr(parentNode.Count);
    end;
    
    ConNote_Knowledge.tableName:=oTree.stringValue;
    reData:=ConNote_Knowledge.addNode(sName,sParentId,sLevelId,sIndex);
    if(VarIsEmpty(reData))then
      ShowMessage('返回为空');
    if(reData[0]=0)then
    begin
      sId:=reData[1];
      sContentId:=reData[2];
      curNode:=oTree.RQAddFristChild(parentNode,
          sName,
          sId,
          sName,
          sParentId,
          StrToInt(sLevelId),
          0,
          sContentId
          );
        curNode.ImageIndex:=1;
        curNode.SelectedIndex:=1;
        if( (curNode.Parent<>nil) and (curNode.SelectedIndex<>0) )then
        begin
          curNode.Parent.ImageIndex:=0;
          curNode.Parent.SelectedIndex:=0;
        end;
        curNode.Selected:=True;
        curNode.EditText;        
      exit;
    end;
    ShowMessage(reData[1]);
  except
    Raise;
  end;

end;

procedure TFrm_Main.noteTreeNodeExportToTxtFile(oTree: TRQTreeView);
var
  iFileNameCount:integer;
  vSelectNode:TfcTreeNode;
  sExportPath,sExportFileName:String;
begin
  vSelectNode:=oTree.Selected;
  if vSelectNode=nil then exit;
  sExportPath:=RQSelectDirectory;
  sExportFileName:='';
  if(DirectoryExists(sExportPath))then
  begin
    //先导出当前的节点
    if vSelectNode.HasChildren then
    begin
      sExportPath:=sExportPath+'\'+FormatFileName(vSelectNode.Text);
      MkDir(sExportPath);
    end
    else
    begin
      sExportFileName:=sExportPath+'\'+FormatFileName(vSelectNode.Text)+'.txt';
      iFileNameCount:=0;
      while (FileExists(sExportFileName)) do
      begin
        sExportFileName:=sExportPath+'\'+FormatFileName(vSelectNode.Text)
         +'_'+inttostr(iFileNameCount)+'.txt';
        iFileNameCount:=iFileNameCount+1;
      end;

      self.exportNodeDataFromTable(oTree,vSelectNode,sExportFileName);
    end;
    if(sExportPath<>'')then
    begin
      //导出子节点
      exportChildNodeData(oTree,vSelectNode,sExportPath);
    end;
  end;

end;

procedure TFrm_Main.saveNoteContent(isHint:boolean=false);
begin
  if( not self.rmemo_knowledge.Modified) then exit;
  if( isHint )then
  begin
    if( Application.MessageBox('是否要保存?','提示',mb_yesno)<>6 )then
    begin
      exit;
    end;

  end;

  if (self.trv_Knowledge.stringValue=rmemo_knowledge.ConnStr) then
  begin
    self.saveNoteTreeNodeData(self.trv_Knowledge,self.trv_Knowledge.Selected);
    exit;
  end;
  if (self.trv_Note.stringValue=rmemo_knowledge.ConnStr) then
  begin
    self.saveNoteTreeNodeData(self.trv_Note,self.trv_Note.Selected);
  end;
end;

procedure TFrm_Main.initForm;
var
  vHead:TStrings;
  sSql :String;
begin
  isShowBalliconHint:=false;
  self.Caption:=Application.Title;
  self.rqcltrycn1.Hint:=Application.Title+'---吴海豪要努力坚强!';
  //mainTimer.Interval:=StrToInt(TRQWindowsSystem.getAssociatedFile(;))
  //
  ConComm:=TConCommon.Create;
  ConNote_Knowledge:=TConNote_Knowledge.Create;

  //初始化知识表;
  //初始化相关信息
  self.rmemo_knowledge.MaxLength:=High(Integer) - 1024;
  self.rmemo_knowledge.Lines.Clear;
  //
  self.nb_client.PageIndex:=0;

  initCharactorGrid();
  grideNodeNameInit();



  self.plst_left.Pages[1]:=self.grideNodeName.Cells[1,1];
  initNoteTree(self.trv_Note,self.grideNodeName.Cells[0,1]);
  self.plst_left.Pages[0]:=self.grideNodeName.Cells[1,2];
  initNoteTree(self.trv_Knowledge,self.grideNodeName.Cells[0,2]);

  sSql:='SELECT PARAM_VALUE FROM SYS_PARAMS_TAB WHERE GROUP_CODE=''SYSTRAY'' AND PARAM_CODE=''SHOWICON'' ';
  sSql:=Self.ConComm.getValue('PARAM_VALUE',sSql);
  if(sSql<>'') then
  begin
    if(FileExists(sSql)) then
    begin
      Application.Icon.LoadFromFile(sSql);
      Self.rqcltrycn1.Icon.LoadFromFile(sSql);
      Self.rqcltrycn1.IconVisible:=false;
      Self.rqcltrycn1.IconVisible:=true;
    end;
  end;

end;

procedure TFrm_Main.menuSelectNodeClick(Sender: TObject);
begin
  with Sender as TMenuItem do
  begin

    //if(self.trv_Knowledge.Focused)then
    if (self.plst_left.PageIndex=0) then
    begin
      if(trv_Note.stringValue=TMenuItem(Sender).hint) then
      begin
        ShowMessage('已经打开了['+TMenuItem(Sender).Caption+']不能再打开了!');
        exit;
      end;
      self.saveNoteContent(true);
      self.initNoteTree(self.trv_Knowledge,TMenuItem(Sender).hint);
      self.plst_left.Pages[0]:=TMenuItem(Sender).Caption;
      exit;
    end;
    
    //if(self.trv_Note.Focused)then
    if (self.plst_left.PageIndex=1) then
    begin
      if(trv_Knowledge.stringValue=TMenuItem(Sender).hint) then
      begin
        ShowMessage('已经打开了['+TMenuItem(Sender).Caption+']不能再打开了!');
        exit;
      end;
      self.saveNoteContent(true);
      self.initNoteTree(self.trv_Note,TMenuItem(Sender).hint);
      self.plst_left.Pages[1]:=TMenuItem(Sender).Caption;
    end;
  end;
  case Tag of
      0:  ;
  end;
  //
  
end;

procedure TFrm_Main.trv_NoteKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if((Shift=[]) and (Key=46)) then
  begin
    if (not (self.trv_Note.IsEditing)) then
        deleteNoteTreeNode(self.trv_Note);
  end;
end;

procedure TFrm_Main.pnl_charactor_titleMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(pnl_charactor.Handle, WM_SYSCOMMAND, $F012, 0);

end;

procedure TFrm_Main.SpeedButton2Click(Sender: TObject);
begin
  pnl_charactor.Hide;
end;

procedure TFrm_Main.setSelectNodeImage(node: TfcTreeNode);
begin
  if(node<>nil)then
  begin
    if(node.HasChildren)then
    begin
      node.ImageIndex:=2;
      node.SelectedIndex:=2;
    end
    else
    begin
      node.ImageIndex:=3;
      node.SelectedIndex:=3;
    end;
  end;
end;

procedure TFrm_Main.pasteCutNode(oTree:TRQTreeView;nodeSource:TfcTreeNode);
var
  oldSourceParentNode,nodeDesc:TfcTreeNode;
begin
  if(nodeSource=nil) then exit;
  nodeDesc:=oTree.Selected;  //得坐标处标题
  oldSourceParentNode :=nodeSource.Parent;
  //self.lbl_note_title.Caption:='[源节点ID]:'+trv_note.ID[nodeSource]+' [源节点LEVEL]'+inttostr(nodeSource.Level);
  if nodeDesc<>nodeSource then
    if nodeDesc=nil then
    begin
      nodeSource.MoveTo(oTree.Items.GetFirstNode,fcnaAdd);
    end
    else
      nodeSource.MoveTo(nodeDesc,fcnaAddChild);
   //self.Caption:='[源节点ID]:'+trv_note.ID[nodeSource]+' [源节点LEVEL]'+inttostr(nodeSource.Level);
   //如果失败就直接退出;
   if not self.saveNoteTreeNodeLevelId(oTree,nodeSource) then exit;
   setNodeImage(oldSourceParentNode);
   setNodeImage(nodeDesc);
end;

procedure TFrm_Main.trv_NoteDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  //这里一定要放一个,否则不能被执行.就不能取到X,Y对应的数;
end;

function TFrm_Main.getNodeName(oTree: TRQTreeView; curNode: TfcTreeNode;
  iFlag: integer): String;
var
  nodeCount:integer;
  parentNode:TfcTreeNode;
begin
  //
  result:='001_';
  if(iFlag=0)then
  begin
    if(curNode=nil)then exit;
    parentNode:=curNode.Parent;
    nodeCount:=getNodeNumberText(oTree,parentNode,curNode.Level);
    result:=TRQString.formatInteger('000',nodeCount+1)+'_';
  end
  else
  begin
    if(curNode=nil)then exit;
    nodeCount:=getNodeNumberText(oTree,curNode,curNode.Level+1);
    result:=TRQString.formatInteger('000',nodeCount+1)+'_';
  end;
  //
end;

function TFrm_Main.getNodeNumberText(oTree: TRQTreeView;
  curNode: TfcTreeNode;iAddNodeLevel:integer): integer;
var
  i,iCount,iLevel:integer;
  tempNode:TfcTreeNode;

  function getTreeZeroLeveNodeCount(oTree: TRQTreeView):integer;
  var
    i,iCount:integer;
    tempNode:TfcTreeNode;
  begin
    result:=0;
    iCount:=oTree.Items.Count-1;
    for i:=0 to iCount do
    begin
      if(oTree.Items[i].Level=0)then
      begin
        inc(result);
      end;
    end;
    
  end;
begin
  //
  result:=0;
  if(curNode=nil) then
  begin
    result:=getTreeZeroLeveNodeCount(oTree);
    exit;
  end;

  iCount:=curNode.Count-1;
  for i:=0 to iCount do
  begin
    if(curNode.Item[i].Level=iAddNodeLevel)then
    begin
      inc(result);
    end;
  end;

end;

procedure TFrm_Main.mni_changeVCLSkinClick(Sender: TObject);
begin
  //
  if(filedialog_main.Execute)then
  begin
    if (filedialog_main.FileName<>'') then
    begin
      self.vclSkin.LoadFromFile(filedialog_main.FileName);
      self.vclSkin.Active:=true;
    end;
  end;
  //
end;

procedure TFrm_Main.N6Click(Sender: TObject);
begin
   if(not Self.AlphaBlend) then
    Self.AlphaBlend:=True
  else
    Self.AlphaBlend:=false;
end;

procedure TFrm_Main.winExecuteCommand(sCommand: String);
begin
{
winexec('c:\windows\regedit.exe',sw_normal);
最后一个参数:
SW_HIDE     
SW_NORMAL
SW_SHOW
SW_MAXMIZE
SW_MINIMIZE
}
  winexec(PChar(sCommand),sw_normal)
end;

procedure TFrm_Main.N7Click(Sender: TObject);
begin
 winExecuteCommand('notepad.exe');
end;

procedure TFrm_Main.tbset_clientChange(Sender: TObject; NewTab: Integer;
  var AllowChange: Boolean);
begin
  //self.nb_client.PageIndex:=NewTab;
end;

procedure TFrm_Main.N8Click(Sender: TObject);
begin
  if (N8.Hint='不置顶') then
  begin
    SetWindowPos(Handle,hwnd_TopMost,
          0,0,0,0, //缺省位置
          swp_NoMove or swp_NoSize);
    N8.Caption:='不置顶';
    N8.Hint:='置顶';

  end
  else
  begin
    //不置顶;
    SetWindowPos(Handle,hwnd_noTopMost,
          0,0,0,0, //缺省位置
          swp_NoMove or swp_NoSize);
    N8.Hint:='不置顶';
    N8.Caption:='置顶';
    
  end;
  //将hwnd_topmost改成hwnd_noTopMost即可
  //用SetwindowsHookEx函数
  //wm_journalrecord 当系统从系统消息队列中清除消息时调用
end;

procedure TFrm_Main.N10Click(Sender: TObject);

  procedure OpenInIE(aURL: string);   //need uses ComObj;
  var
    IE        : Variant;
  begin
    IE := CreateOleObject('InternetExplorer.Application');
    IE.Visible := true;
    try
      IE.Navigate(aURL);
    except

    end;
  end;
  //判断是否是链结
function IsURL(s: string): Boolean;
var
  i: integer;
begin
   //From the top, make the result false.
  Result := False;
   //Again, if the text of the token is less than 5, its just not going
   //to be a URL.
  if Length(s) < 5 then exit;
   //If the token contains a period at the end, or two periods combined, 
   //its also not going to be a url.
  if (s[Length(s)] = '.')  or (Pos('..', s) > 0) then exit;
   //Now we check for bogus characters, Anything between 33 and 126 is valid,
   //Above or below, are not valid url characters.
  for i := 1 to Length(s) do
    if (Ord(s[i]) < 33) or (Ord(s[i]) > 126) then exit;
  //
  if ( (Pos('\\', LowerCase(s)) > 0) and (Pos('.', LowerCase(s)) > 0) ) then
  begin
    Result := True;
    Exit;
  end;


   //The next few things check for individual characteristics of various stringd.
  if (Pos('www.',LowerCase(s)) = 1) or (Pos('news:', LowerCase(s)) = 1) and
     (Length(s) > 6) then
  begin
    Result := True;
    Exit;
  end;
  if (Length(s) > 12) or (Pos('mailto:', LowerCase(s)) = 1) and
     (Pos('@', s) > 1) and (Pos('.', s) > 4) and (Pos('.', s) > (Pos('@', s) +1)) then
  begin
    Result := True;
    Exit;
  end;

  if (Pos('http:://', LowerCase(s)) > 0) or (Pos('ftp://', LowerCase(s)) > 0) and
     (Length(s) > 10) and (Pos('.', s) > 7) then
  begin
    Result := True;
    Exit;
  end;
end;

var
  selectText:String;
begin
  if(trim(self.rmemo_knowledge.SelText)='')then exit;
  selectText:=Trim(self.rmemo_knowledge.SelText);
  //
  OpenInIE(selectText);
  {
  if (IsUrl(selectText)) then
  begin
    OpenInIE(selectText);
  end
  else
    ShellExecute(0, nil, PChar(selectText), nil, nil, SW_NORMAL);
  }

end;

procedure TFrm_Main.N11Click(Sender: TObject);
begin
  self.winExecuteCommand(Trim(self.rmemo_knowledge.SelText));
end;

procedure TFrm_Main.N9Click(Sender: TObject);
var
  CurPoint:TPoint;
  Left,Top:integer;
begin
{
 GetCursorPos(P);//取得光标位置
     SetCursorPos(Round(p.x/10)*10,Round(p.y/5)*5);//光标移到10和5的
 ScreenToClient((SpaceGrid.ClientToScreen(Point(Left, Top))));
1.如果你的空件不是直接放在窗口上,而是放在其它容器空件(如Panel)上的,
  ScreenToClient和ControlAtPos都必须指定容器控件
2.ControlAtPos(a,false,false); 改为 ControlAtPos(a,false,TRUE);
}
  GetCursorPos(CurPoint);
  pnl_charactor.Show;
  //
  pnl_charactor.ControlAtPos(CurPoint,false,true);

end;

procedure TFrm_Main.mainTimerTimer(Sender: TObject);
begin
  if(isShowBalliconHint) then isShowBalliconHint:=false;
  if   Win32Platform   =   VER_PLATFORM_WIN32_NT   then   
  begin   //整理内存   
    SetProcessWorkingSetSize(GetCurrentProcess,   $FFFFFFFF,   $FFFFFFFF);   
  end;
end;

procedure TFrm_Main.btn_saveGridExecuteFileInfoClick(Sender: TObject);
begin
 {
  var
    iniFile: TIniFile;
    sPath:string;
    i:Integer;
  begin
    pnl_title.SetFocus;
    sPath:=ExtractFilePath(Application.ExeName)+TRQString.copyByFlag(ExtractFileName(Application.ExeName),'.',1)+'.ini';
    iniFile := TIniFile.Create(sPath);
    iniFile.WriteString('EXENAME','EXENAMEITEMS',inttostr(grid_ExecuteSoft.RowCount-1));
    for i:=1 to grid_ExecuteSoft.RowCount-1 do
    begin
      iniFile.WriteString('EXENAME','EXENAME'+inttostr(i),grid_ExecuteSoft.Cells[1,I]);
      iniFile.WriteString('EXEFILE','EXEFILE'+inttostr(i),grid_ExecuteSoft.Cells[2,I]);
    end;
    iniFile.UpdateFile;
    iniFile.Free;
  end;
  }
end;

procedure TFrm_Main.N16Click(Sender: TObject);
begin
  rmemo_knowledge.SelText:='';
end;

procedure TFrm_Main.btn_splitShowHideClick(Sender: TObject);
begin
  pnl_left.Visible:=not pnl_left.Visible;
  if pnl_left.Visible then
    TSpeedButton (Sender).Caption:='<'
  else
    TSpeedButton (Sender).Caption:='>';
end;

procedure TFrm_Main.ToolButton1Click(Sender: TObject);
begin
  pnl_left.Visible:=not pnl_left.Visible;
  if pnl_left.Visible then
    btn_splitShowHide.Caption:='<'
  else
    btn_splitShowHide.Caption:='>';
end;

procedure TFrm_Main.trv_KnowledgeChanging(TreeView: TfcCustomTreeView;
  Node: TfcTreeNode; var AllowChange: Boolean);
begin
  self.saveNoteContent(true);
  if(AllowChange) then
  begin
    self.setNodeImage(trv_Knowledge.Selected);
    setSelectNodeImage(Node);
  end;
end;

procedure TFrm_Main.trv_KnowledgeChange(TreeView: TfcCustomTreeView;
  Node: TfcTreeNode);
begin
  noteTreeNodeOnChange(trv_Knowledge,Node);
end;

procedure TFrm_Main.trv_KnowledgeEdited(TreeView: TfcCustomTreeView;
  Node: TfcTreeNode; var S: String);
var
  sId:String;
  reData:OleVariant;
begin
  //这里是已经修改了,并确定下来的;
  try
    if(S=Node.Text)then exit;
    sId := Self.trv_Knowledge.ID[Node];
    if(sId='')then
    begin
      S:=self.trv_Knowledge.NAME[Node];
      exit;
    end;
    reData := ConComm.update(' UPDATE '+self.ConNote_Knowledge.tableName+' SET NAME='+QuotedStr(S)+' WHERE ID='+QuotedStr(sId)).toVariant;
    if(reData[0]=0)then
      self.trv_Knowledge.NAME[Node]:=S
    else
    begin
      S:=self.trv_Knowledge.NAME[Node];
    end;
  except
     S:=self.trv_Knowledge.NAME[Node];
  end;
  self.lbl_note_title.Caption:=self.trv_Knowledge.Name[Node];
 
end;

procedure TFrm_Main.trv_NoteChange(TreeView: TfcCustomTreeView;
  Node: TfcTreeNode);
begin
  noteTreeNodeOnChange(trv_note,Node);
end;

procedure TFrm_Main.trv_NoteChanging(TreeView: TfcCustomTreeView;
  Node: TfcTreeNode; var AllowChange: Boolean);
begin
  self.saveNoteContent(true);
  if(AllowChange) then
  begin
    self.setNodeImage(trv_note.Selected);
    setSelectNodeImage(Node);
  end;
end;

procedure TFrm_Main.trv_NoteEdited(TreeView: TfcCustomTreeView;
  Node: TfcTreeNode; var S: String);
var
  sId:String;
  reData:OleVariant;
begin
  //这里是已经修改了,并确定下来的;
  try
    if(S=Node.Text)then exit;
    sId := self.trv_Note.ID[Node];
    if(sId='')then
    begin
      S:=self.trv_Note.NAME[Node];
      exit;
    end;
    reData := ConComm.update(' UPDATE '+self.trv_Note.stringValue+' SET NAME='+QuotedStr(S)+' WHERE ID='+QuotedStr(sId)).toVariant;
    if(reData[0]=0)then
      self.trv_Note.NAME[Node]:=S
    else
    begin
      S:=self.trv_Note.NAME[Node];
    end;
  except
     S:=self.trv_Note.NAME[Node];
  end;
  self.lbl_note_title.Caption:=self.trv_Note.Name[Node];


end;

procedure TFrm_Main.mniSetNoteNameClick(Sender: TObject);
var
  sSql:String;
  sParamCode,sParamValue:string;
begin
  sParamCode:='SHOWICON';
  sParamValue:=TRQFile.getFileName('ico|*.ico;ALL|*.*');

  if(sParamValue='') then exit;
  if( not FileExists(sParamValue) ) then
  begin
    TRQForms.alert('ICON文件"'+sParamValue+'"不存在!');
    Exit;
  end;

  //
  sSql:='SELECT PARAM_CODE FROM SYS_PARAMS_TAB WHERE GROUP_CODE=''SYSTRAY'' AND PARAM_CODE='''+sParamCode+''' ';
  if(Self.ConComm.getValue('PARAM_CODE',
   sSql)='') then
  begin
    sSql:=' INSERT INTO SYS_PARAMS_TAB (ID,GROUP_CODE,PARAM_CODE,PARAM_VALUE) '
      +' VALUES('''+sParamCode+''',''SYSTRAY'','''+sParamCode+''','''+sParamValue+''' )';
  end
  else
  begin
    sSql:=' UPDATE SYS_PARAMS_TAB SET PARAM_VALUE='''+sParamValue+''' '
      +' WHERE GROUP_CODE=''SYSTRAY'' AND PARAM_CODE='''+sParamCode+''' ';
  end;
  self.ConComm.update(sSql);

  Self.rqcltrycn1.Icon.LoadFromFile(sParamValue);
  Self.rqcltrycn1.IconVisible:=false;
  Self.rqcltrycn1.IconVisible:=true;
end;

procedure TFrm_Main.grideNodeNameInit;
var 
  vHead:TStrings;
  aaArray:T2DStringArray;
  sSql:string;
  rs:TResultSet;
  i:Integer;
begin
  rs:=TResultSet.Create(nil);
  try
  //  1       2        3         4       5        6        7
  // 列名|对应的字段|绑定的控件|列宽|对齐方式|列的格式|数据类型|
  SetLength(aaArray,2);
  TRQString.init2DStringArray(aaArray,2,7);//或是这个初始化二维数组;2,7

  SetLength(aaArray[0],7);
  aaArray[0][0]:='表名';      //名称
  aaArray[0][1]:='PARAM_CODE';//对应的字段名称;
  aaArray[0][2]:='';      //绑定的控件
  aaArray[0][3]:='100';      //列宽
  aaArray[0][4]:='1';      //对齐方式
  aaArray[0][5]:='';      //列的格式
  aaArray[0][6]:='STR';      //数据类型

  SetLength(aaArray[1],7);
  aaArray[1][0]:='显示的名称';      //名称
  aaArray[1][1]:='PARAM_VALUE';//对应的字段名称;
  aaArray[1][2]:='edtTableName';      //绑定的控件
  aaArray[1][3]:='220';      //列宽
  aaArray[1][4]:='1';      //对齐方式
  aaArray[1][5]:='';      //列的格式
  aaArray[1][6]:='STR';      //数据类型

  vHead:=TStringList.Create;
  TRQForms.converArrayToStrings(aaArray,vHead,'|');
  TRQForms.setGridEditHead(self.grideNodeName,vHead,1);
  vHead.Free;
  grideNodeName.Editing:=True;


  self.grideNodeName.Cells[0,1]:='MY_KNOWLEDAGE';
  self.grideNodeName.AddRow();
  self.grideNodeName.Cells[0,2]:='NOTE_TREE';
  self.grideNodeName.AddRow();
  self.grideNodeName.Cells[0,3]:='MY_ENGLISH';
  self.grideNodeName.AddRow();
  self.grideNodeName.Cells[0,4]:='MY_DELPHI';
  self.grideNodeName.AddRow();
  self.grideNodeName.Cells[0,5]:='MY_JAVA';
  self.grideNodeName.AddRow();
  self.grideNodeName.Cells[0,6]:='MY_C';
  self.grideNodeName.AddRow();
  self.grideNodeName.Cells[0,7]:='MY_STUDY_EXAM';

  //
  sSql:=' SELECT PARAM_CODE,PARAM_VALUE FROM SYS_PARAMS_TAB WHERE GROUP_CODE=''NOTE_TABLE'' ';
  ConComm.getData(rs,sSql);
  //
  for i:=0 to grideNodeName.RowCount-1 do
  begin
    //
    if(rs.Locate('PARAM_CODE',grideNodeName.Cells[0,i]))then
    begin
      grideNodeName.Cells[1,i]:=rs['PARAM_VALUE'];
    end;
  end;
  //
  noteSelectMenuInit();
  finally
    rs.Free;
  end;
end;

procedure TFrm_Main.btnCancelClick(Sender: TObject);
begin
 self.rqpnlSetParams.Hide;
end;

procedure TFrm_Main.btnSetClick(Sender: TObject);
var
  sSql:String;
  i:integer;
begin
  sSql:=' SELECT TOP 1 * FROM SYS_PARAMS_TAB WHERE 1=1 ';
  try
    i:=ConComm.query(sSql).result_code;
  except

  end;
  if(i<>0) then
  begin
    //
    sSql:=' CREATE TABLE SYS_PARAMS_TAB(       '
       +'   ID          VARCHAR(30),    '
       +'   GROUP_CODE        VARCHAR(30),    '
       +'   GROUP_NAME        VARCHAR(255),   '
       +'   PARAM_CODE        VARCHAR(30),    '
       +'   PARAM_NAME        VARCHAR(255),   '
       +'   PARAM_VALUE       VARCHAR(255),   '
       +'   PARENT_GROUP_CODE VARCHAR(30),    '
       +'   PARENT_PARAM_CODE VARCHAR(30),    '
       +'   STATUS          VARCHAR(30)     '
       +' )          ';

    ConComm.update(sSql);

  end;


  for i:=1 to self.grideNodeName.RowCount-1 do
  begin
    updateNoteName(grideNodeName.Cells[0,i],grideNodeName.cells[1,i]);
  end;

  self.noteSelectMenuInit;
end;

procedure TFrm_Main.updateNoteName(sParamCode, sParamValue: string);
var
  sSql:String;
begin
  sSql:='SELECT PARAM_CODE FROM SYS_PARAMS_TAB WHERE GROUP_CODE=''NOTE_TABLE'' AND PARAM_CODE='''+sParamCode+''' ';
  if(Self.ConComm.getValue('PARAM_CODE',
   sSql)='') then
  begin
    sSql:=' INSERT INTO SYS_PARAMS_TAB (ID,GROUP_CODE,PARAM_CODE,PARAM_VALUE) '
      +' VALUES('''+sParamCode+''',''NOTE_TABLE'','''+sParamCode+''','''+sParamValue+''' )';
  end
  else
  begin
    sSql:=' UPDATE SYS_PARAMS_TAB SET PARAM_VALUE='''+sParamValue+''' '
      +' WHERE GROUP_CODE=''NOTE_TABLE'' AND PARAM_CODE='''+sParamCode+''' ';
  end;
  self.ConComm.update(sSql);
end;

procedure TFrm_Main.trv_NoteEndDrag(Sender, Target: TObject; X,
  Y: Integer);
var
  oldSourceParentNode,nodeSource,nodeDesc:TfcTreeNode;
begin
  nodeSource:=trv_Note.Selected;  //得被拖动的标题
  nodeDesc:=trv_Note.GetNodeAt(X,Y);  //得坐标处标题
  oldSourceParentNode :=nodeSource.Parent;
  //self.lbl_note_title.Caption:='[源节点ID]:'+trv_note..ID[nodeSource]+' [源节点LEVEL]'+inttostr(nodeSource.Level);
  if nodeDesc<>nodeSource then
    if nodeDesc=nil then
    begin
      nodeSource.MoveTo(trv_Note.Items.GetFirstNode,fcnaAdd);
    end
    else
      nodeSource.MoveTo(nodeDesc,fcnaAddChild);
   //self.Caption:='[源节点ID]:'+trv_note..ID[nodeSource]+' [源节点LEVEL]'+inttostr(nodeSource.Level);
   //如果失败就直接退出;
   if not self.saveNoteTreeNodeLevelId(trv_Note,nodeSource) then exit;
   setNodeImage(oldSourceParentNode);
   setNodeImage(nodeDesc);
end;

procedure TFrm_Main.ToolButton2Click(Sender: TObject);
begin
  if(self.plst_left.PageIndex=0) then
    self.plst_left.PageIndex:=1
  else
    self.plst_left.PageIndex:=0;
end;

procedure TFrm_Main.noteSelectMenuInit;
var
  menuItem:TMenuItem;
  index: Integer;

  procedure setMenuCaptionHint(miItem:TMenuItem;sCaption,sHint:String);
  begin
    miItem.Caption:=sCaption;
    miItem.Hint:=sHint;
  end;

begin
  pm1.Items.Clear;
  for index := 0 to 6 do
  begin
    menuItem := TMenuItem.Create(pm1); // create the new item
    pm1.Items.Add(menuItem);// add it to the Popupmenu

    case Index of
      0:setMenuCaptionHint(menuItem,self.grideNodeName.Cells[1,2],self.grideNodeName.Cells[0,2]);
      1:setMenuCaptionHint(menuItem,self.grideNodeName.Cells[1,1],self.grideNodeName.Cells[0,1]);
      2:setMenuCaptionHint(menuItem,self.grideNodeName.Cells[1,3],self.grideNodeName.Cells[0,3]);
      3:setMenuCaptionHint(menuItem,self.grideNodeName.Cells[1,4],self.grideNodeName.Cells[0,4]);
      4:setMenuCaptionHint(menuItem,self.grideNodeName.Cells[1,5],self.grideNodeName.Cells[0,5]);
      5:setMenuCaptionHint(menuItem,self.grideNodeName.Cells[1,6],self.grideNodeName.Cells[0,6]);
      6:setMenuCaptionHint(menuItem,self.grideNodeName.Cells[1,7],self.grideNodeName.Cells[0,7]);
    end;
    menuItem.Tag := index;
    menuItem.OnClick := self.menuSelectNodeClick;// assign it an event handler
  end;
end;

procedure TFrm_Main.btn1Click(Sender: TObject);
begin
  self.rqpnlSetParams.Show;
end;

procedure TFrm_Main.rqcltrycn1Click(Sender: TObject);
begin
  if self.Visible then
  begin
    rqcltrycn1.ShowMainForm;
    Application.BringToFront;  
    self.SelectFirst;
  end;
end;

procedure TFrm_Main.N17Click(Sender: TObject);
begin
  close;
end;

procedure TFrm_Main.rqcltrycn1MouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
  if(not isShowBalliconHint)then
  begin
    isShowBalliconHint:=self.rqcltrycn1.ShowBalloonHint('海豪-"'+self.Caption+'":','一定要努力坚强!',bitWarning,10);
  end;
end;

procedure TFrm_Main.rqcltrycn1DblClick(Sender: TObject);
begin
  if self.Visible then
  begin
    rqcltrycn1.HideMainForm;
  end
  else
  begin
    rqcltrycn1.ShowMainForm;
    Application.BringToFront;
    self.SelectFirst;
  end;
end;

procedure TFrm_Main.btn2Click(Sender: TObject);
begin
  self.rqcltrycn1.HideMainForm;
end;

procedure TFrm_Main.trv_KnowledgeDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  //
end;

procedure TFrm_Main.trv_KnowledgeDragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  //
end;

procedure TFrm_Main.ToolButton3Click(Sender: TObject);
begin
  wordwrapChange();
end;

procedure TFrm_Main.wordwrapChange;
begin
  self.rmemo_knowledge.WordWrap:=not self.rmemo_knowledge.WordWrap;
  mni_knowledge_content_wordwrap.Checked:=self.rmemo_knowledge.WordWrap;
  ToolButton3.Down:=self.rmemo_knowledge.WordWrap;
end;

end.
nxfbccu 34015 2008/5/6 10:24:30
强烈要求楼主发源码!
xuzhenbin11 33923 2008/4/28 9:24:38
 发一份NoteBook的源码
zhaozhh1 33916 2008/4/27 19:31:01
1.解压后将delphi.qi改为delphi.mdb
2.运行notebook.exe
3.在登陆画面中点---连接服务器
4.在数据库名中选择1中改名的delphi.mdb
5.确定-----登陆
qqhbb0207 33904 2008/4/27 11:55:08
可以用的,拿来做笔记很实用,不过有些bug,希望ruiki能提供NoteBook.exe源码
我的NoteBook.ini配置如下:
[DBServer]
Server Name=
Server Type=MSACCESS
User Name=
Password=1M053E3F3C3D3I3J3G3H363734353A3B3839
DBName=delphi.qi
[SysSet]
AppPath=
[LOGINSET]
USERID=001
xlbly 33903 2008/4/27 8:23:38
假的,没有后台数据库
dejoy 33900 2008/4/27 1:18:25
老大啊,需要用户名和密码才能进去啊,不提供密码么还放上来做什么啊?
userz 33897 2008/4/26 21:17:33
怎么不能用,这样的代码放上来干嘛?
kevinorg 33888 2008/4/26 15:42:06
怎么不好使呀,进不去!!
第一页 上一页 下一页 最后页 有 20 条纪录 共1页 1 - 20
 用户名:
 密 码:
自动登陆(30天有效)
 
  DELPHI盒子版权所有 1999-2023 V4.01 粤ICP备10103342号-1 更新RSS列表