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 :

Appel de procédure ou fonction dans Case Of


Sujet :

Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Appel de procédure ou fonction dans Case Of
    Bonjour à tous ;
    J’ai un petit problème voila j’ai une partir serveur qui exécuté des commandes reçu par le client le serveur compte a peu pré 30 commandes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TFServeur.IdTCPServer1Execute(AContext: TIdContext);
    var 
    Cmd : string;
    begin
      Cmd := AContext.Connection.IOHandler.ReadLn();
       If Cmd = ‘Open’ then
       Open; // Appel de procedure ou function
    End;
    Mais je ne peu pas inséré 30 [ If Then ] dans la procédure sa fait énorme ?
    Donc j’ai pence qu’un Case Of serai plus adapter a cette situation mais voila comment appelé une fonction ou procédure dans un Case Of

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TFServeur.IdTCPServer1Execute(AContext: TIdContext);
    var 
    Cmd : string;
     I : Integer;
    begin
      Cmd := AContext.Connection.IOHandler.ReadLn();
       For I := 1 to length(Cmd) do
       Begin
         Case Cmd[I] of
    ‘Open’ := Open; // Apple de procedure ou function  
    End;
    Merci d'avance pour votre aide.

  2. #2
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    Bonjour,

    tu as une solution dans la FAQ :

    http://delphi.developpez.com/faq/?pa...e#caseofstring

    A+

    Charly

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    je ne crois que ce n'est sa question qui est
    comment appelé une fonction ou procédure dans un Case Of
    L'appel d'une procédure ou d'une fonction est le même qu'il intervienne dans in IF ou un CASE !!!

    NB : Open pas très bien comme nom de fonction ou procédure, car c'est un mot-clé dans certains cas (pourquoi pas 'Ouverture' )
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Tu as plusieurs méthode
    GetEnumName\GetEnumValue
    IdentToStr
    ou une gestion manuelle par AnsiIndexText ou AnsiIndexStr comme je l'ai déjà proposé pour une répartition simple de message TCPIP ou un aiguillage hiérarchisé justement avec la technique de la FAQ Comment faire un Case Of avec des String ? mais couplé à une énumération

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TCommand = (cOpen, cClose, cMachin, cTruc);
    const
      Commands: array[TCommand] = ('Open', 'Close', 'Mahcin', 'Truc); // cela pourrait se faire par un GetEnumName ou IdentToStr aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFServeur.IdTCPServer1Execute(AContext: TIdContext);
    var 
      Cmd : string;
    begin
      Cmd := AContext.Connection.IOHandler.ReadLn();
      case TCommand(AnsiIndexText(Cmd)) of
        cOpen : Open();
        cClose : Close();
        cMachin : Machin();
        cTruc : Truc();
      end;
    end;
    Il y a aurait aussi une méthode par RTTI avec MethodAddress pour invoquer une méthode publiée via son nom mais ce n'est pas une solution pour débutant !


    Voici la variante GetEnumName

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TCommand = (cOpen, cClose, cMachin, cTruc);
    Juste l'enum pas de const

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFServeur.IdTCPServer1Execute(AContext: TIdContext);
    var 
      Cmd : string;
    begin
      Cmd := AContext.Connection.IOHandler.ReadLn();
      case GetEnumValue(TypeInfo(TCommand), 'c' + Cmd) of
        cOpen : Open();
        cClose : Close();
        cMachin : Machin();
        cTruc : Truc();
      end;
    end;
    Pour émettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Cmd = GetEnumName(TypeInfo(TCommand), Ord(cOpen));
    Cmd = Copy(Cmd, 2, MaxInt); // retire le c devant !
    Rien ne t'empêche à émettre le c dans le message


    la méthode RTTI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TFServeurCmd = procedure() of object;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TFServeur.IdTCPServer1Execute(AContext: TIdContext);
    var 
      Cmd : string;
      AddressMethod: TMethod;
    begin
      Cmd := AContext.Connection.IOHandler.ReadLn();
      AddressMethod.Code := Self.MethodAddress(Cmd);
      AddressMethod.Data := Self;
      if Assigned(AddressMethod.Code) then
        TFServeurCmd(AddressMethod)();
    end;
    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
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 344
    Points : 3 122
    Points
    3 122
    Par défaut
    @ Olivier Dehorter

    OK, mais si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       If cmd = 'Open' Then
          ...
    Fonctionne, cela m'étonnerait que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       Case cmd[i] of
          ...
    soit correct avec cmd[i] de type String ?

    Charly

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Je suis bien d'accord que la méthode fournit par CyberHack6666 pour la gestion des branchements du CASE est fausse

    Mais je n'ai pas l'impression qu'il s'agissait de sa demande, et si oui il est temps que j'aille me recoucher
    Merci d'ajouter un sur les tags qui vous ont aidé

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    Mais je n'ai pas l'impression qu'il s'agissait de sa demande, et si oui il est temps que j'aille me recoucher
    Dans ce cas explique nous sa demande tel que tu la vois !
    Je vois deux possibilités
    - Appeler un ensemble de fonction selon un Message (ce que l'on traite dans nos réponses)
    - Appeler une fonction comme paramètre du CASE, ce qui est tout autant résolu par l'appel de AnsiIndexStr de la FAQ !

    Une même réponse pour deux questions !
    Quelle est ta vision des choses ?

    @CyberHack6666
    Tu ne voudrai pas faire un Open CD avec mciSendString comme dans le sujet
    Ouvrir un lecteur CD en socket

    une version simpliste pour gérer les commandes Open, Close, Machin, Truc, Chose en reprenant une analyse char par char !

    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 TFServeur.IdTCPServer1Execute(AContext: TIdContext);
    var 
    Cmd : string;
     I : Integer;
    begin
      Cmd := AContext.Connection.IOHandler.ReadLn();
      if (Length(Cmd) >= 1) then
      begin
        case Cmd[1] of 
          'O' : Open();
          'M' : Machin();
          'T' : Truc();
          'C': begin
            if (Length(Cmd) >= 2) then
            begin        
              case Cmd[2] of
                'l' : Close();
                'h' : Chose();
              end;
            end;
          end;
        end;
      end;
    end;
    Après, si l'on que des commandes de 4 caractères ou 8 caractères, on pourrait transtyper les 4 AnsiChar en un seul integer\int64 ... mais c'est
    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

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    Bonjour ShaiLeTroll

    Quand je lis ceci comment appelé une fonction ou procédure dans un Case OfJe vois cela :

    Code delphi : 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
    PROCEDURE la_procedure;
    Begin
        ...
          blabla
        ....
      
    END;
    
    .
    .
    .
    
    PROCEDURE Appelante_IF;
       Cmd : string;
    begin
      Cmd := AContext.Connection.IOHandler.ReadLn();
       If Cmd = ‘Open’ then
          la_procedure // Appel de procedure ou function 
       else
          IF Cmd = 'Close' THEN
            Autre_procedure;
    End;
    
    
    PROCEDURE Appelante_CASE;   // les branchements que vous avez déjà proposés
    type
      TCommand = (cOpen, cClose, cMachin, cTruc);
    const
      Commands: array[TCommand] = ('Open', 'Close', 'Mahcin', 'Truc);   Cmd : string;
    begin
        Cmd := AContext.Connection.IOHandler.ReadLn();
      case TCommand(AnsiIndexText(Cmd)) of
        cOpen : la_procedure // Appel de procedure ou function 
        cClose : Autre_procedure;
        cMachin : Machin();
        cTruc : Truc();
      end;
    End;


    Mais le problème est tellement triviale que ce ne doit pas être cela, et que vous ayez tous les 2 raisons.
    Conclusion : je vais me recoucher
    Merci d'ajouter un sur les tags qui vous ont aidé

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Tout d’abord je tien a tous vous remercier pour votre aide c'est vraiment sympa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      Cmd : TStrings;
    begin
      Cmd := TstringList.create;
      try
        Cmd.Add ('Open');
        Case Cmd.IndexOf( AContext.Connection.IOHandler.ReadLn() ) of
          0: Open();
          else ShowMessage('Ce n''est pas une commande.');
        end;
      finally Cmd.Free;  end;
    end;

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Pas mal, CyberHack6666 nous répond avec une autre variante TStringList

    Les Add c'est nettement plus lent qu'un tableau, par contre, un IndexOf sur une TStringList triée c'est plus performant !

    Déplace les Add dans le FormCreate ou le constructeur de TFServeur, n'oublie pas la libération de la TStringList dans le FormDestroy
    Ainsi les Add ne seront fait qu'une seule fois, regarde les propriétés Sorted et Duplicates, l'IndexOf n'en sera que plus performant !
    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

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

Discussions similaires

  1. Appeler une fonction dans une procédure stockée
    Par Guizmo95 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/05/2012, 19h59
  2. Réponses: 0
    Dernier message: 27/04/2009, 16h13
  3. Appel de fonction dans une procédure stockée
    Par Nuloprog dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2008, 16h00
  4. Appel d'une fonction dans une procédure
    Par dingo200 dans le forum PL/SQL
    Réponses: 16
    Dernier message: 07/11/2008, 16h03
  5. Réponses: 4
    Dernier message: 28/08/2006, 13h04

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