PDA

Ver la Versión Completa : recuperando rutas de directorios


danielmj
01-06-2013, 00:15:17
Hola buenas noches.

Tengo un problemilla con un TTreeView donde se cargan los directorios de una determinada unidad según la seleccione en un comboBox, hasta ahí todo bien, el problema viene cuando en un TEdit, quiero que se escriba la ruta de ese directorio o digamos, el padre, hijo y nieto del TTreeview. Es decir imaginemos esto...

DIRECTORIO 1, DIRECTORIO 2, DIRECTORIO 3, DIRECTORIO 4

Donde cada item, forma parte del anterior, lo que necesito es que quede de esta manera en el TEdit: C:\DIRECTORIO1\DIRECTORIO2\DIRECTORIO3\DIRECTORIO4
Puedo acceder a cada nivel, pero en el TEdit sólo me muestra lo que sería el padre o el hijo o el nieto, pero nunca los tres al mismo tiempo y esto en el evento OnClick del TTreeView.
He mirado en el foro, pero no he encontrado ningún caso parecido al mio.

¿Alguna sugerencia?

Muchas gracias y un saludo a todos/as.

ecfisa
01-06-2013, 02:18:19
Hola danielmj.


function GetBranchNodes(TV: TTreeView; ndSelect: TTreeNode): string;
var
nd: TTreeNode;
begin
nd := ndSelect;
while nd.Level <> 0 do nd := nd.GetPrev;
while nd.HasChildren do
begin
Result := Result + nd.Text + '\';
nd := nd.GetNext;
end;
Result := Result + nd.Text
end;


procedure TForm1.TreeView1Click(Sender: TObject);
var
nd: TTreeNode;
P : TPoint;
begin
with TTreeView(Sender) do
begin
P := TreeView1.ScreenToclient(Mouse.CursorPos);
nd := TreeView1.GetNodeAt(P.X, P.Y);
if nd <> nil then
begin
Edit1.Text := '';
Edit1.Text := GetBranchNodes(TreeView1, nd);
end
end;
end;


Saludos :)

danielmj
01-06-2013, 10:41:38
Buenos dias ecfisa,

Lo primero de todo, agradecerte una respuesta tan rapida, en cuanto la he visto, me he puesto con ello, pero el problema persiste, me explico:
Si hago clic en lo que vendría a ser el elemento padre, en el TEdit me muestra lo que sería toda la ruta hasta el primero de los sub elementos, pero mejor una imagen y así es mas fácil de ver.

http://i41.tinypic.com/2ykmjhc.jpg

En el ejemplo de la imagen, había seleccionado el nodo principal NVidia, pero en el TEdit me muestra toda la ruta hasta el sub elemento Display.Driver, cuando debería de mostrar en cada clic de raton pues los directorios sobre el que haga ese clic, concatenando sucesivamente los niveles en su caso. Es decir:

Caso 1. Si pulso sobre NVidia
En el TEdit aparecería esto: NVidia

Caso2. Si pulso sobre 314.22
En el TEdit aparecería esto: NVidia\DisplayDriver\314.22
...
Caso 6. Si pulso sobre HDAudio
En el TEdit aparecería esto: NVidia\DisplayDriver\314.22\Win8_WinVista_Win7_64\International\HDAudioEn el TEdit, no se aprecia pero habiendo hecho clic sobre NVidia, me mostró toda la ruta hasta el sub elemento Display.Driver de igual modo, si pulso sobre NV3DVision, no mostraría este directorio, sino que el último en mostrar en el TEdit, seguiría siendo Display.Driver.

Otra cosa que me pasa es que cuando en el TTreeview se van a cargar todos los directorios de una unidad, la aplicación se cuelga por unos segundos hasta que han sido cargados en el TTreeview y la barra de progreso que puse a proposito para que se vaya rellenando a medida que va cargando la estructura de directorios, no muestra progreso al colgarse la aplicación, solo se rellena de una vez cuando la carga de las carpetas ha terminado y la verdad, se ve feo. He pensado en refrescar el TTreeview, ahora me pondre con eso a ver si funciona, sino ¿de que otro modo podría hacerlo que resultase en una carga de directorios mas "suave"? ¿Existe alguna función o comando que evite el cuelge por uso excesivo de la memoria?

Espero haberme explicado correctamente. Saludos y una vez más, mil gracias.

ecfisa
01-06-2013, 21:02:06
...
Si hago clic en lo que vendría a ser el elemento padre, en el TEdit me muestra lo que sería toda la ruta hasta el primero de los sub elementos

Si era la idea... por que eso era precisamente lo que había interpretado que deseabas:


DIRECTORIO 1, DIRECTORIO 2, DIRECTORIO 3, DIRECTORIO 4

Donde cada item, forma parte del anterior, lo que necesito es que quede de esta manera en el TEdit: C:\DIRECTORIO1\DIRECTORIO2\DIRECTORIO3\DIRECTORIO4

Puedo acceder a cada nivel, pero en el TEdit sólo me muestra lo que sería el padre o el hijo o el nieto, pero nunca los tres al mismo tiempo y esto en el evento OnClick del TTreeView.



No tengo Delphi en este momento como para probarlo pero supongo que debería bastar con este cambio:

function GetBranchNodes(TV: TTreeView; ndSelect: TTreeNode): string;
var
nd: TTreeNode;
begin
nd := ndSelect;
while nd.Level <> 0 do nd := nd.GetPrev;
while nd <> ndSelect do // <==
begin
Result := Result + nd.Text + '\';
nd := nd.GetNext;
end;
Result := Result + nd.Text
end;


Saludos.:)

danielmj
04-06-2013, 21:33:59
hola ecfisa, tu como siempre dando soluciones :)

lo primero de todo, disculparme por no haberte dado las gracias antes, pero no tengo tiempo para nada, (hoy entre a currar a las 6:30 de la mañana y he salido hace un rato asi que...). Tu código funcionó perfectamente, ahora estoy con otros problemillas como mover archivos de una carpeta a otra, pero como tienen distinta extension, el movefile, no me soluciona nada, por que movería todos los archivos de la carpeta, en fin, tratare de renombrar el archivo que no quiero mover y asi lo intento y luego vuelvo a renombrarlo para que vuelva a llamarse de igual modo que antes.

Un saludo y gracias.

Casimiro Notevi
04-06-2013, 21:48:58
Preguntas distintas en hilos distintos, gracias. (http://www.clubdelphi.com/foros/guiaestilo.php) ;)

danielmj
05-06-2013, 19:45:09
Sé que cada pregunta va en su sitio casimiro, pero lo que comenté en mi último mensaje no era una pregunta, era un simple comentario que le hice a ecfisa sin pretender nada mas.

Saludos.

Casimiro Notevi
05-06-2013, 19:53:26
.............

^\||/
.............