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

  1. #1
    Membre éprouvé
    Conditions imbriquées avec D6 et Windows10 64bits
    Bonsoir à toutes et à tous,

    Avec 2 TRadioButton rbaudio et rbtitre, j'aimerai ajouter une condition qui s'ajoute aux 2 autres.

    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
     
    procedure TFTest.Btn_ExecuterClick(Sender: TObject);
     Var
     aCmdLine : PChar;
    begin 
     
    if rbaudio.Checked then begin 
     
     aCmdLine := //1ère condition et l'instruction de base
     
    ........
     
    ........
     
     end else begin  
     
    aCmdLine := sinon 2ième condition et une autre instruction
     
    ..........
     
    ..........
     
    end;
    end;


    Mais si je choisis le titre par défaut en laissant mon Tedit vide, j'ai "rbtitre.checked" (3ième condition) pour que cela fonctionne, il faut que le code soit conservé et uniquement le code de la commande "acmdLine" change.

    J'ai essayé avec un and ou or mais problème.

    Si quelqu'un avait une idée merci d'avance.

    @+,

    cincap

  2. #2
    Membre confirmé
    Salut Cincap,

    J'ai besoin d'un peu de clarté pour comprendre ce que tu souhaites faire.

    A bientôt.
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  3. #3
    Membre éprouvé
    @ petitcoucou31, merci de ta réponse.

    En fait le code pour les deux conditions fonctionne et je dois le garder même si "rbtitre" est coché.

    Par conséquent seul le code de la commande "aCmdline" sera différent si je coche "rbtitre".

    Donc "aCmdline" à 3 instructions différentes.

    Je ne sait pas expliquer plus.

    J'avais pensé à ajouter un "case".

    @ +,

    cincap

  4. #4
    Modérateur

    Bonjour,
    Si aucun ou l'un seulement des boutons radio peuvent être activés simultanément, le code suivant devrait fonctionner pour les 3 cas possibles :
    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
    procedure TFTest.Btn_ExecuterClick(Sender: TObject);
     Var
     aCmdLine : PChar;
    begin 
     
    if rbaudio.Checked then begin 
     
     aCmdLine := //1ère condition et l'instruction de base
     
    ........
     
    ........
     
     end else if rbTitre.Checked then begin 
     
     aCmdLine := //2ème condition et une autre instruction
     
    ........
     
    ........
     
     end else begin  
     
    aCmdLine := sinon 3ième condition et une autre instruction
     
    ..........
     
    ..........
     
    end;
    end;
    Delphi 5 Pro - Delphi 10.3.2 Rio 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 !

  5. #5
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ tourlourou, merci pour ta suggestion, cela ne fonctionne pas mais c'est de ma faute car :

    Je pense que je dois utiliser deux "TRadioButton" et un "TCheckBox" pour "Rbtitre".

    Car "RBaudio" doit fonctionner seul ou avec "RBTitre" et si "RBaudio" n'est pas checked, "RBvideo" l'est et doit aussi fonctionner seul ou avec "RBTitre".

    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
     
     
    procedure TFTest.Btn_ExecuterClick(Sender: TObject);
     Var
     aCmdLine : PChar;
    begin 
     
    if RBaudio.Checked then begin 
     
     aCmdLine := //1ère condition et l'instruction de base
     
    ........
     
    ........
     
     end else begin  //Soit RBvideo est checked
     
    aCmdLine := sinon 2ième condition et une autre instruction
     
    ..........
     
    ..........
     
    end;
    end;


    C'est comme si il y aurait 4 conditions puisque si RBtitre est checked "aCmdLine" change

    Pas facile de l'exprimer.

    Je teste aussi de mon côté !

    @+,

    cincap

  6. #6
    Rédacteur/Modérateur

    Les IfThen n'existaient pas sous D6 ?
    Comme, si j'ai bien compris et en me souvenant des autres discussions il s'agit de "bâtir" une ligne de commande ce IfThen (voir dans StrUtils) serait hyper pratique
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #7
    Expert confirmé
    Citation Envoyé par SergioMaster Voir le message
    Les IfThen n'existaient pas sous D6 ?
    Si, si (StrUtils et Math).
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. Écrivez dans un français correct !!

    Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Interbase (7 - XE) - PostgreSQL 11.6

  8. #8
    Membre éprouvé
    Voila ceci fonctionne :

    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
     
     if rbaudio.Checked and not rbTitre.Checked then begin
     
     aCmdLine :=1ère condition
     
    end else if rbaudio.Checked and rbTitre.Checked then begin
     
     
     aCmdLine := 2ième condition
     
    if rbvidéo.Checked and not rbTitre.Checked then begin
     
     aCmdLine :=3ième condition
     
    end else if rbvidéo.Checked and rbTitre.Checked then begin
     
     
     aCmdLine := 4ième condition


    Je dois encore adapter les fonctions des Tbutton et ok.

    Maintenant il y a peut être une solution plus correcte.

    Entre le jardin et le repos, je verrai.

    @+,

    cincap

  9. #9
    Membre actif
    Bonjour,
    En automatisme, pour être plus générique (dans le cas où une 3eme ou nieme condition serait ajoutée), il serait plus intéressant de convertir un tableau de boolean (1 bit par condition), en Integer.
    L'utilisation de l'integer serait alors plus lisible.
    A voir si une fonction similaire a déjà été écrite ??
    Cordialement,
    Windows 7 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  10. #10
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ Gallet, merci pour ta suggestion, je ne l'ai jamais fait mais c'est fort possible que je gagnerai de la vitesse dans le code.

    Mon dernier test fonctionne correctement et l'application est terminée donc je peux fermer ce topic.

    Merci à tous et bon confinement.

    Cordialement,

    cincap

  11. #11
    Membre émérite
    Bonjour Cincap,

    Est ce que ceci ne serait pas plus simple et plus clair :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Btn_ExecClick(Sender: TObject);
    Var
      aCmdLine : String ;
    begin
      aCmdLine := 'Aucune condition' ;
      if rbaudio.Checked Then
          If not rbTitre.Checked Then aCmdLine := '1ère condition'
                                 Else aCmdLine := '2ième condition'
      else
          If not rbTitre.Checked Then aCmdLine := '3éme condition'
                                 Else aCmdLine := '4ième condition' ;
      ShowMessage(aCmdLine) ;
    end;


    Si c'est bien ce que tu veux ?

    A+
    Charly

  12. #12
    Membre éprouvé
    @ Charly910, bonjour et merci de ta suggestion, j'ai testé et j'obtiens une erreur :

    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
     
     
     if rbaudio.Checked Then
          If not rbTitre.Checked Then aCmdLine := //'1ère condition'
     ..…..
     
     Statusbar1.Hint := acmdline;
     ShellExecute(Handle, nil, 'CMD', pchar(aCmdLine), nil, SW_HIDE);
     
     timer2.Enabled := true;
     timer3.Enabled := true
     
     end //Rajouter
     
      Else aCmdLine := //'2ième condition'
    …………..
    ………………………...


    Le compilateur indique qu'il manque un "end" et pourtant je l'ai rajouté.

    Je regarderai après car j'ai de la visite avant midi (Barbecue).

    Bon jour férié.

    Désolé, j'avais chaque fois oublié le "begin" comme il y avait d'autres actions pour chaque conditions donc j'ai pu compilé.

    Je testerai.

    Cordialement,

    cincap

  13. #13
    Membre actif
    Bonjour,
    Un petit code de conversion écrit un peu rapidement avec des CheckBox (pour être indépendants)...


    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
    function ConvBoolArrayToInt(bDonnee: Array of boolean): Integer;
    var
      nIdx: Integer;
      nResult: Integer;
      nPower: Integer;
    begin
      nResult := 0;
      nPower := 1;
      for nIdx := 0 to length(bDonnee) - 1 do
      begin
        if bDonnee[nIdx] then
          nResult := nResult + nPower;
        nPower := nPower * 2;
      end;
     
      result := nResult;
    end;
     
    procedure TForm1.CheckBox1Click(Sender: TObject);
    var
      nIdx: Integer;
    begin
      // Reset du tableau
      for nIdx := 0 to length(BoolArray) - 1 do
        BoolArray[nIdx] := false;
     
      // Chargement etats visuels
      BoolArray[0] := CheckBox1.Checked;
      BoolArray[1] := CheckBox2.Checked;
      BoolArray[2] := CheckBox3.Checked;
     
      // Conversion et affichage
      Label1.Caption := IntToStr(ConvBoolArrayToInt(BoolArray));
    end;


    Il suffit ensuite d'utiliser un Case Of sur le résultat.

    Belle journée à tous
    Windows 7 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  14. #14
    Membre émérite
    Si tu veux plusieurs lignes pour chaque condition, ila faut ajouter des Begin End

    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
    procedure TForm1.Btn_ExecClick(Sender: TObject);
    Var
      aCmdLine : String ;
    begin
      aCmdLine := 'Aucune condition' ;
      if rbaudio.Checked Then
          If not rbTitre.Checked Then
            Begin
              aCmdLine := '1ère condition' ;
              Statusbar1.Hint := acmdline;
    //           ShellExecute(Handle, nil, 'CMD', pchar(aCmdLine), nil, SW_HIDE);
    //           timer2.Enabled := true;
    //           timer3.Enabled := true
            End
        Else
          Begin
            aCmdLine := '2ième condition' ;
    //      Bla Bla Bla
          End        
      else
          If not rbTitre.Checked Then
            Begin
              aCmdLine := '3éme condition' ;
             // Ligne suivante
            End
          Else
            Begin
              aCmdLine := '4ième condition' ;
              // Ligne suivante
            End ;          
      ShowMessage(aCmdLine) ;
    end;


    Bonne digestion pour le barbecue !!

    A+
    Charly

  15. #15
    Membre émérite
    @ Galet :

    Bien ton petit automate. Mais je crois que pour Cincap, rbAudio et rbVideo sont exclusifs, et il faut conserver des RadioButtons ?
    (ce qui ne change rien à ton code qui est très général et peut s'étendre à n conditions)

    A+
    Charly

    PS : tu as oublié d'allouer la taille de BoolArray ?

  16. #16
    Membre actif
    Ce principe est très utilisé en automatisme.
    J'avais déclaré un tableau avec une dimension de 5 pour garder de la marge mais on peut monter jusqu'à 32..ou 64.
    Le passage par un tableau peut être supprimé mais dans ce cas, l'ajout d'une condition supplémentaire impose un changement du code => moins générique

    Pour ma culture, quelle est l'interêt du RadioButton non exclusif par rapport au CheckBox ?
    Belle journée à tous,
    Windows 7 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  17. #17
    Membre émérite
    Bonsoir,

    il me semble que les RadioButtons sont systématiquement exclusifs quand on en pose 2 ou plus sur une Form. On peut aussi faire plusieurs groupes qui fonctionnent ensembles (dans des TRadioGroup ou des TPanel).

    Un RadioButton unique doit être équivalent à une case à cocher.

    Pour Cincap, je pense que c'est Audio ou Vidéo, mais pas les 2 ? et je suis parti du principe que si l'un était coché, l'autre était décoché.

    A+
    Charly

  18. #18
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ Galet, merci de ta suggestion c'est toujours noté.

    @ Charly910, merci aussi de ton exemple cela fonctionne correctement:


    Si tu veux plusieurs lignes pour chaque condition, il faut ajouter des Begin End
    Mais oui je m'en étais rendu compte, je l'avais noté de suite après avoir posté mes remarques :


    Désolé, j'avais chaque fois oublié le "begin" comme il y avait d'autres actions pour chaque conditions donc j'ai pu compilé.

    Pour Cincap, je pense que c'est Audio ou Vidéo, mais pas les 2 ? et je suis parti du principe que si l'un était coché, l'autre était décoché.
    Exactement c'était ce comportement que je devais avoir et c'est pour cette raison que j'ai utilisé 2 "TRadioButton pour RBAudio et RBVideo" et 1 "TCheckBox pour RBTitre" placé tous les 3 dans 1 "TGgroupBox", l'apparence est différente mais en utilisant un Skin, on ne le voit pas.

    Merci à tous pour votre précieux temps.

    Cordialement,

    cincap

  19. #19
    Membre régulier
    Salut,
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Btn_ExecClick(Sender: TObject);
    var
      I : Byte;
    begin
      I := Byte(rbaudio.Checked) + Byte(rbvideo.Checked) shl 1 + Byte(rbTitre.Checked) shl 2;
      case I of
        1 : ShowMessage(Format('Condition 1 => valeur %d',[I]));
        2 : ShowMessage(Format('Condition 3 => valeur %d',[I]));
        5 : ShowMessage(Format('Condition 2 => valeur %d',[I]));
        6 : ShowMessage(Format('Condition 4 => valeur %d',[I]));
      else
         ShowMessage(Format('Aucunes conditions cochées => valeur %d',[I]));
      end;
    end;
    @+

  20. #20
    Membre éprouvé
    Bonjour à toutes et à tous,

    @ nuxtay, merci de ta réponse, j'ai testé et cela fonctionne correctement.

    Naturellement pour chaque condition, cela ne se limite pas à un showmessage() car j'ai des instructions supplémentaires.

    Ce qui compte c'est de respecter l'ordre des conditions et c'est que cela fonctionne donc super code.

    @+,

    cincap