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

📄 folderunit.pas

📁 Outlook Express .dbx file reader
💻 PAS
字号:
unit FolderUnit;

{$WEAKPACKAGEUNIT ON}

interface

uses
  { Delphi }
  Windows, Contnrs;

type
  TFolderTree = class;

  TFolderTreeNode = class
  private
    FItems: TObjectList;
    FOwner: TFolderTree;
    FParent: TFolderTreeNode;
    FName: string;
    FDbxFileName: string;
    FFolderIndex: Cardinal;
    FUniqueIndex: Cardinal;
    FMessageCount: Integer;
    FUnreadMessageCount: Integer;
    function GetCount: Integer;
    function GetItems(Index: Integer): TFolderTreeNode;
    procedure SetParent(Value: TFolderTreeNode);
    procedure RemoveChild(AChild: TFolderTreeNode);
  public
    constructor Create(AOwner: TFolderTree);
    destructor Destroy; override;
    procedure AddChild(AChild: TFolderTreeNode);
    procedure Clear;
    property Owner: TFolderTree read FOwner;
    property Parent: TFolderTreeNode read FParent write SetParent;
    property Count: Integer read GetCount;
    property Items[Index: Integer]: TFolderTreeNode read GetItems; default;
    property Name: string read FName write FName;
    property DbxFileName: string read FDbxFileName write FDbxFileName;
    property FolderIndex: Cardinal read FFolderIndex write FFolderIndex;
    property UniqueIndex: Cardinal read FUniqueIndex write FUniqueIndex;
    property MessageCount: Integer read FMessageCount write FMessageCount;
    property UnreadMessageCount: Integer read FUnreadMessageCount write FUnreadMessageCount;
  end;

  TFolderTree = class
  private
    FItems: TFolderTreeNode;
  public
    constructor Create;
    destructor Destroy; override;
    function FindNode(AFolderIndex: DWORD): TFolderTreeNode;

    property Items: TFolderTreeNode read FItems;
  end;

implementation

uses
  { Delphi }
  SysUtils;

{ TFolderTree }

constructor TFolderTree.Create;
begin
  FItems := TFolderTreeNode.Create(Self);
end;

destructor TFolderTree.Destroy;
begin
  FreeAndNil(FItems);
  inherited Destroy;
end;

function TFolderTree.FindNode(AFolderIndex: DWORD): TFolderTreeNode;

  function FindInNode(ANode: TFolderTreeNode): TFolderTreeNode;
  var
    vIndex: Integer;
  begin
    Result := nil;
    if (ANode <> FItems) and (ANode.FolderIndex = AFolderIndex) then begin
      Result := ANode;
    end
    else begin
      vIndex := 0;
      while (Result = nil) and (vIndex < ANode.Count) do begin
        Result := FindInNode(ANode.Items[vIndex]);
        Inc(vIndex);
      end;
    end;
  end;

begin
  Result := FindInNode(FItems);
end;

{ TFolderTreeNode }

constructor TFolderTreeNode.Create(AOwner: TFolderTree);
begin
  FItems := TObjectList.Create(True);
  FOwner := AOwner;
  FParent := nil;
end;

destructor TFolderTreeNode.Destroy;
begin
  FreeAndNil(FItems);
  inherited Destroy;
end;

function TFolderTreeNode.GetCount: Integer;
begin
  Result := FItems.Count;
end;

function TFolderTreeNode.GetItems(Index: Integer): TFolderTreeNode;
begin
  Result := FItems[Index] as TFolderTreeNode;
end;

procedure TFolderTreeNode.AddChild(AChild: TFolderTreeNode);
begin
  if FItems.IndexOf(AChild) < 0 then begin
    FItems.Add(AChild);
    AChild.Parent := Self;
  end;
end;

procedure TFolderTreeNode.RemoveChild(AChild: TFolderTreeNode);
var
  vIndex: Integer;
begin
  vIndex := FItems.IndexOf(AChild);
  if vIndex >= 0 then begin
    FItems.OwnsObjects := False;
    try
      FItems.Delete(vIndex);
    finally
      FItems.OwnsObjects := True;
    end;
  end;
end;

procedure TFolderTreeNode.SetParent(Value: TFolderTreeNode);
begin
  if Value <> FParent then begin
    if FParent <> nil then FParent.RemoveChild(Self);
    FParent := Value;
    if FParent <> nil then FParent.AddChild(Self);
  end;
end;

procedure TFolderTreeNode.Clear;
begin
  FItems.Clear;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -