Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.0.6Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 19

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

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-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° порядковый Π½ΠΎΠΌΠ΅Ρ€ Π΅Π³ΠΎ располоТСния Π² массивС, Π° Π·Π°Ρ‚Π΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ массив, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ это свойство: