Appeler une procedure avec un argument fantôme

Résolu
fredelem
Messages postés
135
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
22 février 2022
- 13 avril 2013 à 11:02
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
- 12 mai 2013 à 11:14
J'ai écrit une procédure très simple:

procedure Sma(A:Array of variant);
var
    S: String;
    I: byte;
    Message: String;
begin
   For I:=0 to Length(A) DO
   begin 
      S:=A[I];
      Message:= Message+S;
   end;
   ShowMessage(Message);
end;


Ce qui me permet d'écrire:
Sma('Les valeurs de X et Y sont ',x,' ',y);
au lieu de
ShowMessage('Les valeurs de X et Y sont '+inttostr(x)+' '+inttostr(y));


C'est bien agréable de se simplifier la vie mais je voudrais aller plus loin et pouvoir écrire deux virgules consécutives pour remplacer un espace entre deux guillemets. Autrement dit, je voudrais pouvoir écrire:
Sma('Les valeurs de X et Y sont ',x,,y);

Pour l'instant, ces deux virgules consécutives provoquent un message d'erreur.

J'ai essayé:
IF A[I]=NIL  then  A[I]=' ';

ainsi que
IF A[I]=''  then  A[I]=' '; 

et
IF A[I]=0  then  A[I]=' ';


Rien de tout ça ne marche.

Sur Internet, j'ai trouvé une façom plus subtile de faire mon ShowMessage amélioré.
On part de la fonction:


FUNCTION MakeStr(Const Args: Array Of Const): String ;
VAR
    I: Integer;
Begin
   Result := '';
   FOR I := 0 TO High(Args) DO
   Begin
      //showmessage(inttostr(ord(args[i].VType)));
      WITH Args[I] DO
         Case VType Of
            VtInteger:  Result := Result + Inttostr(VInteger);
            VtBoolean:  Result := Result + BoolToStr(VBoolean,True);
            VtChar:     Result := Result + VChar;
            VtExtended: Result := Result + FloatToStr(VExtended^);
            VtString:   Result := Result + VString^;
            VtPChar:    Result := Result + VPChar;
            VtObject:   Result := Result + VObject.ClassName;
            VtClass:    Result := Result + VClass.ClassName;
            VtAnsiString:  Result := Result + String(VAnsiString);
            VtCurrency:    Result := Result + CurrToStr(VCurrency^);
            VtVariant:     Result := Result + String(VVariant^);
            VtInt64:       Result := Result + Inttostr(VInt64^);
         End;
   End;
End;


et la procédure Sma devient:

procedure Sma(A: array of const);
begin
   showmessage(MakeStr(A));
end;


Mais cette procédure non plus n'accepte pas deux virgules consécutives.
Je ne vois pas comment utiliser un Try...Except...
D'autres idées ?

12 réponses

cs_MAURICIO
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
17 avril 2013 à 10:15
3
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
29 avril 2013 à 13:22
Excuse-moi de ne pas connaitre l'unité de monnaie du Portugal


L'Euro !!!!
3
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
13 avril 2013 à 11:31
Salut,

je te conseille d'utiliser la fonction "Format". Voir "Chaînes de format" dans l'aide en ligne de Delphi.
0
fredelem
Messages postés
135
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
22 février 2022
2
13 avril 2013 à 12:03
Merci pour ta réponse.

Mais je ne vois pas où placer le mot format. En faisant des recherches, j'ai découvert que Delphi contenait le mot ShowMessageFmt (pas très connu) qui accepte comme second paramètre un array of const et qui permet d'écrire:

ShowmessageFmt('%s',['x vaut ',,,,x]);

Mais ça aussi, ça donne un message d'erreur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
13 avril 2013 à 15:02
showMessageFmt('Les valeurs de %s et %s sont %d et %d', ['X','Y', px, py]);

________________________________________________________
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
13 avril 2013 à 15:06
ah oui et je ne vois pas pourquoi tu cherche à mettre des virgules sans paramètres...

c'est normal que le compilateur t'engueule.

Sma('Les valeurs de X et Y sont ',x,,y) <-- ça c'est de la connerie.

Sma('Les valeurs de X et Y sont ',x,' ',y) <-- ça ça sert à rien


Tu peux réécrire ta procédure comme suis :

function Sma(aFmtStr: string; const aConsts: array of const): string;
begin
  result := format(aFmtStr, aConsts);
  showMessage(result);
end;


________________________________________________________
0
fredelem
Messages postés
135
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
22 février 2022
2
13 avril 2013 à 17:08
Pas d'accord.
Mon but, c'est de m'économiser du travail en donnant à Sma la syntaxe de write qui me convient parfaitement.
Dire que ça ne sert à rien me parait être un jugement très personnel. Moi, je trouve ça génial.

Je ne pense pas non plus que ce soit s'engager sur une impasse que de vouloir écrire
Sma('Les valeurs de X et Y sont ',x,,y)
car dans certains cas, le compilateur de Delphi l'accepte. Par exemple, quand on écrit un Shellexecute, il est permis de mettre deux virgules consécutives. Et même,si on écrit NIL là où il attendait une chaine, il râle un peu mais il accepte. Bien sûr, j'admets qu'il soit généreux envers ses propres enfants, mais je pense que si je sais lui parler comme il faut, il m'accordera les mêmes faveurs.

