📄 folderunit.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 + -