rento 0 Denunciar post Postado Agosto 31, 2008 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
rento 0 Denunciar post Postado Agosto 31, 2008 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