Yo utilizo este sistema hace bastante y hasta ahora me da buen resultado:
Código Delphi
[-]
procedure TFormContactos.FormCreate(Sender: TObject);
var
FileInfo: TSHFileInfo;
Flags: Integer;
Icono : TIcon;
Carpeta,Grupo : TTreeNode;
Registro : PRegistro;
I,Z : Integer;
begin
FormMain.ActionLibretaContactos.Enabled := False;
Registros := Tlist.Create;
Icono := TIcon.Create;
FillChar(FileInfo, SizeOf(FileInfo), #0);
Flags := SHGFI_ICON or SHGFI_SMALLICON;
SHGetFileInfo( PCHAR(ExtractFilePath( Application.ExeName )),
0,
FileInfo,
SizeOf(FileInfo),
Flags);
Icono.Handle := FileInfo.hIcon;
ImageList1.AddIcon(Icono);
Icono.ReleaseHandle;
Flags := SHGFI_ICON or SHGFI_SMALLICON or SHGFI_OPENICON;
SHGetFileInfo(PCHAR(ExtractFilePath( Application.ExeName )),
0,
FileInfo,
SizeOf(FileInfo),
Flags);
Icono.Handle := FileInfo.hIcon;
ImageList1.AddIcon(Icono);
Icono.Free;
With Datamodule1.IBQueryCarpetas DO
Begin
First;
DisableControls;
TreeView.Items[0].Text := FieldByName('Carpeta').AsString;
New(Registro);
Registro^.FCodigo := FieldByName('Codigo').AsInteger;
TreeView.Items[0].Data := Registro;
Registros.Add(Registro);
Next;
While Not Eof DO
Begin
if FieldByName('Master').AsInteger = 0 then
Begin
New(Registro);
Registro^.FCodigo := FieldByName('Codigo').AsInteger;
Registros.Add(Registro);
Carpeta := TreeView.Items.AddChildObject(TreeView.Items[0], FieldByName('Carpeta').AsString,Registro);
Carpeta.ImageIndex := Imagelist1.Count -2;
Carpeta.SelectedIndex := Imagelist1.Count -1;
end
Else
Begin
For Z := 1 To TreeView.Items.Count -1 DO
if PREGISTRO(TreeView.Items[Z].Data)^.FCodigo = FieldByName('Master').AsInteger then
Begin
New(Registro);
Registro^.FCodigo := FieldByName('Codigo').AsInteger;
Registros.Add(Registro);
Grupo := TreeView.Items.AddChildObject(TreeView.Items[Z], FieldByName('Carpeta').AsString,Registro);
Grupo.ImageIndex := Imagelist1.Count -1;
Grupo.SelectedIndex := Imagelist1.Count -2;
break;
End;
End;
Next;
End;
EnableControls;
End;
TreeView.AlphaSort;
TreeView.Items[0].Expand(False);
TreeView.OnChange := TreeViewChange;
TreeView.FullExpand;
IF Unit_Opciones.LastFolder <> 0 THEN
TreeView.Selected := TreeView.Items[Unit_Opciones.LastFolder];
TabControl1.Tabs.Clear;
TabControl1.Tabs.Add( '*');
For I := 65 TO 90 DO
TabControl1.Tabs.Add( CHR(I ) );
For I := 48 TO 57 DO
TabControl1.Tabs.Add( CHR(I ) );
TabControl1Change(nil);
End;
Te darás cuenta que creo un Tlist con un registro para que cuando el view cambie, también cambie una tabla hija asociada....
También utilizo los iconos "carpetas del sistema" para ahorrar en imágenes.
Hace unos día me planteé hacerme un componente Treeview "dataware", pero por falta de tiempo y ganas, de momento me apaño con este procedimiento.
También estuve tratando de probar el DbTreeview de las JEDI, pero creo que es imposible hacer andar a ese componente y a falta de documentación, tampoco se si valdría para hacer esto, dado que tiene una propiedad ITEMS... en fin un pestazo.
Se me olvidaba: La estructura del registro es esta...
Código Delphi
[-]
type
PRegistro = ^TRegistro;
TRegistro = record
FCodigo : Integer;
End;
Saludos