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

Langage Delphi Discussion :

Gérler de multiples déclarations


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 32
    Points : 29
    Points
    29
    Par défaut Gérler de multiples déclarations
    Bonjour, je dois gérer, avec les mêmes fonctions et procedures, plusieurs ports série dans une même application.
    J'utilise TComPort que je dépose ex. 3 fois sur une forme.
    Donc il est déclaré:
    ComPort1: TComPort;
    ComPort2: TComPort;
    ComPort3: TComPort;

    Dans le code, j'ai des procédures tel:
    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 TfmMain.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
      Chaine: String;
      Prem, Dern: Integer;
    begin
      ComPort1.ReadStr(Chaine, Count);
      EditStrRcv.Text := Chaine;
      Application.ProcessMessages;
     
      // Le controleur a répondu donc on décrémente
      Dec(nRepond);
     
      // // dCommId contient un code de commande valide ou pas si = 0
      if dCommId = 1 then // demande de data pour la BD %/
      begin
        if (Copy(Chaine, 1, 1) = '%') and (Copy(Chaine, Length(Chaine) - 2, 1) = '/') then
        begin
          StrRcv := Chaine;
        end
        else
        begin
          StrRcv := '';
        end;
      end;
    end;
    Cette procédure est spécifique à TComPort1.
    Voilà mon point, est-il possible d'utiliser une "macro" ou une supervariable qui contiendrait TComPort1|2|3 comme valeur ou pointeur, devrais-je dire ?
    afin de m'éviter de dupliquer cette procédure pour chaque TComPort.

    J'espère que je suis clair. Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Je peux me gourer, mais il me semble que tu abordes le problème à l'envers...

    Plusieurs solution
    - Faire un composant dans lequel tu identifies quel est ton port com
    ou encore ->
    - Déclarer tes procédures avec comport comme paramètre :
    procedure TfmMain.ComPort1RxChar(Sender: TObject; Count: Integer; zeComPort:TComPort);

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    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
     
    procedure TfmMain.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
      Chaine: String;
      Prem, Dern: Integer;
     
      Cp: TComport;
    begin
     
      Cp := TComport(Sender);
     
      Cp.ReadStr(Chaine, Count);
      EditStrRcv.Text := Chaine;
      Application.ProcessMessages;
     
      etc.
     
      ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Comport1.RxChar := Self.ComPort1RxChar;
      Comport2.RxChar := Self.ComPort1RxChar;
      Comport3.RxChar := Self.ComPort1RxChar;

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 32
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    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
     
    procedure TfmMain.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
      Chaine: String;
      Prem, Dern: Integer;
     
      Cp: TComport;
    begin
     
      Cp := TComport(Sender);
     
      Cp.ReadStr(Chaine, Count);
      EditStrRcv.Text := Chaine;
      Application.ProcessMessages;
     
      etc.
     
      ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Comport1.RxChar := Self.ComPort1RxChar;
      Comport2.RxChar := Self.ComPort1RxChar;
      Comport3.RxChar := Self.ComPort1RxChar;
    Je m'explique un peu plus.
    procedure TfmMain.ComPort1RxChar(Sender: TObject; Count: Integer);
    est un procedure de TComPort donc chaque port associé à un des objets TComPort1/2/3 déclenche une procedure différente.
    TfmMain.ComPort1/2/3RxChar(Sender: TObject; Count: Integer);

    Finalement, je crois que le plus facile va être de gérer via ces 3 procedures directement.

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    et ça change quoi ? Le code est-il différent dans l’événement ??

    Sender représente le composant qui a déclenché l'évènement. Donc, TComport(Sender) gère le port que tu auras attribué au composant qui déclenche le code.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 32
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    et ça change quoi ? Le code est-il différent dans l’événement ??

    Sender représente le composant qui a déclenché l'évènement. Donc, TComport(Sender) gère le port que tu auras attribué au composant qui déclenche le code.
    Bien, on apprend toujours alors allons au fond du code.
    Comport1.RxChar := Self.ComPort1RxChar;
    Comport2.RxChar := Self.ComPort1RxChar;
    Comport3.RxChar := Self.ComPort1RxChar;
    Ce bout de code va dans quelle section ?
    Et pourrais-tu me l'expliquer davantage ou me pointer un document à lire ?

    Merci à l'avance

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 388
    Points : 2 999
    Points
    2 999
    Par défaut
    J'imagine que TComport est un composant visuel.
    Dans l'inspecteur d'objet, quand tu fais un double-clic sur l’événement OnRxChar (je ne connais pas le composant mais j'intuite que c'est le nom de lévénement), ça crée un "corps" de code que tu remplis avec le code que tu indiqué et que tu voudrais factoriser dans ce que tu appelles une super variable.
    Là, 2 solutions:
    A: tu sélectionnes les 3 composants sur ton TForm et tu fais le double-clic ensuite. L'événement sera affecté aux 3 composants.
    B: tu écris toi-même l'événement puis tu associes l'événement aux 3 composants avant de les utiliser.

    La solution B est à utiliser si crées les composants dynamiquement plutôt que de les poser sur le TForm.

    Ensuite, chaque composant déclenchera le code de l'événement quand il le désirera. Le paramètre Sender représente le composant qui a déclenché le code. Sender étant du type TObject, il faut le transtyper en TComport pour l'utiliser.
    Même si tes 3 composants TComport déclenche l'événement au même moment, il y aura bien 3 déclenchement d'événement, un pour chaque composant.

    L'avantage, c'est d'avoir un seul et même code. Pas de duplication ! plus court et plus facile à maintenir.
    Un peu comme si tu écrivais une fonction qui prenne un objet en parametre pour agir dessus.

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

Discussions similaires

  1. [VB.NET] Déclaration PUBLIC Multiple
    Par olbi dans le forum VB.NET
    Réponses: 2
    Dernier message: 06/04/2007, 11h02
  2. Probleme de déclaration multiple
    Par anykeyh dans le forum C++
    Réponses: 3
    Dernier message: 02/03/2007, 15h42
  3. Réponses: 4
    Dernier message: 17/10/2006, 12h00
  4. Réponses: 2
    Dernier message: 27/05/2006, 12h13
  5. Déclaration multiple d'une fonction
    Par Julien C. dans le forum Langage
    Réponses: 2
    Dernier message: 17/06/2003, 16h38

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