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 :

Comment avoir une fonction à deux résultats ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut Comment avoir une fonction à deux résultats ?
    Bonjour,

    J'aimerais savoir si il y a moyen de définir deux résultats pour une fonction, si oui, comment le faire ?

    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
    Function Imprimante : String;
    var
      Dev, Drv, Prt: Array[0..255] of Char;
      DM1: PDeviceMode;
      DM2: PDeviceMode;
      Sz: Integer;
      DevM: THandle;
    begin
      Printer.PrinterIndex := - 1;
      Printer.GetPrinter(Dev, Drv, Prt, DevM);
      DM1 := nil;
      DM2 := nil;
      Sz := DocumentProperties(0, 0, Dev, DM1^, DM2^, 0);
      GetMem(DM1, Sz);
      DocumentProperties(0, 0, Dev, DM1^, DM2^, DM_OUT_BUFFER);
      if DM1^.dmColor > 1 then
        result1 := Dev + ': Couleur'
      else
        result1 := Dev + ': Noir et blanc';
      if DM1^.dmFields and DM_Color <> 0 then
        result2 := 'L''imprimante supporte les couleurs'
      else
        result2 := 'L''imprimante ne supporte pas les couleurs';
      FreeMem(DM1);
    end;
    J'aurais besoin de pouvoir avec cette fonction exporter deux résultats !

    Si quelqu'un peut m'aider, son aide serait la bienvenue.

  2. #2
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Ce n'est pas possible.
    Tu peux soit créer un nouveau type, qui contiendra tes deux strings.
    Tu peux aussi utiliser mettre un argument avec le mot-clé var, ta fonction se contentera de modifier la string en argument.

    Dans ton cas précis, tu peux aussi concaténer tes deux strings.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Crée un type "record"

    Genre (exemple au hasard pas relié à ton code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TMonResultat=record
     result1:integer;
     result2:tcolor;
     end;
    Puis ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function mafontion:  TMonResultat;

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    passe des paramétres par référence à ta fonction ... et met à jour ces paramétres .... je ne sais plus la syntaxe en delphi ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Imprimante ( stResult1 byRef as string ,stResult2 byRef as string ) as boolean)
    fonction renvoyant true si OK par exemple...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par bbil
    passe des paramétres par référence à ta fonction ... et met à jour ces paramétres .... je ne sais plus la syntaxe en delphi ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function Imprimante ( stResult1 byRef as string ,stResult2 byRef as string ) as boolean)
    fonction renvoyant true si OK par exemple...
    la syntaxe c'est "var nomdevariable:type"

  6. #6
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour vos réponses TRES rapide !!!

    Ce que j'ai fait en définitif, c'est de scinder cette Function en deux Function. Le temps de trouver un moyen plus performant ...

    Il y avait plusieurs de vos réponses qu'étaient interessantes, mais qui n'aurait pas été pour mon logiciel ... malheureusement.

    Encore merci et bon weekend. 8)

  7. #7
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Meme si le fil est clot, je tiens a dire qu'il existe les paramètres du genre "out":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure Imprimante(out Result1, Result2: string);
    begin
      ...
      Result1 := ...;
     ...
      Result2 := ...;
    end;
    Faire pour plus amples informations sur le sujet des routine/procédure/fonction/méthode

  8. #8
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci pour ta réponse neilbgr,

    Vu que tu m'apporte de nouveaux éléments de réponse, qui vont justement dans le sens de ma recherche, j'me suis permis d'enlever les tags [Résolu] et [Délestage].

    Je me suis penché sur ta proposition, et je suis arrivé à :

    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
      public
        { Public declarations }
        procedure Imprimante(out Result1, Result2: string);
     
    [...]
     
    procedure TForm1.Imprimante(out Result1, Result2: string);
    var
      Dev, Drv, Prt: Array[0..255] of Char;
      DM1: PDeviceMode;
      DM2: PDeviceMode;
      Sz: Integer;
      DevM: THandle;
    begin
      Printer.PrinterIndex := - 1;
      Printer.GetPrinter(Dev, Drv, Prt, DevM);
      DM1 := nil;
      DM2 := nil;
      Sz := DocumentProperties(0, 0, Dev, DM1^, DM2^, 0);
      GetMem(DM1, Sz);
      DocumentProperties(0, 0, Dev, DM1^, DM2^, DM_OUT_BUFFER);
      if DM1^.dmColor > 1 then
        result1 := Dev + ': Couleur'
      else
        result1 := Dev + ': Noir et blanc';
      if DM1^.dmFields and DM_Color <> 0 then
        result2 := 'L''imprimante supporte les couleurs'
      else
        result2 := 'L''imprimante ne supporte pas les couleurs';
      FreeMem(DM1);
    end;
    Cependant, je n'arrive pas à extraire les résultats de cette Procédure ...

    J'ai bien essayé de différentes façon, mais je n'y arrive pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Label1.Caption := Imprimante.Result1;
    end;
    ... si quelqu'un pourrait m'aiguiller ... ça serait sympa.

  9. #9
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    pour utiliser une fonction de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure TForm1.Imprimante(out Result1, Result2: string);
    Il faut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Something;
    var
     Res1,Res2 : string;
    begin
     Imprimante(Res1,Res2);
     Label1.Caption := Res1; //ou Res2
    end;

  10. #10
    Membre habitué
    Avatar de xenos
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 400
    Points : 197
    Points
    197
    Par défaut
    Merci à neilbgr et smyley, c'est exactement ce que je cherchais !!!

    Bonne journée et à une prochaine sur l'forum

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

Discussions similaires

  1. [AC-2003] Comment appeler une fonction avec deux paramètres. Erreur '=' attendu
    Par nirG95 dans le forum VBA Access
    Réponses: 1
    Dernier message: 02/09/2009, 10h53
  2. Réponses: 2
    Dernier message: 29/07/2008, 15h04
  3. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24

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