Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   OpenDialog - Seleccionar filtro luego de llamar a Execute() (https://www.clubdelphi.com/foros/showthread.php?t=86843)

AgustinOrtu 12-10-2014 08:00:14

OpenDialog - Seleccionar filtro luego de llamar a Execute()
 
Que tal compañeros del club, resulta que tengo un OpenDialog el cual me gustaria que, al entrar a determinadas carpetas, a traves del evento OnFolderChange, cambiar el filtro seleccionado, seria como accerder a la propiedad ItemIndex del ComboBox del OpenDialog, ¿me explico?

Supongamos que entro a la carpeta ...\Facturas, entonces me interesa que automaticamente el filtro seleccionado sea el *.fc, si entro a ...\NotasDebito, sea *.nd y asi

Modificar la propiedad FilterIndex del OpenDialog no parece fucionar :(

Lo que yo he hecho y funciona, pero es una chanchada es algo como esto:

Código Delphi [-]
type
    FILTERS_INDEX = (fiXLS, fiFC, fiRM, fiNC, fiND);

procedure TFFacturaVenta.LoadFolderChange(Sender: TObject);
var FilterComboBoxHandle: HWND; i, NewIndex: integer;
begin
    // Load es un TOpenDialog
    with Load do
    begin
        if (FileName + PathDelim = Path_a_\Facturas) then
            NewIndex:= Integer(fiFC);
        // obtengo el Handle del ComboBox
        FilterComboBoxHandle:= FindWindowEx(FindWindow(NIL, PWChar(Load.Title)), 0, 'ComboBox', NIL);
        // subo hasta el primer filtro... si no le mando primero "abajo" no funciona
        SendMessage(FilterComboBoxHandle, WM_KEYDOWN, VK_DOWN, SizeOf(VK_DOWN));
        SendMessage(FilterComboBoxHandle, WM_KEYUP, VK_DOWN, SizeOf(VK_DOWN));
        for i:= 0 to CantidadFiltros do
        begin
            SendMessage(FilterComboBoxHandle, WM_KEYDOWN, VK_UP, SizeOf(VK_UP));
            SendMessage(FilterComboBoxHandle, WM_KEYUP, VK_UP, SizeOf(VK_UP));
        end;
        SendMessage(FilterComboBoxHandle, WM_KEYDOWN, VK_RETURN, SizeOf(VK_RETURN));
        SendMessage(FilterComboBoxHandle, WM_KEYUP, VK_RETURN, SizeOf(VK_RETURN));

        // y ahora bajo hasta el deseado
        for i:= 0 to NewIndex do
        begin
            SendMessage(FilterComboBoxHandle, WM_KEYDOWN, VK_DOWN, 1);
            SendMessage(FilterComboBoxHandle, WM_KEYUP, VK_DOWN, 1);
        end;
        SendMessage(FilterComboBoxHandle, WM_KEYDOWN, VK_RETURN, 1);
        SendMessage(FilterComboBoxHandle, WM_KEYUP, VK_RETURN, 1);
    end;
end;

Basicamente lo que hago es simular que pulso la teclas ARRIBA/ABAJO para moverme al filtro que necesito, la verdad no se me ocurre mas que podria hacer

Un saludo y gracias ^\||/

AgustinOrtu 12-10-2014 12:08:27

Detalles no menores que olvide aclarar, uso Delphi 2010 y Win 7. Sería deseable que la solución funcione en Windows anteriores a 7, como XP (él código que propuse arriba no funciona en XP, seguro relacionado al tema de que los Dialog en NT funcionan distinto)

Saludos

AgustinOrtu 12-10-2014 23:35:52

Encontré esto en uno de mis favoritos buscando otra cosa (así es la vida). File Open/Save Common Dialog Control IDs

A ver si se le ocurre algo a alguien, que yo con la API tengo poco y nada de experiencia y todo lo que sean Handles y Messages me dan escalofríos


La franja horaria es GMT +2. Ahora son las 18:58:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi