Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Autocompletado con Delphi de las carpetas del equipo
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Autocompletado con Delphi de las carpetas del equipo

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Autocompletado con Delphi de las carpetas del equipo Responder citando

Estoy realizando una aplicación Delphi, en una de las ventanas pido al usuario que escriba la ruta donde se encuentra un determinado fichero, tiene la opción de pulsar un botón para que aparezca el diálogo de seleción de fichero TOpenDialog, pero quiero que si el usuario escribe la ruta vayan apareciendo en un desplegable las posibles carpetas de la ruta que esté escribiendo, igual que ocurre en Windows XP, si escribimos una ruta en "Inicio" - "Ejecutar", al escribir "C:\" en el desplegable va mostrando todas las carpetas que haya en la unidad.

¿Esto es posible en Delphi sin mucho código? ¿Hay alguna forma de utiliza el mismo método que utiliza Windows?
MensajePublicado:
Sab Ene 09, 2010 11:14 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Autocompletado con Delphi de las carpetas del equipo Responder citando



Anuncios



varios escribió:
Estoy realizando una aplicación Delphi, en una de las ventanas pido al usuario que escriba la ruta donde se encuentra un determinado fichero, tiene la opción de pulsar un botón para que aparezca el diálogo de seleción de fichero TOpenDialog, pero quiero que si el usuario escribe la ruta vayan apareciendo en un desplegable las posibles carpetas de la ruta que esté escribiendo, igual que ocurre en Windows XP, si escribimos una ruta en "Inicio" - "Ejecutar", al escribir "C:\" en el desplegable va mostrando todas las carpetas que haya en la unidad.

¿Esto es posible en Delphi sin mucho código? ¿Hay alguna forma de utiliza el mismo método que utiliza Windows?


Sí es posible y casi sin código puesto que se puede utilizar la función SHAutoComplete del API de Windows (probada en Windows XP y Windows 7).

Te mostramos a continuación un ejemplo de uso de dicha función que te permitirá añadir la opción de autocompletado en un TEdit para:

1. Carpetas y ficheros del equipo.
2. URLs (direcciones web del navegador) recientemente usadas.
3. Direcciones recientes (lo que se introducie en "Inicio" - "Ejecutar").

Con esta función podrás decidir cuál de los anteriores utilizar o utilizar todos a la vez o algunos de ellos.

Para usarla te puede servir el siguiente código:

Código:

unit UnidadAutocompletar;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComObj;

type
  TformAutoCompletar = class(TForm)
    InfoLbl: TLabel;
    txtTexto: TEdit;
    opTipoAutocompletado: TGroupBox;
    opTipoFicheros: TCheckBox;
    opTipoURL: TCheckBox;
    opTipoEjecutar: TCheckBox;
    opTipoCarpetas: TCheckBox;
    btSalir: TButton;
    opDesactivar: TCheckBox;
    opAdicion: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure btSalirClick(Sender: TObject);
    procedure opTipoFicherosClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  formAutoCompletar: TformAutoCompletar;

const
  SHACF_DEFAULT                  = $0;
  SHACF_FILESYSTEM               = $1;
  SHACF_URLHISTORY               = $2;
  SHACF_URLMRU                   = $4;
  SHACF_URLALL                   = (SHACF_URLHISTORY or SHACF_URLMRU);
  SHACF_AUTOSUGGEST_FORCE_ON     = $10000000;
  SHACF_AUTOSUGGEST_FORCE_OFF    = $20000000;
  SHACF_AUTOAPPEND_FORCE_ON      = $40000000;
  SHACF_AUTOAPPEND_FORCE_OFF     = $80000000;
  SHACF_NOAUTOCOMPLETE           = $00000008;
  SHACF_FILESYS_DIRS             = $20000000;
  SHACF_USETAB                   = $00000008;



  function opcionesAutocompletar (desactivar, ficheros, carpetas,
      url, recientes, activarAutosuggest : boolean) : DWORD;
  function autoCompletar (componenteEdit : TEdit;
      dwFlags: DWORD) : Boolean;

implementation

{$R *.dfm}

type
  TShAutoCompleteFunc = function(hwndEdit: HWND;
      dwFlags: dWord): LongInt; stdcall;

var
  SHAutoComplete : TShAutoCompleteFunc;
  theDLL : THandle;

function opcionesAutocompletar (desactivar, ficheros, carpetas,
    url, recientes, activarAutosuggest : boolean) : DWORD;
begin
  Result := SHACF_NOAUTOCOMPLETE;
  if desactivar then
    Result :=  SHACF_NOAUTOCOMPLETE
  else
  begin
    if ficheros then
      Result := Result or SHACF_FILESYSTEM;
    if carpetas then
      Result := Result or SHACF_FILESYS_DIRS;
    if url then
      Result := Result or SHACF_URLHISTORY;
    if recientes then
      Result := Result or  SHACF_URLMRU;
    if activarAutosuggest then
      Result := Result or SHACF_AUTOSUGGEST_FORCE_ON
    else
      Result := Result or SHACF_AUTOSUGGEST_FORCE_OFF;
  end;
end;

function autoCompletar (componenteEdit : TEdit;
    dwFlags: DWORD) : Boolean;
begin
  if @ShAutoComplete <> nil then
     Result := (SHAutoComplete(componenteEdit.Handle, dwFlags) = 0)
  else
    Result := false;
end;


procedure TformAutoCompletar.FormCreate(Sender: TObject);
begin
  autoCompletar (txtTexto, SHACF_DEFAULT);
end;

procedure TformAutoCompletar.btSalirClick(Sender: TObject);
begin
  close;
end;


procedure TformAutoCompletar.opTipoFicherosClick(Sender: TObject);
begin
  autoCompletar(txtTexto, opcionesAutocompletar (
      opDesactivar.Checked, opTipoFicheros.Checked,
      opTipoCarpetas.Checked, opTipoURL.Checked,
      opTipoEjecutar.Checked, opAdicion.Checked));
end;


//para que si no existe la librería
//shlwapi.dll la aplicación no dé error
initialization
  theDLL := LoadLibrary('shlwapi.dll');
  if theDLL <> 0 then
    @ShAutoComplete := GetProcAddress(theDLL, 'SHAutoComplete');
finalization
  if theDLL <> 0 then
    FreeLibrary(theDLL);
end.
MensajePublicado:
Mie Ene 20, 2010 6:22 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Autocompletado con Delphi de las carpetas del equipo Responder citando



Anuncios



El código anterior con la función SHAutoComplete de la librería shlwapi.dll:



Cómo es es exactamente igual que el autocompletado que utiliza Windows:

MensajePublicado:
Mie Ene 20, 2010 6:34 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A