?? mainfun.~pas
字號:
//---------------------------------------------------------------------------
//(R)CopyRight KivenSoft International ,inc 1999
//單元名稱:主窗口附屬單元
//程序名稱:電子書庫
//作 者:李會文
//開始時間:1997.07.01
//最后修改:1999.07.15
//備注:此單元定義了主窗口一些實用函數段
//---------------------------------------------------------------------------
unit MainFun;
interface
function SaveItem:boolean; //儲存當前節點的變動內容
function SaveIndex:boolean; //儲存變動后的索引內容
function SaveSrm:boolean; //保存主窗口中的數據庫
function CloseSrm:boolean; //關閉數據庫
function CloseSrmQuery:boolean; //是否保存對數據庫的改動
function OpenSrm(Fn:string):boolean; //打開數據庫文件在主窗口中并裝入索引
function BrowseFolder:string; //目錄瀏覽,返回被選擇的目錄,空為無選擇
function GetLastPathName(var Pn:string):string;//提取最后的路徑名
procedure SetOpenSrmWithApp(Value:boolean);//在注冊表文件中設置SRM文件關聯或取消
procedure ImportDir(var Dir,Mask:string); //引入目錄下文件
function FormatTreeNodeString(Value:string):string;
//格式化樹形視圖節點字符串防止無效字符
implementation
uses
Classes, SysUtils, Controls, Windows, Registry, Forms, ComCtrls, CommCtrl,
Messages, FileCtrl, ShlObj, MainUnit, SrmConst, SrmUnit, InputPw, RegUnit;
//儲存當前節點的變動內容--------------------------------------
function SaveItem:boolean;
var
Ms:TMemoryStream;
pInt:^integer;
begin
Result:=true;
if Srm=nil then Exit;
with SrmForm do
begin
if TreeView.Selected=nil then Exit; //要保存的節點為空時退出
if (Srm.ItemHeadChanged) or (TreeView.Selected.Data=pointer(-1)) then
//標題屬性有改變或是新增節點時
with Srm.DataHead do
begin
ContextAuthorEdit.GetTextBuf(Author,16);
ContextPasswordEdit.GetTextBuf(Password,12);
ContextIndexEdit.GetTextBuf(SearchKey,52);
pInt:=@DataType;
pInt^:=TreeView.Selected.ImageIndex;
end;
if (RichEdit.Modified) or (TreeView.Selected.Data=pointer(-1)) then
//內容有改變或是新增節點時
begin
with Srm.DataHead do
if (RichEdit.GetTextLen<>0) then Num:=1 else Num:=0;
TreeView.Selected.Data:=pointer(Srm.AddItemHead);
Srm.IndexChanged:=true; //索引改變
if RichEdit.GetTextLen<>0 then
begin
Ms:=TMemoryStream.Create;
Ms.SetSize(RichEdit.GetTextLen+1);
RichEdit.GetTextBuf(Ms.Memory,Ms.Size);
Srm.AddItemData(Ms);
Ms.Free;
end;
end;
if (Srm.ItemHeadChanged) and (not Srm.ItemDataChanged) and
(not RichEdit.Modified) then //已有節點屬性改變但內容不變時
begin
Srm.EditItemHead(integer(TreeView.Selected.Data));
end;
RichEdit.Modified:=false; //置相應的標志復位
Srm.ItemHeadChanged:=false;
Srm.ItemDataChanged:=false;
end;
end;
//儲存變動后的索引內容-----------------------------------
function SaveIndex:boolean;
var
Msh,Msd:TMemoryStream;
i,n:integer;
p:PTreeData;
AList:TStringList;
ANode:TTreeNode;
begin
Result:=true;
if Srm=nil then Exit;
if not Srm.IndexChanged then Exit; //索引沒改變時
Msh:=TMemoryStream.Create;
Msd:=TMemoryStream.Create;
AList:=TStringList.Create;
Msd.SetSize(sizeof(TTreeData)*SrmForm.TreeView.Items.Count);
p:=Msd.Memory;
n:=SrmForm.TreeView.Items.Count -1;
ANode:=SrmForm.TreeView.Items.GetFirstNode;
with ANode do
begin
for i:=0 to n do //添加相應級別的TAB字符
begin
AList.Add(StringOfChar(#9,Level)+Text);
p^.Pos:=integer(Data);
p^.DataType:=ImageIndex;
ANode:=GetNext;
p:=pointer(integer(p)+sizeof(TTreeData));
end;
end;
AList.SaveToStream(Msh);
AList.Free;
Srm.SaveIndex(Msh,Msd);
Srm.IndexChanged:=false;
Msh.Free;
Msd.Free;
end;
//保存主窗口中的數據庫-------------------------------------
function SaveSrm:boolean;
begin
Result:=true;
if Srm=nil then Exit;
SaveItem;
SaveIndex;
if Srm.DbChanged then //如果數據庫屬性有變動
begin
with Srm.FileHead,SrmForm do
begin
DbAuthorEdit.GetTextBuf(Author,16);
DbPasswordEdit.GetTextBuf(Password,12);
Srm.SaveSrmFile;
Srm.IndexChanged:=false;
Srm.DbChanged:=false;
end;
end;
end;
//關閉數據庫-------------------------------------------
function CloseSrm:boolean;
begin
Result:=true;
if Srm<>nil then
begin
SaveSrm;
Srm.Free;
Srm:=nil;
end;
with SrmForm.TreeView do //清空樹形視圖
begin
SendMessage(Handle,TVM_SELECTITEM,TVGN_CARET,LPARAM(0));
SendMessage(Handle,WM_SETREDRAW,0,0);
//禁止重繪
SendMessage(Handle, TVM_DELETEITEM, 0, Longint(TVI_ROOT));
//刪除所有節點
SendMessage(Handle,WM_SETREDRAW,-1,0);
//允許重繪
Selected:=nil;
end;
with SrmForm do //編輯框和其它的清空
begin
RichEdit.Text:='';
DbAuthorEdit.Text:='';
DbPasswordEdit.Text:='';
DbBuildDateEdit.Text:='';
DbEditDateEdit.Text:='';
ContextAuthorEdit.Text:='';
ContextPasswordEdit.Text:='';
ContextPubDateEdit.Text:='';
ContextIndexEdit.Text:='';
ContextTypeRadioGroup.ItemIndex:=-1;
end;
end;
//是否保存對數據庫的改動------------------------------------------
function CloseSrmQuery:boolean;
begin
Result:=true;
if Srm=nil then Exit; //沒有打開的數據文件
if not AppIni.DelRecordQuery then exit; //不提示即保存
if (SrmForm.RichEdit.Modified or Srm.ItemDataChanged or Srm.ItemHeadChanged or
Srm.IndexChanged or Srm.DbChanged) then
begin
case MessageBox(SrmForm.Handle,csSaveQuery,csAppName,MB_YESNOCANCEL or
MB_ICONQUESTION) of
IDYES:Result:=true;
IDNO:
begin
Result:=true;
SrmForm.RichEdit.Modified:=false;
Srm.ItemHeadChanged:=false;
Srm.ItemDataChanged:=false;
Srm.IndexChanged:=false;
Srm.DbChanged:=false;
end;
IDCANCEL:Result:=false;
end;
end;
end;
//打開數據庫文件在主窗口中并裝入索引--------------------------
function OpenSrm(Fn:string):boolean;
var
Ps,UserPs:string;
Msh,Msd:TMemoryStream;
i,j,n:integer;
p:PTreeData;
AList: TStringList;
ALevel,AOldLevel:integer;
AParentNode:TTreeNode;
StrBuf:PChar;
begin
Result:=true;
Application.ProcessMessages; //恢復原窗口
Srm:=TSrmObject.Create(Fn,fmOpenReadWrite);
{ if Srm.FileHead.Password[0]<>#0 then //密碼保護
begin
InPwForm:=TInPwForm.Create(SrmForm);
with InPwForm do
begin
Caption:=csAppName;
InputLabel.Caption:=csPasswordTitle;
if ShowModal=mrCancel then
begin
Srm.Free;
Srm:=nil;
Free;
Result:=false;
Exit;
end;
Ps:=Edit.Text;
UserPs:=string(Srm.FileHead.Password);
if Ps<>UserPs then
begin
if ModalResult<>mrCancel then
Application.MessageBox(csAppName,csPasswordError,MB_OK);
Srm.Free;
Srm:=nil;
Result:=false;
Free;
Exit;
end;
Free;
end;
end; }
Screen.Cursor:=crHourGlass;
Msh:=TMemoryStream.Create;
Msd:=TMemoryStream.Create;
Srm.LoadIndex(Msh,Msd); //裝入索引
AList := TStringList.Create;
SrmForm.TreeView.Items.BeginUpdate;
AList.LoadFromStream(Msh); //裝入到字符串列表中
SendMessage(SrmForm.TreeView.Handle, TVM_DELETEITEM, 0, Longint(TVI_ROOT));
AOldLevel := 0;
AParentNode := nil;
n:=AList.Count-1;
p:=Msd.Memory;
for i:=0 to n do //根據TAB的多少得到相應級別
begin
StrBuf:=PChar(AList.Strings[i]);
ALevel:=0;
while StrBuf^=#9 do //得該項所在層數
begin
Inc(StrBuf);
Inc(ALevel);
end;
if (ALevel<AOldLevel) or (AParentNode<>nil) then
begin //返回該項的上級節點
for j:=AOldLevel downto ALevel do
begin
AParentNode:=AParentNode.Parent;
end;
end;
AParentNode:=SrmForm.TreeView.Items.AddChildObject(AParentNode,StrBuf,
pointer(p.Pos));
AParentNode.ImageIndex:=p.DataType; //得該節點類型
AOldLevel:=ALevel;
p:=pointer(integer(p)+sizeof(TTreeData));
end;
SrmForm.TreeView.Items.EndUpdate;
AList.Free;
Msd.Free;
Msh.Free;
with Srm.FileHead,SrmForm do //顯示文件屬性
begin
DbAuthorEdit.Text:=String(Author);
DbPasswordEdit.Text:=String(Password);
DbBuildDateEdit.Text:=DateToStr(BuildDate);
DbEditDateEdit.Text:=DateToStr(EditDate);
end;
SrmForm.TreeView.Selected:=nil; //置當前選擇項為空
with Srm do
begin
DbChanged:=false; //數據庫變動標志復原
IndexChanged:=false; //索引變動標志復原
ItemHeadChanged:=false;
ItemDataChanged:=false;
end;
Screen.Cursor:=crDefault;
end;
//目錄瀏覽,返回被選擇的目錄,空為無選擇---------------------------
function BrowseFolder:string;
var
Info:TBrowseInfo;
Dir:array[0..260] of char;
ItemId:PItemIDList;
begin
with Info do
begin
hwndOwner:=SrmForm.Handle;
pidlRoot:=nil;
pszDisplayName:=nil;
lpszTitle:=csBrowseFolderInfo;
ulFlags:=0;
lpfn:=nil;
lParam:=0;
iImage:=0;
end;
ItemId:=SHBrowseForFolder(Info);
if ItemId<>nil then
begin
SHGetPathFromIDList(ItemId,@Dir);
Result:=string(Dir);
end;
end;
//提取最后的路徑名----------------------------------------------
function GetLastPathName(var Pn:string):string;
var
Size:integer;
begin
Result:=Pn;
if Result[Length(Result)]='\' then Delete(Result,Length(Result),1);
repeat
Size:=Pos('\',Result);
if Size>0 then Delete(Result,1,Size);
until Size=0;
end;
//在注冊表文件中設置SRM文件關聯或取消-----------------------------
procedure SetOpenSrmWithApp(Value:boolean);
var
s:string;
begin
with TRegistry.Create do
begin
RootKey:=HKEY_CLASSES_ROOT;
s:=csSrmFileType;
if Value then //建立相應的鍵值
begin
OpenKey(s,true); //s:='\.srm'
Delete(s,1,2);
WriteString('',s); //:s='srm'
Insert('\',s,1);
OpenKey(s,true); //s:='\srm';
WriteString('',csSrmFileDescribe);
OpenKey(csSrmCommand,true);
WriteString('','"'+Application.ExeName+'" %1');
end
else //刪除相應的鍵值
begin
DeleteKey(s);
Delete(s,2,1);
DeleteKey(s); //s:='\srm'
end;
Free;
end;
end;
//從目錄中引入--------------------------------------------------------------
procedure ImportDir(var Dir,Mask:string);
var
SRec: TSearchRec;
ANode,OldNode:TTreeNode;
Path,Fn:string;
retval,oldlen:integer;
SubFlag,ItemFlag:boolean;
begin
Path:=Dir; //搜索路徑
oldlen := Length(Dir);
retval := FindFirst( Dir+Mask,faAnyFile,SRec);
ItemFlag:=true;
SubFlag:=true;
OldNode:=SrmForm.TreeView.Selected;
ANode:=nil;
While retval=0 Do
Begin
If (SRec.Attr and (faDirectory or faVolumeID)) = 0 Then //是文件
begin
Fn:=SRec.Name;
Delete(Fn,Length(Fn)-3,4);
if ItemFlag then
begin
ItemFlag:=false;
ANode:=SrmForm.TreeView.Items.AddChildObjectFirst
(SrmForm.TreeView.Selected,Fn,pointer(-1));
end
else
ANode:=SrmForm.TreeView.Items.AddObjectFirst
(SrmForm.TreeView.Selected,Fn,pointer(-1));
ANode.ImageIndex:=2; //初始化添加數據
with Srm.DataHead do
begin
DataType:=2;
Author[0]:=#0;
Password[0]:=#0;
end;
SrmForm.TreeView.Selected:=ANode;
SrmForm.RichEdit.Lines.LoadFromFile(Dir+SRec.Name);
end;
retval := FindNext(SRec);
End;
SysUtils.FindClose(SRec);
if not ItemFlag then SrmForm.TreeView.Selected:=ANode.Parent;
retval:=FindFirst(path+'*.*',faDirectory,SRec); //目錄搜索
While retval=0 Do
Begin
If (SRec.Attr and faDirectory)<>0 Then //是目錄
If (SRec.Name <> '.') and (SRec.Name <> '..') Then
Begin
Path:=Path+SRec.Name+'\';
if SubFlag then
begin
SubFlag:=false;
ANode:=SrmForm.TreeView.Items.AddChildObjectFirst
(SrmForm.TreeView.Selected,GetLastPathName(Path),
pointer(-1));
end
else
ANode:=SrmForm.TreeView.Items.AddObjectFirst
(SrmForm.TreeView.Selected,GetLastPathName(Path),
pointer(-1));
ANode.ImageIndex:=1;
with Srm.DataHead do
begin
DataType:=1;
Author[0]:=#0;
Password[0]:=#0;
end;
SrmForm.TreeView.Selected:=ANode;
SrmForm.RichEdit.Modified:=true;
ImportDir(path,mask);
Delete(path,oldlen+1,260);
End;
retval := FindNext(SRec);
End;
SysUtils.FindClose(SRec);
SrmForm.TreeView.Selected:=OldNode;
end;
//格式化樹形視圖節點字符串防止無效字符-----------------------------------
function FormatTreeNodeString(Value:string):string;
var
Ap,At:pchar;
begin
Value:=TrimLeft(Value);
Value:=TrimRight(Value);
Ap:=pchar(Value);
// while Ap^ in [#1..#32] do inc(Ap); //去掉開頭小于等于空格的字符
At:=Ap;
while At^<>#0 do
begin
if At^ in [#1..#31] then At^:=#32; //將小于空格的無效字符替換成空格
inc(At);
end;
Result:=string(Ap);
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -