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

Composants VCL Delphi Discussion :

Modifier un champ d'un TSaveDialog


Sujet :

Composants VCL Delphi

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Points : 208
    Points
    208
    Par défaut Modifier un champ d'un TSaveDialog
    Bonjour à tous!

    Je souhaite griser ou faire disparaitre un champ de la fenêtre de dialogue utilisée par le composant TOpenDialog : le champ permettant de saisir le nom du fichier.

    J'ai essayé de chercher dans l'aide mais je n'ai rien trouvé, je sais pas comment accéder aux champs de cette fenêtre... J'ai regardé aussi dans les propriétés disponibles mais je n'ai rien vu, est ce que c'est faisable au moins?

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 677
    Points : 25 492
    Points
    25 492
    Par défaut
    Tu peux le bidouiller avec un thread ou un timer qui via un FindWindow, ... trouver le Edit concerné, et le désactiver via les API windows ...

    Maintenant, le principal but de ce dialog c'est justement ce que tu veux retirer, peut-être qu'un SelectDirectory (voir les deux forme d'appel différentes ... qui donne une fenêtre différente) fera mieux l'affaire !

  3. #3
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Maintenant, le principal but de ce dialog c'est justement ce que tu veux retirer, [...]
    +1
    Je ne vois pas non plus l'intérêt de cette manoeuvre.

    @+ Claudius

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Points : 208
    Points
    208
    Par défaut
    Merci. En fait je compte utiliser cette boite pour le choix d'un répertoire, SelectDirectory n'est pas pratique à utiliser (pas les boutons sur le coté et pas d'utilisation de raccourcis) et vu que je fais que récupérer le répertoire sélectionné, je voudrai griser/empêcher que l'on puisse écrire dans cette zone.

    Par contre comment récupérer le Edit? J'ai aucune idée de comment faire ça

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 677
    Points : 25 492
    Points
    25 492
    Par défaut
    SelectDirectory est simple et efficace pour choisir un dossier ... j'avais refait juste une SelectMaskDirectory, reprenant la forme façon "win 3.1" pour n'afficher et n'accepter que les repertoires avec un mask sur les noms de fichier qu'il contiennent ... faudrait qu'un jour je retrouve ce code ...

    sinon, un vieux code, ... si je me souviens bien, j'ouvrais un OpenDialog dans pour l'impression dans un fichier ... et je pouvais remplacer à volonté le contenu du la zone et je simulais le clic sur le OK, ... donc tu peux chercher pour disabled l'Edit ... ce code n'était que pour de la recherche, il n'a servi à rien au final ...

    Bon courage, tu vas surement te lancer dans une uzinagaz pour pas grand chose ...

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
     
    procedure TFrmTestStructureMemoire.Timer2Timer(Sender: TObject);
    var
      HwndEdit, HwndButton: HWND;
      lpClassName: PChar;	// pointer to class name
      lpWindowName: PChar; 	// pointer to window name
      lpString: PChar;       // address of string
      HwndParent: HWND;
      HwndChildAfter: HWND;	// handle to a child window
      lpszClass: PChar;	    // pointer to class name
      lpszWindow: PChar;	    // pointer to window name
      lpRes : array[0..256] of Char;
      TmpStr : String;
    begin
          lpClassName:= nil; //'#32770';	                // pointer to class name
          lpWindowName:= 'Imprimer dans un Fichier'; 	// pointer to window name
          {Récupère le handle de la boite de dialogue Ouvrir}
          HwndParent := FindWindow(lpClassName, lpWindowName);
     
          if HwndParent <> 0 then begin
             if GetWindowText( HwndParent, lpRes, 256) > 0 then begin
                FichierLog('ShowMessage','Parent GetWindowText',lpRes);
             end;
     
             { Mettre la fenêtre au premier plan en connaissant son handle }
             BringWindowToTop(HwndParent);
     
             HwndChildAfter := GetWindow(HwndParent, GW_CHILD);
             if HwndChildAfter <> 0 then begin
     
                lpszClass := 'Edit';
                lpszWindow := nil;
                HwndEdit  := FindWindowEx(HwndParent, HwndChildAfter, lpszClass, lpszWindow);
                if HwndEdit <> 0 then begin
                   if GetWindowText( HwndEdit, lpRes, 256) > 0 then begin
                      FichierLog('ShowMessage','Old Edit GetWindowText', lpRes);
                   end;
                   TmpStr := 'D:\Production\Programme Test\TestStructureMemoire\Print\PrintFile' + IntToStr(Timer1.Tag) + '.txt';
                   if DeleteFile(TmpStr) then begin
                      FichierLog('ShowMessage','DeleteFile', TmpStr);
                   end;
                   lpString := PChar(TmpStr);
                   // lpString := nil;
                   // if not SetWindowText(HwndEdit, lpString) then begin
                   //    FichierLog('ShowMessage','SetWindowText', IntToStr(GetLastError()));
                   // end else begin
                       SendMessage(HwndEdit, WM_SETTEXT, 0, Longint(lpString));
                       SendMessage(HwndEdit, CM_TEXTCHANGED, 0, 0);
                       if GetWindowText( HwndEdit, lpRes, 256) > 0 then begin
                          FichierLog('ShowMessage','New Edit GetWindowText', lpRes);
                       end;
                   //end;
                end else begin
                    FichierLog('ShowMessage','FindWindowEx', IntToStr(GetLastError()));
                end;
     
                lpszClass := 'Button';
                lpszWindow := 'OK';
                HwndButton  := FindWindowEx(HwndParent, HwndChildAfter, lpszClass, lpszWindow);
                if HwndButton <> 0 then begin
                   // SendMessage(HwndButton, BM_CLICK, 0, 0);
                   SendMessage(HwndButton, WM_LBUTTONDOWN, 0, 0);
                   SendMessage(HwndButton, WM_LBUTTONUP, 0, 0);
                end else begin
                    FichierLog('ShowMessage','FindWindowEx', IntToStr(GetLastError()));
                end;
     
     
             end else begin
                 FichierLog('ShowMessage','GetWindow', IntToStr(GetLastError()));
             end;
          end else begin
              FichierLog('ShowMessage','FindWindow', IntToStr(GetLastError()));
          end;
    end;

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Tu seras aussi ennuyé avec le bouton Ouvrir qui a un comportement différent si tu pointes sur un répertoire ou un fichier. Si répertoire, tu navigues à l'intérieur, mais ne le sélectionne pas.

    Je rejoins Shai, SelectDirectory avec les bonnes options:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if SelectDirectory('Répertoire', '', Dir, [sdShowShares, sdShowEdit], Self) then ...

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Points : 208
    Points
    208
    Par défaut
    Ouais et ça m'a l'air bien compliqué juste pour griser un simple champ

    C'est bien cette boite de dialogue dont vous parlez? Perso je la trouve moche et peu pratique, aucun moyen de sélectionner le bureau ou le répertoire mes documents facilement.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [sdShowShares, sdShowEdit]
    Sinon j'ai pas ces options sur Delphi 7, à quoi elle correspondent?

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Tu peux le bidouiller avec un thread ou un timer qui via un FindWindow, ... trouver le Edit concerné, et le désactiver via les API windows ...
    En fait, il est possible de faire la même chose proprement et sans bidouille (enfin en suivant la méthode officielle de Microsoft, même si elle ressemble un peu à de la bidouille elle aussi...)

    La méthode officielle est un peu compliquée, mais les composants Delphi font déjà une bonne partie du travail.

    Pour cacher l'Edit ou la Combo qui affiche le nom du fichier (ainsi que le label) il suffit de faire :

    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
     
    type
      TOpenDir = class(TOpenDialog)
      protected
        procedure WndProc(var Message: TMessage); override;
      end;
     
    ...
    const 
      edt1 = $480;
      cmb13 = $47c;
      stc3 = $442;
     
    procedure TOpenDir.WndProc(var Message: TMessage);
    begin
      if Message.Msg = WM_INITDIALOG
      then begin
        SendMessage(GetParent(Handle), CDM_HIDECONTROL, edt1, 0);
        SendMessage(GetParent(Handle), CDM_HIDECONTROL, cmb13, 0);
        SendMessage(GetParent(Handle), CDM_HIDECONTROL, stc3, 0);
      end;
      inherited WndProc(Message);
    end;
    Et tu utilises TOpenDir au lieu de TOpenDialog. Enfin c'est le principe. Maintenant il te reste à faire en sorte que la boîte de dialogue soit utilisable (parce que mon code fait ce que tu demandes, mais le résultat est assez pourri).

    Tiens tu as la doc complète dans la MSDN :
    http://msdn.microsoft.com/en-us/libr...60(VS.85).aspx

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 677
    Points : 25 492
    Points
    25 492
    Par défaut
    Je confirme, moi non plus ... et oui, l'écran que tu nous montre, date un peu, il ressemble à du Windows 3.1 , tu as l'autre écran, qui est encore plus léger qui est apparu en Win95 !
    C'est vrai que l'on est pas gaté, faut dire que c'est finalement rare la sélection de dossier ... c'est pour de la configuration en général, et c'est fait par des utilisateurs avertis, sinon c'est 99% du temps de la sélection de fichier ...

    EDIT : Oh ! Passez par un WindowProc, ouais, pas mal, ...
    EDIT2 : Tu aurais le lien d'origine de la MSDN à ce sujet ?

  10. #10
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    En réalité ce n'est pas réellement un WindowProc... Lorsque la VCL appelle GetOpenFileName, elle définit un hook sur le dialog windows qui va recevoir les messages qui lui sont destinés.

    L'encapsulation de la VCL nous fait apparaitre le hook comme un bête WindowProc alors que le TCommonDialog est un vulgaire TComponent !

    Le lien MSDN était dans le post précédent.

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 310
    Points : 208
    Points
    208
    Par défaut
    Génial, c'est exactement ce que je recherchais! En plus c'est pas trop compliqué à faire, que du bonheur + la solution est intéressante J'en ai profité pour masquer aussi le type de fichier et son label, ça choque un peu mais je préfère ça à la vieille boite windows 3.1 peu pratique

    Merci à tous et à Franck SORIANO pour cette solution!

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

Discussions similaires

  1. Modifier deux champs en même temps!!!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 08/09/2005, 20h31
  2. [Zope] modifier un champ de formulaire d´un dtml_doc
    Par naiadeKaren dans le forum Zope
    Réponses: 1
    Dernier message: 17/08/2005, 13h31
  3. [EJB2.1 Entity] [CMP] Modifier un champ d'une clé primaire
    Par Medo_free dans le forum Java EE
    Réponses: 4
    Dernier message: 14/03/2005, 18h04
  4. Modifier un champ à partir d'une fenêtre modale
    Par ahoyeau dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/03/2005, 16h53
  5. [struts] : modifier un champ en javascript
    Par richard_34b dans le forum Struts 1
    Réponses: 3
    Dernier message: 02/10/2004, 00h42

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