La solution que tu me proposes, bon, elle marche certes mais elle ne va pas dans le sens que je souhaite: économiser du travail.
0
fredelem
Messages postés
135
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
22 février 2022
2
26 avril 2013 à 21:16
 
   La réponse de Mauricio m'a beaucoup aidé et du coup, je suis revenu sur les réponses précédentes. Je me suis aperçu que Korgis avait raison, il fallait utiliser la fonction "format". Et l'idée de fOxi était très bonne. Je ne sais pas pourquoi il
s'est amusé à ajouter un px et un py. Je préfère écrire
         showMessageFmt('Les valeurs de X et Y sont %d et %d', [px, py]);


   C'est finalement cette solution que je vais adopter mais il y a encore quelque chose qui me gêne; l'obligation d'écrire des crochets autour des arguments. Pour éviter ça, ma procédure devient:
PROCEDURE Sma(S:String; Const C1: Variant; Const C2: Variant;  Const C3: Variant; Const C4: Variant);
Begin
   ShowMessagefmt(S,[C1,C2,C3,C4]);
End;


J'appelle cette procédure par:
   Sma('Les valeurs de X et Y sont %s et %s',x,y,$,$);
C'est quand même plus sympa que
   Showmessage('Les valeurs de X et y sont '+inttostr(x)+' et '+inttostr(y));

   Évidemment, il y a ces deux dollars à la fin qui sont nécessaires pour avoir les 4 constantes prévues: C1,C2,C3 et C4. J'ai finalement admis qu'on ne pouvait avoir deux virgules consécutives (même pas avec Shellexecute, ma mémoire m'a trompé). Je suis obligé de mettre quelque chose, peu importe quoi puisque ça n'apparait pas dans le showmessage.

   A la place des dollars, j'aurais pu mettre des zéros ou un nom de variable mais pas grand-chose d'autre. Un arobase provoque un message d'erreur. Idem, si je mets l'un des caractères suivants: # % & < > ? ç é à è.
   Pourquoi diable le $ est-il accepté alors que la livre anglaise (£) ou le Yen (¥) provoquent un message d'erreur ?

   Peu importe, ce qui compte, c'est que grâce à votre aide, j'ai abouti à un mélange de solutions qui me conduit à une procédure très simple et performante. Merci à tous.

                       Fred

   PS: J'avais envisagé d'écrire:

   PROCEDURE Sma(S:String; Const C1: Variant; Const C2: Variant='';  Const C3: Variant=''; Const C4: Variant='');


   ce qui m'aurait dispensé d'écrire mes dollars à la fin. Mais ce n'est pas possible, une variante ne peut pas être initialisée. Des idées pour contourner ça ?
0
cs_MAURICIO
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
29 avril 2013 à 10:36
"une variante ne peut pas être initialisée"

Tu peux utiliser le type String!!!

a+


Composants Cindy pour Delphi
Faites une donation.
0
fredelem
Messages postés
135
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
22 février 2022
2
29 avril 2013 à 13:02
   Eh oui, j'y ai pensé. Mais alors, il faut que j'appelle ma procédure par

      Sma('Les valeurs de x et y sont %s et %s', inttostr(x), inttostr(y));

   La cata, juste ce que je veux éviter !


   PS: j'ai trouvé pourquoi "$" est accepté comme variant et pas la livre anglaise ni le yen ni d'ailleurs l'euro ni la peseta. Excuse-moi de ne pas connaitre l'unité de monnaie du Portugal mais je pense qu'elle ne passerait pas non plus. Le $ est accepté car Delphi le voit comme un nombre hexadécimal, un équivalent de $00.
0
fredelem
Messages postés
135
Date d'inscription
dimanche 29 octobre 2006
Statut
Membre
Dernière intervention
22 février 2022
2
12 mai 2013 à 10:10
@Korgis:

   Je vois que tu es jeune et que tu n'as connu que l'Euro. Mais nous les anciens qui sommes nés avant 2002, nous avons connu le temps où l'unité monétaire du Portugal était l'Escudo.
   Malgré ton jeune âge, tu m'as orienté vers la bonne voie. Mais pour en finir avec mes dollars, personne ne m'a dit qu'il y avait la solution de la surcharge. J'y avais pensé dès le début mais j'aurais préféré trouver autre chose. Je me suis résigné à utiliser cette solution et j'ai écrit 4 procédures Sma avec un nombre d'arguments derrière le format allant de 1 à 4. Pas de pb, ça marche très bien, j'ai ce que je voulais.
   Puisque ça m'a réussi de poser des questions, j'en pose une autre ce matin. J'espère avoir des réponses sérieuses, en particulier de la part des jeunes gorilles.
0
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
12 mai 2013 à 11:14
Je vois que tu es jeune et que tu n'as connu que l'Euro


Pour info : 1 EURO = 655 anciens francs...
0