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;
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;
procedure TForm1.ShellTreeView1Click(Sender: TObject);
var
pt: TPoint;
ht: THitTests;
pth: string;
IsFolder: Boolean;
begin
with TShellTreeView(Sender) do
begin
pt := ScreenToClient(Mouse.CursorPos); ht := GetHitTestInfoAt(pt.X, pt.Y); if (htOnItem in ht) then begin
pth:= SelectedFolder.PathName; IsFolder:= FileGetAttr(pth) and faDirectory = faDirectory; if IsFolder and not HaveFolder(pth) then ShowMessage('Última carpeta'); end;
end;
end;
Saludos