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 :

donner le focus sur un composant dont la fenetre est invisib


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier Avatar de yoghisan
    Profil pro
    Inscrit en
    Février 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 172
    Points : 113
    Points
    113
    Par défaut donner le focus sur un composant dont la fenetre est invisib
    Bonjour,

    Voici mon code pour etre le plus clair possible

    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
    function MessageDglPersonnalise(Couleur: TColor; Defaut: integer): TColor;
    var Form : TForm;
        Image: TImage;
        RadioGroup : TRadioGroup;
    begin
      if not ((Defaut=1) or (Defaut=2)) then Defaut := 0;
     
      Form := CreateMessageDialog('Voulez-vous rendre cette couleur ('+ColorToString(Couleur)+')', mtWarning, [MbOk]);
     
      try
        // Image
        Image := TImage.Create(Form);
        Image.Parent := Form;
        Image.Width  := TImage(Form.FindComponent('Image')).Width;
        Image.Height := TImage(Form.FindComponent('Image')).Height;
        Image.Left   := TImage(Form.FindComponent('Image')).Left;
        Image.Top    := TImage(Form.FindComponent('Image')).Top;
        Image.Canvas.Brush.Color := Couleur;
        Image.Canvas.FillRect(rect(0,0,Image.width,Image.height));
     
        // Ajout d'un radiogroup dans la boite de dialogue.
        RadioGroup := TRadioGroup.Create(Form);
        RadioGroup.Parent := Form;
        RadioGroup.Caption := '';
        RadioGroup.Items.Clear;
        RadioGroup.Items.Add('de la même couleur');
        RadioGroup.Items.Add('blanche');
        RadioGroup.Items.Add('noire');
        RadioGroup.ItemIndex := Defaut;
        RadioGroup.Left   := TLabel(Form.FindComponent('Message')).Left;
        RadioGroup.Top    := Image.Top+TLabel(Form.FindComponent('Message')).Height+Image.Top;
        RadioGroup.Width  := 129;
        RadioGroup.Height := 73;
     
        // Bouton OK
        TButton(Form.FindComponent('Ok')).Top := Image.Top+TLabel(Form.FindComponent('Message')).Height
                                                +Image.Top+RadioGroup.Height+Image.Top;
     
        // Forme
        Form.ClientHeight := Image.Top+TLabel(Form.FindComponent('Message')).Height
                            +Image.Top+RadioGroup.Height
                            +Image.Top+TButton(Form.FindComponent('Ok')).Height+Image.Top;
        Form.Position := poScreenCenter;
        if RadioGroup.CanFocus then RadioGroup.SetFocus;
        Form.ShowModal;
        case RadioGroup.ItemIndex of
          1 : Result := ClWhite;
          2 : Result := ClBlack;
          else Result := Couleur;
        end;
      finally
        Image.Free;
        RadioGroup.Free;
        Form.Release;
      end;
    end;
    J'ai un message d'erreur suivant :
    "Impossible de focaliser sur une fenetre desactivée ou invisible"

    L'erreur vient de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        if RadioGroup.CanFocus then RadioGroup.SetFocus;
    Vous pouvez m'expliquer comment je fais pour que lorsque mon message dialogue apparait je puisse directement avec les touches changer l'ItemIndex de mon RadioGroup sans devoir cliquer sur le RadioGroup pour lui donner le focus ?

    Je tourne en depuis trop longtemps...

    Merci

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    D'abord, donner le focus à un TRadioGroup n'a aucun effet visuel.
    Mais si tu y tiens vraiment, tu peux éventuellement passer par ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //if RadioGroup.CanFocus then RadioGroup.SetFocus;
    Form.ActiveControl := RadioGroup;
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre régulier Avatar de yoghisan
    Profil pro
    Inscrit en
    Février 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 172
    Points : 113
    Points
    113
    Par défaut
    Oui, j'y tiens absolument pour une plus grande rapidité d'execution lorsque l'on te pose plusieurs fois la question d'affilée...

    Et, ca ne marche pas...

  4. #4
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Citation Envoyé par yoghisan
    Et, ca ne marche pas...
    Essaye sur une fiche simple. Utilise SetFocus sur un RadioGroup que tu auras posé. Tu verras, il n'y a aucun effet visuel.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Comme te dis delphi, tu ne peux pas mettre le Focus sur un composant invisible.
    En l'occurence, c'est ce que tu essaye de faire, juste avant de faire Form.showModal;

    Donc...

    tu crée une procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure MonFormShow(Sender: TObject);
    begin
      if Assigned(RadioGroup) then RadioGroup.SetFocus;
    end;
    et juste après ton try (après la création de la fiche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form.OnShow:=MonFormShow;
    ça devrait marcher sans râler
    Bidouilleuse Delphi

  6. #6
    Membre régulier Avatar de yoghisan
    Profil pro
    Inscrit en
    Février 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 172
    Points : 113
    Points
    113
    Par défaut
    Comment j'insere ta procedure dans ma fonction ?

    Je ne sais si je m'exprime bien... Je vais essayer, je ne maitrise pas le vocabulaire adéquat...
    J'ai une probleme de reconnaissance de ta procedure car ma fonction n'est "déclaré".

    Tu comprends mon probleme ?

    J'ai essaye ca mais ca ne marche...

    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
    function MessageDglPersonnalise(Couleur: TColor; Defaut: integer): TColor;
    var Form : TForm;
        Image: TImage;
        RadioGroup : TRadioGroup;
     
      procedure MonFormShow(Sender: TObject);
      begin
        if Assigned(RadioGroup) then RadioGroup.SetFocus;
      end;
     
    begin
      if not ((Defaut=1) or (Defaut=2)) then Defaut := 0;
     
      Form := CreateMessageDialog('Voulez-vous rendre cette couleur ('+ColorToString(Couleur)+')', mtWarning, [MbOk]);
     
      try
        // Image
        Image := TImage.Create(Form);
        Image.Parent := Form;
        Image.Width  := TImage(Form.FindComponent('Image')).Width;
        Image.Height := TImage(Form.FindComponent('Image')).Height;
        Image.Left   := TImage(Form.FindComponent('Image')).Left;
        Image.Top    := TImage(Form.FindComponent('Image')).Top;
        Image.Canvas.Brush.Color := Couleur;
        Image.Canvas.FillRect(rect(0,0,Image.width,Image.height));
     
        // RadioGroup
        RadioGroup := TRadioGroup.Create(Form);
        RadioGroup.Parent := Form;
        RadioGroup.Caption := '';
        RadioGroup.Items.Clear;
        RadioGroup.Items.Add('de la même couleur');
        RadioGroup.Items.Add('blanche');
        RadioGroup.Items.Add('noire');
        RadioGroup.ItemIndex := Defaut;
        RadioGroup.Left   := TLabel(Form.FindComponent('Message')).Left;
        RadioGroup.Top    := Image.Top+TLabel(Form.FindComponent('Message')).Height+Image.Top;
        RadioGroup.Width  := 129;
        RadioGroup.Height := 73;
     
        // Bouton OK
        TButton(Form.FindComponent('Ok')).Top := Image.Top+TLabel(Form.FindComponent('Message')).Height
                                                +Image.Top+RadioGroup.Height+Image.Top;
     
        // Form
        Form.OnShow := MonFormShow;
        Form.ClientHeight := Image.Top+TLabel(Form.FindComponent('Message')).Height
                            +Image.Top+RadioGroup.Height
                            +Image.Top+TButton(Form.FindComponent('Ok')).Height+Image.Top;
        Form.Position := poScreenCenter;
        Form.ShowModal;
     
        case RadioGroup.ItemIndex of
          1 : Result := ClWhite;
          2 : Result := ClBlack;
          else Result := Couleur;
        end;
      finally
        Image.Free;
        RadioGroup.Free;
        Form.Release;
      end;
    end;

  7. #7
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 100
    Points : 53
    Points
    53
    Par défaut
    Déjà tu dois déclarer ta procédure en public ou privé (à toi de voir )
    puis tu dois mettre ta procédure en dehors de ta fonction et tu dois faire appel à elle de la facon suivante cette fois ci dans ta fonction comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonFormShow(self);
    je suis pas très doué mais essaye toujours ca

  8. #8
    Membre régulier Avatar de yoghisan
    Profil pro
    Inscrit en
    Février 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 172
    Points : 113
    Points
    113
    Par défaut
    Si je sors ta procedure de ma fonction, il ne connait plus RadioGroup puisque c'est une composant propre uniquement à ma fonction. C'est pour ca que je l'avais mis dedans.

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    au lieu d'avoir une fonction qui crée un dialogue, utilise un TFrame pour simplifier to pb et permettre l'habillage qui te convient
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre confirmé
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Décembre 2004
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms

    Informations forums :
    Inscription : Décembre 2004
    Messages : 532
    Points : 494
    Points
    494
    Par défaut
    pourqoi compliqué la vie si en a plus fassile
    tu peut crée une fome de type dialog et faire se que tu veux dedans
    mais si tu tien a votre méthode
    alors (je sais pas si sa peut marché) mais envoit un message avec postemessage a votre controle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    postmessage(RadioGroup.handle,wm_setfocus,0,0);
    form.showvbmodal;
    bien sur a vérifié ce wm_setfocus

  11. #11
    Membre régulier Avatar de yoghisan
    Profil pro
    Inscrit en
    Février 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 172
    Points : 113
    Points
    113
    Par défaut
    Non, ca ne marche pas non plus.

    Je sais qu'il y a d'autres solutions, MD les a dit dès le début mais la problèmatique m'intéressait...

    Mais je ne sais pas sur ma question a été bien comprise car je ne suis pas sûr que le mot focus a le sens que je lui donne... C'est ca d'être un amateur autodidacte...

    Merci à tous.

  12. #12
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Bon, on va essayer d'éclaircir un peu la discussion.
    1 - Il n'est pas possible de donner le focus à un contrôle qui n'est pas visible. Donc tant que la fenêtre n'est pas visible, tu ne peux pas utiliser SetFocus. Par contre, tu peux utiliser la propriété ActiveControl de la fenêtre (comme ça a déjà été évoqué) pour déclarer le contrôle qui doit recevoir le focus lorsque la fenêtre est affichée.
    2 - Sur la notion de focus. Un contrôle fenêtré qui a le focus (qui est focalisé) reçoit les événements clavier. Pour que l'utilisateur puisse le repérer, il est légérement modifié visuellement. En général c'est une rectangle en pointillés qui entoure le contrôle.
    3 - Donner le focus a un TRadioGroup ne sert à rien car un TRadioGroup ne prend jamais le focus en cours d'exécution. Par contre, ce que tu veux faire yoghisan, c'est donner le focus à un des boutons radio (le 1er par exemple). Ceux-ci sont accessibles par la propriété indexée Buttons.

    Donc, en repartant du code original, cela devrait nous donner ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Form.Position := poScreenCenter; 
        Form.ActiveControl:= Form.RadioGroup.Buttons[0];
        Form.ShowModal;

  13. #13
    Membre régulier Avatar de yoghisan
    Profil pro
    Inscrit en
    Février 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 172
    Points : 113
    Points
    113
    Par défaut
    Nickel ! Merci à tous.
    La plupart vous etiez pas loin de la réponse, moi j'étais largué...

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

Discussions similaires

  1. [Toutes versions] Mettre le focus sur un champ dont le nom est contenu dans une variable
    Par possible924 dans le forum VBA Access
    Réponses: 2
    Dernier message: 07/04/2015, 21h32
  2. donner le focus sur un champ lorsque un popup est ouvert
    Par john_wili dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/11/2009, 14h10
  3. comment donner le focus a un composant JTexrField
    Par inter_amine dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 23/01/2007, 21h19
  4. donner le focus sur la fenetre d application active
    Par nick974 dans le forum Delphi
    Réponses: 1
    Dernier message: 02/07/2006, 12h11
  5. Donner le focus a un composant
    Par faico dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 17/06/2006, 13h00

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