⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufolderproperty.pas

📁 一个基于不需引擎的文件管理系统,使用了许多界面比较好的控件
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -