Ver Mensaje Individual
  #2  
Antiguo 23-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Iván.

No creo factible predeterminar el evento para que se dispare sólo ante determinada condición ajena a la pulsación del ratón. Sin embargo, sí es posible evaluar dentro del evento OnClick del TShellTreeView la condición que se te ocurra.

Dado que el componente TShellTreeView reconoce los archivos .ZIP y .CAB como carpetas no podemos usar las propiedades Folder y SubFolders de la carpeta seleccionada para hacer lo que buscas ya que al evaluar no mostraría como última a aquellas carpetas que contuvieran esos tipos de archivos.
Esto implica crear algo de código adicional, una pequeña función que nos diga si al menos existe una carpeta hija de la actual.

El código:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  with ShellTreeView1 do
    ObjectTypes := ObjectTypes + [otNonFolders];
end;

(* Devuelve True si la carpeta actual posee una subcarpeta *)
function HaveFolder(const Path: string): boolean;
var
  sr: TSearchRec;
begin
  Result:= False;
  if FindFirst(Path+'\*.*', faDirectory, sr) = 0 then
  begin
    repeat
      if (sr.Attr and faDirectory = faDirectory)and
         (sr.Name<>'.')and(sr.Name<>'..') then
        Result:= True;
    until (FindNext(sr) <> 0) or Result;
    FindClose(sr);
  end;
end;

(* Verifica si el click se hizo sobre la última carpeta *)
procedure TForm1.ShellTreeView1Click(Sender: TObject);
var
  pt: TPoint;
  ht: THitTests;
  pth: string;
  IsFolder: Boolean;
begin
  with TShellTreeView(Sender) do
  begin
    pt := ScreenToClient(Mouse.CursorPos); // coordenadas X~Y del click
    ht := GetHitTestInfoAt(pt.X, pt.Y);    // ¿ Donde fué ?
    if (htOnItem in ht) then               // ¿ Sobre un ítem ?
    begin
      pth:= SelectedFolder.PathName;       // Obtener ruta del ítem
      IsFolder:= FileGetAttr(pth) and faDirectory = faDirectory; //¿ Es carpeta ?
      if IsFolder and not HaveFolder(pth) then // ¿ Fué carpeta y no tiene subcarpetas ?
        ShowMessage('Última carpeta');  //Acciones a ejecutar cuando es última carpeta
    end;
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita