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;
var
Item: TTVItem;
begin
Result:= False;
if ANode = nil then Exit;
with Item do begin
mask:= TVIF_STATE;
hItem:= ANode.ItemId;
if TreeView_GetItem(Handle, Item) then Result:= (state and TVIS_BOLD) <> 0;
end;
end;
procedure THETreeView.SetSortType(Value: TSortType);
begin
if SortType <> Value then begin
FSortType:= Value;
if ((SortType in [stData, stBoth]) and Assigned(OnCompare)) or (SortType in [stText, stBoth]) then AlphaSort;
end;
end;
procedure THETreeView.LoadFromFile(const AFileName: string);
var
AList: TStringList;
begin
AList:= TStringList.Create;
Items.BeginUpdate;
try
AList.LoadFromFile(AFileName);
SetItemList(AList);
finally
Items.EndUpdate;
AList.Free;
end;
end;
procedure THETreeView.SaveToFile(const AFileName: string);
var
AList: TStringList;
begin
AList:= TStringList.Create;
try
GetItemList(AList);
AList.SaveToFile(AFileName);
finally
AList.Free;
end;
end;
procedure THETreeView.SetItemList(AList: TStrings);
var
ALevel, AOldLevel, i, Cnt: Integer;
S: string;
ANewStr: string;
AParentNode: TTreeNode;
TmpSort: TSortType;
function GetBufStart(Buffer: PChar; var ALevel: Integer): PChar;
begin
ALevel:= 0;
while Buffer^ in [' ', #9] do begin
Inc(Buffer);
Inc(ALevel);
end;
Result:= Buffer;
end;
begin
//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² β Π² ΠΎΠ±ΡΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ΄ΠΎΡΠ»ΠΎ Π±Ρ Items.Clear, Π½ΠΎ ΡΠΆ ΠΎΡΠ΅Π½Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ
SendMessage(handle, TVM_DELETEITEM, 0, Longint(TVI_ROOT));
AOldLevel:= 0;
AParentNode:= nil;
//Π‘Π½ΡΡΠΈΠ΅ ΡΠ»Π°Π³Π° ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ
TmpSort:= SortType;
SortType:= stNone;
try
for Cnt := 0 to AList.Count-1 do begin
S:= AList[Cnt];
if (length(s) = 1) and (s[1] = chr($1a)) then break;
ANewStr:= GetBufStart(PChar(S), ALevel);
if (ALevel > AOldLevel) or (AParentNode = nil) then begin
if ALevel - AOldLevel > 1 then raise Exception.Create('ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ TreeNode');
end else begin
for i:= AOldLevel downto ALevel do begin
AParentNode:= AParentNode.Parent;
if (AParentNode = nil) and (i - ALevel > 0) then raise Exception.Create('ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ TreeNode');
end;
end;
AParentNode:= Items.AddChild(AParentNode, ANewStr);
AOldLevel:= ALevel;
end;
finally
//ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠ»Π°Π³ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈβ¦
SortType:= TmpSort;
end;
end;
procedure THETreeView.GetItemList(AList: TStrings);
var
i, Cnt: integer;
ANode: TTreeNode;
begin
AList.Clear;
Cnt:= Items.Count -1;
ANode:= Items.GetFirstNode;
for i:= 0 to Cnt do begin
AList.Add(GetItemText(ANode));
ANode:= ANode.GetNext;
end;
end;
function THETreeView.GetItemText(ANode: TTreeNode): string;
begin
Result:= StringOfChar(' ', ANode.Level) + ANode.Text;
end;
function THETreeView.AlphaSort: Boolean;
var
I: Integer;
begin
if HandleAllocated then begin
Result:= CustomSort(nil, 0);
end else Result:= False;
end;
function eView.CustomSort(SortProc: TTVCompare; Data: Longint): Boolean;
var
SortCB: TTVSortCB;
I: Integer;
Node: TTreeNode;
begin
Result:= False;
if HandleAllocated then begin
with SortCB do begin
if not Assigned(SortProc) then lpfnCompare:= @DefaultTreeViewSort
else lpfnCompare:= SortProc;
hParent:= TVI_ROOT;
lParam:= Data;
Result:= TreeView_SortChildrenCB(Handle, SortCB, 0);
end;
if Items.Count > 0 then begin
Node:= Items.GetFirstNode;
while Node <> nil do begin
if Node.HasChildren then Node.CustomSort(SortProc, Data);
Node:= Node.GetNext;
end;
end;
end;
end;
//Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
procedure Register;
begin
RegisterComponents('Win95', [THETreeView]);
end;
end.
Π Π°Π·Π½ΠΎΠ΅
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Var
MyButton: TButton;
MyButton:= TButton.Create(MyForm); // MyForm ΡΠ΅ΠΏΠ΅ΡΡ "ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ" MyButton
with MyButton do BEGIN
Parent:= MyForm; // ΠΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ. MyForm "ΡΡΡΠ½ΠΎΠ²Π»ΡΠ΅Ρ" MyButton
height:= 32;
width:= 128;
caption:= 'Π― Π·Π΄Π΅ΡΡ!';
left := (MyForm.ClientWidth β width) div 2;
top := (MyForm.ClientHeight β height) div 2;
END;
Inprise ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π»Π° ΠΎΠ± ΡΡΠΎΠΌ Π² Π²ΡΠΏΡΡΠΊΠ°Ρ TechInfo.
ΠΠΎΠΈΡΠΈΡΠ΅
ti2938.asc Creating Dynamic Components at Runtime
Π½Π° ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎΠΌ WWW ΠΈΠ»ΠΈ FTP ΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Inprise.
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π² ΡΠΏΠΈΡΠΊΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ
ΠΠ½Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ prjexp.dll, Π½ΠΎ Π±Π΅Π· ΡΡΠΏΠ΅Ρ Π°. Π£ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ Π΅ΡΡΡ ΠΈΠ΄Π΅ΠΈ?
ΠΡΡΡ ΡΠ°ΠΊΠ°Ρ ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠ΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈΡΠΊΠΎΠΌΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΡΠΎΡΠ»Π° ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΡΠ΅ΡΡΡ ΠΈ Π²ΠΏΠΎΠ»Π½Π΅ ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½Π°.
{ ΡΡΠ½ΠΊΡΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΈΡΠΊΠΎΠΌΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π²
ΡΠΏΠΈΡΠΊΠ΅ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ; Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ β1 ΠΏΡΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° }
function IndexInParent(vControl: TControl): integer;
var
ParentControl: TWinControl;
begin
{Π΄Π΅Π»Π°Π΅ΠΌ "ΡΠ»Π΅ΠΏΠΎΠΊ" ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΡΠ΅ΡΠ΅Π· Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ }
ParentControl:= TForm(vControl.Parent);
if (ParentControl <> nil) then begin
for Result:= 0 to ParentControl.ControlCount - 1 do begin
if (ParentControl.Controls[Result] = vControl) then exit;
end;
end;
{ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΆ ΠΏΠΎΠΏΠ°Π»ΠΈ Π² ΡΡΠΎ ΠΌΠ΅ΡΡΠΎ, ΡΠΎ Π»ΠΈΠ±ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, Π»ΠΈΠ±ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π΅ ΠΈΠΌΠ΅Π» ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ }
Result:= β1;
end;
ΠΠ°ΡΡΠΈΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²β¦
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²? ΠΠ»Ρ ΠΏΠΎΠΊΠ°Π·Π° ΡΡΠ°ΡΡΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½Π°Π±ΠΎΡ LED-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΈ Ρ ΠΎΡΠ΅Π» Π±Ρ ΠΈΠΌΠ΅ΡΡ ΠΊ Π½ΠΈΠΌ Π΄ΠΎΡΡΡΠΏ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ°ΡΡΠΈΠ².
ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΌΠ°ΡΡΠΈΠ²:
LED: array[1..10] of TLed; (10 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° TLed)
ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ LED-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΎΡΠ³Π°Π½ΠΈΠ·ΡΠΉΡΠ΅ ΡΠΈΠΊΠ», ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π½ΠΈΠΆΠ΅:
for counter:= 1 to 10 do begin
LED[counter]:= TLED.Create;
LED[counter].top:= β¦
LED[counter].Left:= β¦
LED[counter].Parent:= Mainform; {ΡΡΠΎ-ΡΠΎ ΡΠΈΠΏΠ° ΡΡΠΎΠ³ΠΎ}
end;
ΠΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠΆΠ΅ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ Π½Π° ΡΠΎΡΠΌΠ΅ (Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ), ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ°ΠΊ:
leds:= 0;
for counter:= 0 to Form.Componentcount do begin
if (components[counter] is TLED) then begin
inc(leds);
LED[leds]:= TLED(components[counter]);
end
end;
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Ρ Π½Π°Ρ ΠΏΠΎΠ»ΡΡΠΈΠ»ΡΡ ΠΌΠ°ΡΡΠΈΠ² ΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ LED-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². Π― ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Π½Π°Π·Π½Π°ΡΠΈΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Ρ Tag ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ LED-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ Π΅Π³ΠΎ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅, Π° Π·Π°ΡΠ΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΈΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ: