Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rento

Classe de arvore (código completo)

Recommended Posts

Para quem não entendeu o titulo, é como se fosse uma arvore genealógica.

Você está livre para utilizar este código e/ou alterar.

 

1º - Crie um arquivo com o nome "unProjFile.pas" (este nome pode ser mudado, mas será este para facilitar o tutorial)

2º - Abra o arquivo, e cole o seguinte código:

CODE
unit unProjFile;

interface

uses
  SysUtils, Classes, dialogs;

type
   TArq = class;
   TArqs = class;
   TArq = class(TCollectionItem)
   public
	  Owner: Pointer;
	  arqs: TArqs;
	  Text: string;
   end;
   
   TArqs = class(TCollection)
   private
	  function GetItem(Index: Integer): TArq;
   public
	  arqs: TArq;
	  function Add(pArq: TArq): TArq;
	  property Item[Index: Integer]: TArq read GetItem;
	  procedure Remove(ed: TArq);
   end;
   procedure montaAlgoeMostra();

implementation

var
  pMain: TArqs;

procedure montaAlgoeMostra();
   function getFilhos(pArq: Tarqs; str: string): string;
   var
	 i: Integer;
	 s: string;
   begin
	  s := '';
	  for i := 0 to pArq.Count - 1 do
		 begin
		 s := s + str + pArq.Item[i].Text + #10#13;
		 if pArq.Item[i].arqs.Count > 0 then
			s := s + str + getFilhos(pArq.Item[i].arqs, '_')+ #10#13;
		 end;
	  Result := Trim(s); 
   end;
var
  item, tmp: TArq;
  s: string;
begin
   pMain := TArqs.Create(TArq);
   item := pMain.Add(nil);
   item.Text := 'Primeiro filho do nil';
   
   item := pMain.Add(item);
   item.Text := 'Neto do nil';

   item := pMain.Add(item);
   item.Text := 'Primeiro Neto';

   item := pMain.Add(nil);
   item.Text := 'Segundo filho do nil';
   
   tmp := pMain.Add(item);
   tmp.Text := 'Primeiro filho do segundo nil';

   item := pMain.Add(item);
   item.Text := 'Segundo filho do segundo nil';

   item := pMain.Add(tmp);
   item.Text := 'O filho do tmp pode ser colocado mesmo depois...';

   s := getFilhos(pMain, '');


   ShowMessage(s);
end;

//------------------------------------------------------------------------------
function TArqs.Add(pArq: TArq): TArq;
begin
   if pArq = nil then
	  begin
	  Result := inherited Add as TArq;
	  Result.arqs := TArqs.Create(TArq);
	  Result.Owner := TArq(pArq);
	  end
   else
	  begin
	  Result := pArq.arqs.Add(nil);
	  Result.arqs := TArqs.Create(TArq);
	  Result.Owner := TArq(pArq);
	  end;
end;

procedure TArqs.Remove(ed: TArq);
var I: Integer;
begin
   for I := 0 to Count - 1 do
	  if Item[I] = ed then
		 begin
		 Delete(I);
		 Break;
		 end;
end;

function TArqs.GetItem(Index: Integer): TArq;
begin
   Result := inherited Items[Index] as TArq;
end;

end.

3º - Inclua a uses unProjFile em alguma outra unit.

4º - Em algum evento, chame a função montaAlgoeMostra

 

 

Explicando:

Isso funciona como uma sacola, você pode colocar coisas na sacolas, até mesmo sacolas. Foi com este pensamento que conclui o código.

 

Este é um código muito útil se for fazer sistemas de FTP ou gerenciador de arquivos(meu caso, em ambas partes)

 

Espero comentários.

 

obs: coloquei um code dentro do codebox para funcionar o

[i]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, já ia esquecendo... exemplo de como usar o Owner(pai)

 

apos o Showmessage, adicione:

ShowMessage('O pai de tmp é "' + TArq(tmp.Owner).Text + '"');

 

cuidado, sempre verificar se o que está dentro de TArq não é nil.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.