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 :

Problèmes avec la touche "tabulation avant" (Delphi7)


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Points : 39
    Points
    39
    Par défaut Problèmes avec la touche "tabulation avant" (Delphi7)
    Bonjour,

    J'ai des problèmes avec la touche "tabulation avant" quand j'utilise la protection/déprotection des champs qui suivent (Enabled à False ou True).

    J'utilise une forme de test, avec respectivement les champs suivants :
    - ComboBox1 (Style = csDropDown)
    - Edit1,
    - Edit2,
    - ComboBox2 (Style = csDropDown).

    Traitement dans ComboBox1Exit :
    Si ComboBox1.Text est saisi :
    Edit1.Enabled := True;
    Edit2.Enabled := True;
    sinon (ComboBox1.Text non saisi = '')
    Edit1.Enabled := False;
    Edit2.Enabled := False;

    Edit1.Enabled et Edit2.Enabled sont au départ initialisés à False.
    Quand je sors de ComboBox1Exit après saisie, par la touche "tabulation avant", le curseur se positionne sur ComboBox2, il devrait logiquement se positionner sur Edit1. Pourtant Edit1 et Edit2 sont bien accessibles avec le curseur.
    Quelqu'un aurait-il une idée : comment faire pour que le curseur se positionne sur Edit1 en sortant de ComboBox1 par la touche "tabulation avant" ?

    Merci d'avance pour votre aide.

    Source "test.pas" :
    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
    unit Test;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TFrmTest = class(TForm)
        ComboBox1: TComboBox;
        ListBox1: TListBox;
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        ComboBox2: TComboBox;
        procedure FormShow(Sender: TObject);
        procedure ComboBox1Exit(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      FrmTest: TFrmTest;
     
    implementation
     
    {$R *.dfm}
    //---------------------------------------------------------------------------------------------------------------------------------------------------------
    procedure TFrmTest.FormShow(Sender: TObject);
    begin
      ComboBox1.Clear;
      ComboBox1.Items.Insert(ComboBox1.Items.Count, 'a');
      ComboBox1.Items.Insert(ComboBox1.Items.Count, 'b');
      ComboBox2.Clear;
      ComboBox2.Items.Insert(ComboBox2.Items.Count, 'c');
      ComboBox2.Items.Insert(ComboBox2.Items.Count, 'd');
      ComboBox2.Items.Insert(ComboBox2.Items.Count, 'e');
      Edit1.Text    := '';
      Edit2.Text    := '';
      Edit1.Enabled := false;
      Edit2.Enabled := false;
    end;
    //---------------------------------------------------------------------------------------------------------------------------------------------------------
    procedure TFrmTest.ComboBox1Exit(Sender: TObject);
    begin
      if (ComboBox1.Text <> '') then
        begin
          Edit1.Enabled := true;
          Edit2.Enabled := true;
        end
      else
        begin
          Edit1.Enabled := false;
          Edit2.Enabled := false;
        end;
    end;
    //----------------------------------------------------------------------------------------------------------------------------------------------------
    end.
    Source "test.dfm" :
    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
    object FrmTest: TFrmTest
      Left = 390
      Top = 168
      Width = 393
      Height = 219
      Caption = 'FrmTest'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnShow = FormShow
      PixelsPerInch = 96
      TextHeight = 13
      object ComboBox1: TComboBox
        Left = 8
        Top = 24
        Width = 353
        Height = 21
        AutoComplete = False
        ItemHeight = 13
        TabOrder = 0
        Text = 'ComboBox1'
        OnExit = ComboBox1Exit
      end
      object Edit1: TEdit
        Left = 8
        Top = 64
        Width = 121
        Height = 21
        TabOrder = 1
        Text = 'Edit1'
      end
      object Edit2: TEdit
        Left = 8
        Top = 104
        Width = 121
        Height = 21
        TabOrder = 2
        Text = 'Edit2'
      end
      object ComboBox2: TComboBox
        Left = 8
        Top = 144
        Width = 353
        Height = 21
        ItemHeight = 13
        TabOrder = 3
        Text = 'ComboBox2'
      end
    end
    Source "TestsDelphi.dpr" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    program TestsDelphi;
     
    uses
      Forms,
      Test in 'Test.pas' {FrmTest};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.CreateForm(TFrmTest, FrmTest);
      Application.Run;
    end.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 955
    Points
    40 955
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    à essayer
    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
    procedure TFrmTest.ComboBox1Exit(Sender: TObject);
    begin
      if (ComboBox1.Text <> '') then
        begin
          Edit1.Enabled := true;
          Edit1.SetFocus;
          Edit2.Enabled := true;
        end
      else
        begin
          Edit1.Enabled := false;
          Edit2.Enabled := false;
        end;
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    Bonsoir,

    Il s'agit ici d'une forme de test avec une suite de 4 champs consécutifs que nous avons repris d'une forme plus complexe en cours de tests et composée de champs supplémentaires.
    Le SetFocus conviendrait si on sortait toujours par "tabulation avant", mais dans la forme d'origine on peut aussi sortir en cliquant dans d'autres champs. Dans cette écran de test on peut aussi sortir en cliquant dans ComboBox2 mais le curseur se positionnera alors dans Edi1.

    J'ai l'impression qu'on va devoir monter une usine à gaz pour résoudre un dysfonctionnement de Delphi. Qu'en pensez-vous, ma remarque est-elle juste ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par momofr Voir le message
    J'ai l'impression qu'on va devoir monter une usine à gaz pour résoudre un dysfonctionnement de Delphi. Qu'en pensez-vous, ma remarque est-elle juste ?
    En aucun cas c'est dysfonctionnement mais un incompréhension du sens "Se produit quand la focalisation de saisie passe du contrôle à un autre contrôle. "

    C'est un problème d'ordre d'éxécution
    Lors du OnExit de ComboBox1Exit, il a déjà un nouveau control de destination selon TabOrder, TabStop et Enabled donc ComboBox2, donc les changement sont trop tard puisqu'il y a déjà un mouvement d'un controle à un autre
    Il est possible que le ActiveControl soit déjà ComboBox2 pour vérifier cela

    Change le Enabled dans le OnChange du ComboBox, cela n'aura pas d'impact de performance à la frappe pour gérer juste un <> '' et deux Enabled, même plus
    Un TTimer peut permettre de gérer un délai de prise en compte (avec une séquence Enabled := False; Enabled := True; pour relancer le délai)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    La solution la plus simple pour moi a été de répéter dans "ComboBox1Change" la même chose que dans "ComboBox1Exit", mais en inhibant dans "ComboBox1Change" les instructions "Application.MessageBox".

    Cela serait tellement plus simple, et tellement plus logique, si le control de destination n'était déterminé qu'en fin d'exécution de l'évènement Exit.
    Peut-être était-ce irréalisable pour les développeurs de Delphi (mais j'ai du mal à m'en persuader) ?
    Au lieu de ça il faut consacrer beaucoup de temps à se prendre la tête à biaiser pour résoudre une fonctionnalité technique aussi dérisoire.

    Merci à ShaiLeTroll et SergioMaster pour leur aide.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Citation Envoyé par momofr Voir le message
    Cela serait tellement plus simple, et tellement plus logique, si le control de destination n'était déterminé qu'en fin d'exécution de l'évènement Exit.
    Le changement de focus est géré par Windows et non par Delphi. L'ancien champ reçoit un WM_KILLFOCUS avec en paramètre le nouveau. L'OS a déjà déterminé le contrôle suivant avant même que ton app en soit notifiée.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 77
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci pour ces précisions, mais quelle qu'en soit l'origine : il est bien dommage d'avoir à biaiser pour résoudre une fonctionnalité technique aussi banale.

Discussions similaires

  1. [MySQL] Problème avec le single quote
    Par popcorn dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 02/12/2008, 23h44
  2. [Shell] Problème avec le Back-quote (ksh)
    Par bob94700 dans le forum Linux
    Réponses: 3
    Dernier message: 27/01/2008, 12h45
  3. Sudo problème avec les simples quotes
    Par Tronche dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 23/03/2007, 12h02
  4. [MySQL] Problème avec un double quote
    Par wormseric dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/01/2007, 14h44
  5. [VB6] Problème avec la touche 0 dans une MaskEdBox
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 02/03/2006, 09h47

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