Pregunta

Quiero establecer la ruta para un TShellListView para mostrar un directorio de archivos utilizando Delphi 2007. Inicialmente puedo usar TShellListView.Root para establecer la ruta de raíz como esto y se nota el directorio que quiero:

View := TShellListView.Create(Self);
// ...
View.Root := 'C:\Windows';

Sin embargo, si el usuario salga de ese directorio utilizando la tecla de retroceso y trato de establecer el .root de nuevo al directorio original, el directorio visualizado no cambia. Parece que .root está destinado a definir la raíz del espacio de nombres de shell, no el directorio actual.

Además, si el usuario navega alrededor (usando la tecla de retroceso, etc.) la propiedad .root no actualiza para reflejar la ruta que se muestra actualmente. No hay ninguna propiedad .Path como lo hay para TShellTreeView.

Lo que quiero es una forma de obtener y establecer la ruta actual como una cadena sin necesidad de vincular el TShellListView a un TShellTreeView y establecer TShellTreeView.Path o piratear ShellCtrls.pas ya sus métodos de TShellListView todos se ven privados. Me resulta difícil creer que no hay una forma sencilla de obtener / establecer la ruta, así que supongo que me falta algo sencillo aquí, pero este componente no está documentada en absoluto.

¿Fue útil?

Solución

Puede obtener la ruta cargada actualmente utilizando

ShellListView1.RootFolder.PathName

Configuración de las obras de propiedad raíz, pero no se actualiza cuando cambia carpetas de forma interactiva. Así que hay que obligarlo a pensar que hay un cambio. Esto funciona si siempre que se quede en la misma ruta original:

ShellListView1.Root := View.RootFolder.PathName; // Updates to current location
ShellListView1.Root := 'C:\Windows';

Por otra parte, para las trayectorias arbitrarias que sólo podría añadir / eliminar el arrastre \ con el fin de engañar a la comprobación SameText en setRoot:

if ShellListView1.Root[Length(ShellListView1.Root)] = '\' then
  ShellListView1.Root := ExcludeTrailingPathDelimiter(ANewPath)
else
  ShellListView1.Root := IncludeTrailingPathDelimiter(ANewPath);

Otros consejos

Para obtener la carpeta actual como una cadena, se puede acceder al RootFolder-propiedad.

procedure TForm2.Button1Click(Sender: TObject);
begin
  showmessage(ShellListView1.RootFolder.PathName);
end;

Para establecer la carpeta actual como una cadena, se utiliza la raíz-propiedad.

procedure TForm2.Button2Click(Sender: TObject);
begin
  ShellListView1.Root := 'C:\windows';
end;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top