📄 ufolderproperty.pas
字号:
unit uFolderProperty;
interface
uses
Windows,Variants,Classes,Controls,Forms,Messages,ComCtrls,Dialogs,DB,ABSMain,
SysUtils,uPassword,uDllfrmList;
type
TFolderProperty=class
private
FNode:TTreeNode;
FText:string;
FCreateDate:string;
FIsReadOnly: Boolean;
FIsLocked: Boolean;
FFolderType: string;
FPassWordfrm: TPassWordfrm;
FFolderTree: TTreeView;
FNodeChanged: Boolean;
procedure SetAllSubNode(const ANode:TTreeNode;IsReadOnly,IsLocked,OnlyOne:Boolean);
function ShowPWSfrm:Boolean;
function ShowUPWSfrm:Boolean;
function GetPosition(var Position: string; ANode: TTreeNode): string;
function GetPath:string;
procedure SetText(const Value: string);
function GetText:string;
procedure SetNode(const Value: TTreeNode);
procedure GetFolderInfo;
procedure SetIsReadOnly(const Value: Boolean);
procedure SetIsLocked(const Value: Boolean);
function GetFolderCount:integer;
function GetSubFolders:string;
procedure SetFolderTree(const Value: TTreeView);
function GetIsFile:byte;
function NodeIsFile(ID:integer):byte;
public
procedure LockedFolder;
procedure UnLockedFolder;
function EnterFolder:Boolean;
function DelFolder(ANode:TTreeNode):Boolean;
procedure FindNodeByID(ID:integer);
function SetFolderName(ANode:TTreeNode;IsFile:byte):string;
property Node:TTreeNode read FNode write SetNode;
property Path:string read GetPath;
property Text:string read GetText write SetText;
property CreateDate:string read FCreateDate;
property IsReadOnly:Boolean read FIsReadOnly write SetIsReadOnly;
property IsLocked:Boolean read FIsLocked write SetIsLocked;
property IsFile:byte read GetIsFile;
property FolderType:string read FFolderType;
property FolderCount:integer read GetFolderCount;
property SubFolders:string read GetSubFolders;
property FolderTree:TTreeView read FFolderTree write SetFolderTree;
property NodeChanged:Boolean read FNodeChanged;
end;
implementation
uses uSECData, uMain;
{ TFolderProperty }
function TFolderProperty.GetFolderCount: integer;
begin
result:=FNode.Count;
end;
procedure TFolderProperty.GetFolderInfo;
var
s:string;
FQuery:TABSQuery;
begin
if NodeIsFile(Node.StateIndex)=1 then
FFolderType :='文件'
else
FFolderType :='文件夹';
FQuery:=TABSQuery.Create(nil);
try
FQuery.DatabaseName :=SECData.ABSDatabase1.DatabaseName;
FQuery.SQL.Text :='select CreateDate,ReadOnly,Locked from folders where ID=:ID';
FQuery.ParamByName('ID').AsInteger :=FNode.StateIndex;
FQuery.Open;
DateTimeToString(s,'dddddd tt',FQuery.fieldbyname('CreateDate').AsDateTime);
FCreateDate :=s;
FIsReadOnly :=Boolean(FQuery.fieldbyname('ReadOnly').AsInteger);
FIsLocked :=Boolean(FQuery.fieldbyname('Locked').AsInteger);
FQuery.Close;
finally
FQuery.Free;
end;
end;
function TFolderProperty.GetPath: string;
var
Position:string;
begin
result:=GetPosition(Position,FNode);
end;
function TFolderProperty.GetPosition(var Position: string;ANode:TTreeNode): string;
begin
Position:='\'+Position;
if ANode.Parent=nil then
begin
result:=Position;
exit;
end;
Position:=ANode.Parent.Text+Position;
ANode:=ANode.Parent;
GetPosition(Position,ANode);
result:=Position;
end;
function TFolderProperty.GetSubFolders: string;
var
FolderNums,FileNums:integer;
procedure GetAllSubNode(ANode:TTreeNode);
var
i:integer;
begin
for i:=0 to ANode.Count-1 do
begin
if NodeIsFile(ANode.Item[i].StateIndex)=1 then
inc(FileNums)
else
inc(FolderNums);
GetAllSubNode(ANode.Item[i]);
end;
end;
begin
FolderNums:=0;
FileNums:=0;
if NodeIsFile(FNode.StateIndex)=1 then
result:=''
else
begin
GetAllSubNode(FNode);
result:=inttostr(FolderNums)+'个文件夹 '+inttostr(FileNums)+'个文件';
end;
end;
function TFolderProperty.GetText: string;
begin
result:=FNode.Text;
end;
procedure TFolderProperty.LockedFolder;
begin
if ShowPWSfrm then
begin
SetAllSubNode(FNode,FIsReadOnly,True,True);
FIsLocked:=true;
end;
end;
procedure TFolderProperty.SetAllSubNode(const ANode: TTreeNode;IsReadOnly,IsLocked,OnlyOne:Boolean);
var
FQuery:TABSQuery;
i:integer;
begin
if ANode<>nil then
begin
FQuery:=TABSQuery.Create(nil);
try
FQuery.DatabaseName:=SECData.ABSDatabase1.DatabaseName;
FQuery.SQL.Text:='Update folders set '+#13+
'ReadOnly=case 1 when :a1 then :ReadOnly else ReadOnly end,'+#13+
'Locked=case 1 when :a2 then :Locked else Locked end'+#13+
'where ID=:ID';
FQuery.ParamByName('ReadOnly').AsInteger :=integer(IsReadOnly);
FQuery.ParamByName('Locked').AsInteger :=integer(IsLocked);
FQuery.ParamByName('ID').AsInteger :=ANode.StateIndex;
FQuery.ParamByName('a1').AsInteger :=0;
FQuery.ParamByName('a2').AsInteger :=0;
if FIsReadOnly<>IsReadOnly then
begin
FQuery.ParamByName('a1').AsInteger :=1;
FQuery.ParamByName('a2').AsInteger :=0;
end;
if FIsLocked<>IsLocked then
begin
FQuery.ParamByName('a2').AsInteger :=1;
FQuery.ParamByName('a1').AsInteger :=0;
if IsLocked then
begin
ANode.ImageIndex:=ANode.ImageIndex+1;
ANode.SelectedIndex:=ANode.SelectedIndex+1;
end
else
begin
ANode.ImageIndex:=ANode.ImageIndex-1;
ANode.SelectedIndex:=ANode.SelectedIndex-1;
end;
end;
FQuery.ExecSQL;
finally
FQuery.Free;
end;
end;
if not OnlyOne then
for i:=0 to ANode.Count-1 do
SetAllSubNode(ANode.Item[i],IsReadOnly,IsLocked,OnlyOne);
end;
procedure TFolderProperty.SetIsLocked(const Value: Boolean);
begin
if FIsLocked<>value then
begin
SECData.ABSDatabase1.StartTransaction;
try
if Value then
begin
if not ShowPWSfrm then
begin
SECData.ABSDatabase1.Rollback;
exit;
end;
end
else
begin
if not ShowUPWSfrm then
begin
SECData.ABSDatabase1.Rollback;
exit;
end;
end;
SetAllSubNode(FNode,IsReadOnly,value,True);
FIsLocked := Value;
SECData.ABSDatabase1.Commit;
except
raise;
SECData.ABSDatabase1.Rollback;
SetAllSubNode(FNode,IsReadOnly,not value,True);
FIsLocked := not Value;
end;
end;
end;
procedure TFolderProperty.SetIsReadOnly(const Value: Boolean);
begin
if FIsReadOnly <> Value then
begin
SetAllSubNode(FNode,value,IsLocked,False);
FIsReadOnly := Value;
end;
end;
procedure TFolderProperty.SetNode(const Value: TTreeNode);
begin
FNodeChanged:=FNode<>Value;
FNode:=Value;
GetFolderInfo;
end;
procedure TFolderProperty.SetText(const Value: string);
begin
FText := Value;
if FText<>FNode.Text then
begin
mainfrm.FolderTreeEdited(nil,FNode,FText);
FNode.Text:=FText;
end;
end;
function TFolderProperty.ShowPWSfrm:Boolean;
var
FQuery:TABSQuery;
begin
FPassWordfrm:=TPassWordfrm.Create(nil);
try
if FPassWordfrm.ShowModal=mrOK then
begin
FQuery:=TABSQuery.Create(nil);
try
FQuery.DatabaseName:=SECData.ABSDatabase1.DatabaseName;
FQuery.SQL.Text:='update folders'+#13+
'set PWS=:Password'+#13+
'where ID=:ID';
FQuery.ParamByName('Password').AsString:=FPassWordfrm.edNewPws.Text;
FQuery.ParamByName('ID').AsInteger:=FNode.StateIndex;
FQuery.ExecSQL;
finally
FQuery.Free;
result:=true;
end;
end
else
result:=false;
finally
FPassWordfrm.Close;
freeandnil(FPassWordfrm);
end;
end;
function TFolderProperty.ShowUPWSfrm: Boolean;
var
FQuery:TABSQuery;
begin
FPassWordfrm:=TPassWordfrm.Create(nil);
try
FPassWordfrm.Label2.Caption :='输入密码:';
FPassWordfrm.Label3.Visible :=false;
FPassWordfrm.edNewPwsAgn.Visible :=false;
FPassWordfrm.Height:=FPassWordfrm.Height-FPassWordfrm.edNewPwsAgn.Height-8;
if FPassWordfrm.ShowModal=mrOK then
begin
FQuery:=TABSQuery.Create(nil);
try
FQuery.DatabaseName:=SECData.ABSDatabase1.DatabaseName;
FQuery.SQL.Text:='select ID from folders'+#13+
'where ID=:ID'+#13+
'and PWS=:Password';
FQuery.ParamByName('Password').AsString:=FPassWordfrm.edNewPws.Text;
FQuery.ParamByName('ID').AsInteger:=FNode.StateIndex;
FQuery.Open;
result:=not FQuery.IsEmpty;
if not result then
begin
MessageBox(Application.Handle,'密码错误。', '提示', MB_ICONWARNING or MB_OK);
exit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -