Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Futur Membre du Club
    Homme Profil pro armindo simao
    Technicien maintenance
    Inscrit en
    novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Nom : Homme armindo simao
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : novembre 2012
    Messages : 50
    Points : 19
    Points
    19

    Par défaut appel et passage de parametres

    Re bonsoir
    desolé de monopoliser cette rubrique mais je bloque et je vais faire dodo..
    alors si ...

    voilà mon souci,

    j'ai "développé" mon petit exercice et là de nouveau coincé (oui je sais c'est une habitude )
    cet exercice était de créer un graphique avec une sinusoïde, les axes xy avec l’échelle. ca c'est fait!

    maintenant j'ai ajouté 2 bouton (frequence + et -)
    comment faire pour passer la variable "frequence" que je modifie?
    je n'arrive pas après avoir modifié celle-ci a rappeler la "procedure TForm1.BoiteDessinPaint(Sender: TObject);"

    voici le code que j'ai déjà réaliser (je sais on peut faire mieux, mais pour l'instant....)

    Merci


    Code :
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
     
        BoiteDessin: TPaintBox;
     
        LabelResultat: TLabel;
        Label1Y: TLabel;
        Label1X: TLabel;
        Label0: TLabel;
        FrequenceMoins: TButton;
        Frequenceplus: TButton;
     
        procedure BoiteDessinClick(Sender: TObject);
        procedure BoiteDessinPaint(Sender: TObject);
        procedure FrequenceMoinsClick(Sender: TObject);
        procedure FrequenceplusClick(Sender: TObject);
     
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      frequence : Integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.BoiteDessinClick(Sender: TObject);
    var x, y,z :integer;
    begin
     
    end;
     
    procedure TForm1.BoiteDessinPaint(Sender: TObject);
    var x, y,z : Extended;
        GX,GY,pasW,pasH,EchelleX,EchelleY :  integer;
        W,W2,H,H2, repere   : Integer;
        depart : array [1..2] of integer;
        arrive : array [1..2] of integer;
        first : boolean;
    begin
          EchelleX :=50;
          EchelleY :=50;
          W:= BoiteDessin.Width;
          H:=BoiteDessin.Height;
          PasW := w div 10;
          Pash := H div 10;
          W2 := W Div 2;
          H2:=  H div 2;
          x:=0;
          y:=0;
          z:=0  ;
            depart[1]:=0;
            depart[2]:=0;
            first:= true;
          Form1.Caption:= 'Fréquence = ' + IntToStr (frequence) + ' Hz';
          boiteDessin.Canvas.MoveTo(W2,0);    { axe des y }
          BoiteDessin.canvas.lineto(W2,H);
          Label1Y.Caption := 'Axe Y';
     
           for  repere := 1 to (H div echelleY)   do
          begin
              if  ((H div (2*echelleY))-repere+1 ) <>0 then
              BoiteDessin.canvas.TextOut(w2-4,(repere*echelleY),   {echelle Y}
                            IntToStr( (H div (2*echelleY))-repere+1 ));
         end;
         for  repere := 1 to (W div echelleX)   do
         begin
              BoiteDessin.canvas.TextOut((repere*EchelleX),h2-10,   {echelle x}
                       IntToStr(repere-(w div (2*echelleX))));
         end;
         boiteDessin.Canvas.MoveTo(0,H2);    { axe des x}
         BoiteDessin.canvas.lineto(W,H2);
         Label1X.Caption := 'Axe X';
         For GX := 0 TO W do
         Begin
             x:= frequence*PI/W*GX-PI;
             y := sin(x);
             GY := round(-W/2/PI*Y+H/2);
             arrive[1] := GY;
             arrive[2] := GX;
             if first then
             begin
                  depart[1] := GY;
                  depart[2] := GX;
                  first := false;
                  BoiteDessin.Canvas.MoveTo(depart[2],depart[1])
              end;
              BoiteDessin.canvas.lineto(arrive[2],arrive[1]);
              depart[1]:=arrive[1];
              depart[2]:=arrive[2];
          End;
    end;
     
    procedure FrequenceMoins(Sender: TObject);
    begin
     
    end;
     
    procedure TForm1.FrequenceMoinsClick(Sender: TObject);
    begin
            dec(frequence);
              if frequence <1 then frequence :=1;
    end;
         procedure TForm1.FrequenceplusClick(Sender: TObject);
    begin
            inc(frequence);
     
    end;
    begin
        frequence :=10;
     
     
    end.

  2. #2
    Membre à l'essai
    Inscrit en
    février 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 41
    Points : 20
    Points
    20

    Par défaut

    Si le but est juste de rappeler la procédure BoiteDessinPaint :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure TForm1.FrequenceMoinsClick(Sender: TObject);
    begin
            dec(frequence);
              if frequence <1 then frequence :=1;
            BoiteDessinPaint(nil); //<== appelle de la procédure pour -
    end;
         procedure TForm1.FrequenceplusClick(Sender: TObject);
    begin
            inc(frequence);
            BoiteDessinPaint(nil);  //<== appelle de la procédure pour +
    end;
    Pas sur d'avoir tout compris mais si ca peut t'aider

  3. #3
    Futur Membre du Club
    Homme Profil pro armindo simao
    Technicien maintenance
    Inscrit en
    novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Nom : Homme armindo simao
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : novembre 2012
    Messages : 50
    Points : 19
    Points
    19

    Par défaut

    Citation Envoyé par yvonic2010 Voir le message
    Si le but est juste de rappeler la procédure BoiteDessinPaint :

    Code :
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.FrequenceMoinsClick(Sender: TObject);
     
     ******
            BoiteDessinPaint(nil);  //<== appelle de la procédure pour +
    end;
    Pas sur d'avoir tout compris mais si ca peut t'aider
    si c'est ce que je cherchait!! merci!
    mais comment savoir qu'il fallait mettre ce nil?? je ne l'ai pas encore rencontré!!

    Merci a toi, ça m'a bien débloqué!!

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro Yves Lemaire
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    2 134
    Détails du profil
    Informations personnelles :
    Nom : Homme Yves Lemaire
    Âge : 51
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : mars 2005
    Messages : 2 134
    Points : 4 120
    Points
    4 120

    Par défaut

    Les procédures qui réagissent aux événements des composants ont un paramètre Sender qui permet de savoir qui appelle la procédure.

    Exemple : j'ai 3 boutons qui servent à afficher chacun une image différente dans le même composant TImage. Je les fais pointer sur la même procédure de traitement du Click car le traitement est le même. Il suffit d'identifier le Sender (if Sender is Button1 then... ) pour le traitement variable.

    Et quand on n'a pas besoin de connaître l'appelant, comme il faut bien passer le paramètre attendu à l'événement, on remplace par nil qui est la valeur non assignée d'un pointeur, ou vide d'un objet.

    Si jamais le code de l'événement utilise le Sender sans avoir testé qu'il soit bien assigné, ça entraînera une violation d'accès : on essaie de faire fonctionner un objet inexistant. (Dans ce cas, tester : if Assigned(Sender) and (Sender is TButton) then TButton(Sender).Click; : teste qu'il soit assigné, que ce soit bien un bouton, puis déclenche le Click de cet objet en indiquant que c'est bien un bouton, et qu'il dispose de ses méthodes).
    Delphi 5 Pro et Code Typhon 4.41 sous Win 7 64 bits - Code Typhon 4.50 sous Ubuntu 12.04 64 bits (VM)

  5. #5
    Futur Membre du Club
    Homme Profil pro armindo simao
    Technicien maintenance
    Inscrit en
    novembre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Nom : Homme armindo simao
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : novembre 2012
    Messages : 50
    Points : 19
    Points
    19

    Par défaut

    Merci pour l'explication !
    ça explique pas mal de choses.

    c'est quand même bizarre quand dans les 4 ou 5 tutoriaux que j'ai déjà lu et/ou survolé, je n'aie rien vu concernant ces appels de procédures.

    Cdt

  6. #6
    Membre à l'essai
    Inscrit en
    février 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : février 2008
    Messages : 41
    Points : 20
    Points
    20

    Par défaut

    Si tu as besoin de passer des paramètres dépendant de l'appelant, tu peux utiliser "self" à la place de "nil", comme ça via le if donné par tourlourou tu peux appliquer différents paramètres via le Sender.

    En gros, dans la majeure partie des cas faut utiliser "nil" (moi je préfère faire une procédure pour chaque appelant, quand il y en a peu ça clarifie les choses), après on peut utiliser "self" voire même "Application" si on veut un peu pousser les choses.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •