Читать «Советы по Delphi. Версия 1.0.6» онлайн - страница 46

Валентин Озеров

0.7 сек. для сохранения 1000 элементов – ускорение около 3850%!!!

Примечание:

• Все операции выполнялись на медленной машине 486SX 33 Mгц, 20 Mб RAM.

• Если TreeView пуст, загрузка происходит за 1.5 секунды, плюс 1.5 секунды на стирание 1000 элементов (общее время загрузки составило 3 секунды). В этих условиях стандартный компонент TTreeView показал общее время 129.5 секунд. Очистка компонента осуществлялась вызовом функции SendMessage(hwnd, TVM_DELETEITEM, 0, Longint(TVI_ROOT)).

Проведите несколько приятных минут, развлекаясь с компонентом.

unit HETreeView;

{$R-}

// Описание: Реактивный TreeView

(*

TREEVIEW:

 128 сек. для загрузки 1000 элементов (без сортировки)*

 270 сек. для сохранения 1000 элементов (4.5 минуты!!!)

HETREEVIEW:

 1.5 сек. для загрузки 1000 элементов – ускорение около 850%!!! (2.3 секунды без сортировки = stText)*

 0.7 сек. для сохранения 1000 элементов – ускорение около 3850%!!!

NOTES:

 – Все операции выполнялись на медленной машине 486SX 33 Mгц, 20 Mб RAM.

 – * Если TTreeView пуст, загрузка происходит за 1.5 секунды,

 плюс 1.5 секунды на стирание 1000 элементов (общее время загрузки составило 3 секунды).

 В этих условиях стандартный компонент TreeView показал общее время 129.5 секунд.

 Очистка компонента осуществлялась вызовом функции

 SendMessage(hwnd, TVM_DELETEITEM, 0, Longint(TVI_ROOT)).

*)

interface

uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, CommCtrl, tree2vw;

type THETreeView = class(TTreeView)

private

FSortType: TSortType;

 procedure SetSortType(Value: TSortType);

protected

 function GetItemText(ANode: TTreeNode): string;

public

 constructor Create(AOwner: TComponent); override;

 function AlphaSort: Boolean;

 function CustomSort(SortProc: TTVCompare; Data: Longint): Boolean;

 procedure LoadFromFile(const AFileName: string);

 procedure SaveToFile(const AFileName: string);

 procedure GetItemList(AList: TStrings);

 procedure SetItemList(AList: TStrings);

 //Жирное начертание шрифта 'Bold' должно быть свойством TTreeNode, но...

 function IsItemBold(ANode: TTreeNode): Boolean;

 procedure SetItemBold(ANode: TTreeNode; Value: Boolean);

published

 property SortType: TSortType read FSortType write SetSortType default stNone;

end;

procedure Register;

implementation

function DefaultTreeViewSort(Node1, Node2: TTreeNode; lParam: Integer): Integer; stdcall;

begin

 {with Node1 do

  if Assigned(TreeView.OnCompare) then

  TreeView.OnCompare(Node1.TreeView, Node1, Node2, lParam, Result)

 else}

 Result:= lstrcmp(PChar(Node1.Text), PChar(Node2.Text));

end;

constructor THETreeView.Create(AOwner: TComponent);

begin

 inherited Create(AOwner);

 FSortType:= stNone;

end;

procedure THETreeView.SetItemBold(ANode: TTreeNode; Value: Boolean);

var

 Item: TTVItem; Template: Integer;

begin

 if ANode = nil then Exit;

 if Value then Template:= -1 else Template:= 0;

 with Item do begin

  mask:= TVIF_STATE;

  hItem:= ANode.ItemId;

  stateMask:= TVIS_BOLD;

  state:= stateMask and template;

 end;

 TreeView_SetItem(Handle, Item);

end;

function THETreeView.IsItemBold(ANode: TTreeNode): Boolean;