IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Après un click sur TButton pour ouvrir un dossier récupérer le focus sur un TFileListBox D6 et Win11


Sujet :

Delphi

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 677
    Par défaut Après un click sur TButton pour ouvrir un dossier récupérer le focus sur un TFileListBox D6 et Win11
    Bonjour à toutes et à tous,

    Je me demandais si c'était faisable, dans mon application j'ai un TButton qui me permet d'ouvrir un dossier et lorsque je ferme le dossier, mon application n'a plus le focus et j'aurai aimé retrouvé le focus sur le TFileListBox.

    Si quelqu'un à une pise merci d'avance.

    @+,

    cincap

  2. #2
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 544
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 544
    Par défaut
    Bonjour Cincap,

    Filelistbox1.setFocus ?

    Tu ouvres le dossier avec quoi

    A+
    Charly

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 677
    Par défaut
    Bonjour à toutes et à tous,

    @ Charly910, hello, merci de ta réponse mais je la connaissais, dans mon application, je clique sur un TButton pour ouvrir le dossier ou se trouve le résultat et j'utilise la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShellExecute(Handle, 'open', PChar(chappli + '\PHOTOS'), nil, nil, SW_SHOWNORMAL) ;
    Et lorsque je ferme ce dossier, je n'ai plus le focus sur mon composant 'TFileListBox' c'est un comportement normal, je dois cliquer sur ce composant pour arriver à passer d'item en item avec les touches flèches haut/bas.

    Maintenant je pense que cela ne soit pas possible !

    Bonne journée,

    @+,

    cincap

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 677
    Par défaut
    @ tous, j'ai placé la commande en supplément dans le "Formpaint" de la fiche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TU_Main.FormPaint(Sender: TObject);
    begin
    Self.BringToFront;
      //TFileListBox(Sender).SetFocus;
    FileListBox1.setfocus;
    end;
    Désolé pour ce contre temps.

    @+,

    cincap

  5. #5
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 96
    Par défaut
    Essaie ce code qui ouvre un dossier et ne retourne qu'une fois la fenêtre du dossier est fermée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    uses ComObj;
     
    function UrlUnescapeA(pszUrl, pszUnescaped: PChar; pcchUnescaped: PChar;
      dwFlags: DWORD): HRESULT; stdcall; external 'shlwapi.dll';
     
    function OpenFolderAndWait(const APath: string):HWND;
    var
     oShell, oWindows, oWindow: OleVariant;
     I, n: integer;
     ToFind, sUrl: string;
     Buff: array[byte] of char;
    begin
      Result :=0;
      oShell := CreateOleObject('Shell.Application');
      try
       oShell.Open(APath);
       ToFind  := 'file:///'+ StringReplace(APath,'\','/',[rfReplaceAll]);
       repeat
            sleep(100);
            oWindows := oShell.Windows;
            for I := oWindows.Count- 1 downto 0 do
            begin
                oWindow := oWindows.Item(I);
                sUrl := oWindow.LocationURL;
                Buff := '';
                n := 256;
                UrlUnescapeA(PChar(sUrl), @Buff, @n, 0);
                if (n > 1 ) and SameText(ToFind, Buff) then
                begin
                    Result := oWindow.hwnd;
                    break;
                end;
            end;
        until Result <> 0;
        while IsWindow(Result) do
        begin
          Application.ProcessMessages;
          sleep(200);
        end;
      except
      end;
    end;
    usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        OpenFolderAndWait(chappli + '\PHOTOS');
        Application.BringToFront;
        FileListBox1.setfocus;
    Bonne chance!

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 677
    Par défaut
    Bonjour à toutes et à tous,

    @ Mist2024, merci de ta réponse, je vais examiner ta suggestion.

    Mais le fait d'avoir mis le code dans le Onpaint de la form, cela fonctionne correctement dès que le dossier Photos est fermé, je retrouve le focus sur le TFileListBox c'est ce qui m'intéressait.

    @+,

    cincap

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 040
    Par défaut
    Sauf que tu ne maitrise pas les moments où FormPaint est déclenché.
    Avec ton code actuel, ta listbox risque de prendre le focus au moment où tu ne t'y attend pas.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 677
    Par défaut
    @ popo, merci de ton attention et tu as tout à fait raison.

    @ Mist2024, j'ai modifié mon application et testé ta solution, cela fonctionne correctement.

    J'ai du enlever l'antislash dans la commande comme tu en tiens compte dans ta fonction :

    ToFind := 'file:///'+ StringReplace(APath,'\','/',[rfReplaceAll]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OpenFolderAndWait(chappli + 'PHOTOS'); //au lieu de "\Photos"
    Encore merci à tous,

    @+,

    cincap

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    bonjour
    effectivement la solution de @ Mist2024 marche , mais si dans ton button tu met
    FileListBox1.setfocus;
    ShellExecute(Handle, 'open', PChar(chappli + '\PHOTOS'), nil, nil, SW_SHOWNORMAL) ;
    le setfocus avant le ShellExecute ça marche aussi non ???

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 677
    Par défaut
    @ papyvore, Bonjour, merci de ta suggestion naturellement cela fonctionne, je l'avais placé après le ShellExecute d'où ma demande d'aide.

    Maintenant je garde la solution de Mist2024 qui me parait plus complète.

    @+,

    cincap

  11. #11
    Invité de passage
    Homme Profil pro
    ‫‬
    Inscrit en
    Août 2025
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : ‫‬

    Informations forums :
    Inscription : Août 2025
    Messages : 96
    Par défaut
    Bonjour,
    @Cincap

    Si tu as opté pour cette solution je signale qu"elle contient une grave erreur à corriger,
    En fait , dans certaine cas oWindows.Item(I); renvoie une valeur nulle et à l'appel de LocationURL une exception est déclenchée provoquant la sortie de la fonction.

    Ajouter un try except pour continuer la recherche de la fenêtre du dossier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     ..           oWindow := oWindows.Item(I);
    			try
    				sUrl := oWindow.LocationURL;
    				Buff := '';
    				n := 256;
    				UrlUnescapeA(PChar(sUrl), @Buff, @n, 0);
    				if (n > 1 ) and SameText(ToFind, Buff) then
    				begin
    					Result := oWindow.hwnd;
    					break;
    				end;
    			except
    			end;
    ...
    Autre point, comme tu l'as probablement remarqué l’exécution du code à partir du compilateur déclenche l'arret du programme et l'ouverture de la fenêtre du débogage CPU c'est du fait que Shell.Application a été compilé avec beaucoup de int 3 et cette instruction est utilisée par le débogueur pour déclencher les points d’arrêts.

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 677
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 677
    Par défaut
    Bonjour à toutes et à tous,

    @ Mist2024, merci pour ta correction, sur mon PC Windows 11 64 bits et D6 je n'ai pas vu un problème, en fait j'ai gardé la solution de papyvore mais j'ai gardé ta solution dans mes notes et je l'ai donc corrigée.

    Bonne journée.

    Cordialement,

    @+,

    cincap

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/02/2014, 17h49
  2. Réponses: 0
    Dernier message: 15/05/2011, 23h31
  3. [97] Modifier enregistrement après un click sur zone liste
    Par totojordi dans le forum VBA Access
    Réponses: 8
    Dernier message: 27/05/2008, 10h14
  4. Lien pour ouvrir un dossier sur disque dur
    Par poleta77 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/02/2008, 13h11
  5. Réponses: 4
    Dernier message: 28/04/2007, 15h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo