[Delphi - Newbie] Les appels croisés entre unités

Les appels croisés entre unités [Delphi - Newbie] - Programmation

Marsh Posté le 24-11-2001 à 22:25:44    

Pour apprendre, je code la petite appli suivante :  
- une fenetre avec 2 boutons
 --> l'un demande une limite, puis génère un nombre en 0 et cette limite
 -->l'autre affiche ce nombre.
 
Pour compliquer le truc, je voudrais que ca donne ca :  
2 fiches unités, Main et CPU
 
dans main, dans la procédure correspondant au bouton1, j'initialise la valeur Limite
 
dans CPU, je crée une fonction GenNombre qui a comme paramètre Limite, et qui renvoit Resultat.
 
de nouveau dans Main, la procédure correspondant au bouton2 affiche Resultat dans une phrase tt bête.
 
(alors je sais, ca n'a aucun intéret, c faisable en 1 fiche, mais c pour apprendre les appels croisés, g pas tt compris...parce que d'après ce qui m'est dit, c impossible, parce qu'on ne peut pas faire de référence circulaires...
 
D'après ce que g compris aussi, ca va se jouer en fonction de si je déclare les procédures dans interface, et ce que je fous dans mes uses
 
-->pour les fonctions en elle même ca va, c juste pour les faire communiquer entre unité...
shématiquement, je veux :  
A appartenant à Unit1 ---> passe un paramètre ---> B appartenant à Unit 2
B de Unit 2 le traite et le renvoit à C de Unit 1
 
Comment faire ?


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-11-2001 à 22:25:44   

Reply

Marsh Posté le 24-11-2001 à 22:30:47    

tu tapes un uses apres le mot clé implementation

Reply

Marsh Posté le 24-11-2001 à 22:39:03    

ca fait un bout de temps que je fais du Delphi et je ne me rappelle jamais avoir vu (ou avoir eu besoin) d'appels croisés entre units !
 
Dans la majeur partie des cas, tu fais une fonction (dans CPU) qui renvoie un resultat (dans Main) ou tu passes ton objet (de Main) en param. de la fonction (de CPU), ou tu fais des evenements personnalisés, etc...
 
Y'a plein de moyen pour ne pas avoir a croiser les uses d'unités.
 
(mais si vraiment tu VEUX vraiment croiser, buitoni t'a donné la reponse)

 

[edtdd]--Message édité par JWhy--[/edtdd]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 24-11-2001 à 22:53:51    

ben j'avais trouvé pile avant ;)
 
En fait Main uses CPU dans interface, et CPU uses Main dans procedure ....
 
et du coup ca marche !
 
J'ai fait un truc trop tordu pour tester vite fait :  

  • Main a une fonction PerimDisque qui calcule le périmètre d'un disque d'après un rayon passé en paramètre.
  • CPU a une fonction Cyl qui calcule la surface d'un cylindre sans les bouts, et qui appelle dans son calcul Perimdisque, la longueur étant passé en paramètre.
  • Main affiche le résultat en appellant la fonction Cyl dans un showmessage


 :crazy:  :crazy:  :crazy:  
 
Par contre, on peut visiblement pas passer de variable d'une unit à l'autre, juste des fonctions qu'on peut appeller. Par ex, si g défini le taux euro dans une unit, je peux l'appeller dans l'autre ? (c pas recommandé je sais, mais c pour savoir)


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-11-2001 à 22:56:29    

Si tu declares tes variables (mais ca marche aussi pour les types, fonctions, constantes, etc...)  avant implementation, elles seront visibles dans les autres unités qui utilise l'unité en question.


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 24-11-2001 à 23:01:53    

pour les appels croisés, je viens de trouver un cas où ca peut servir :  
 
tt les PAS n'ont pas forcément de form rattaché : tu peux avoir des units sans fiches associées...
 
ton *.pas sans fiche te sert pour tes algos mettons...bon, si pour une raison X, tu as besoin d'une donnée utilisateur, tu pourras pas la demander avec cette unité, elle a pas de fiche. Faudra donc la demander dans une unité qui a une fiche. Bon, et si le résultat de ton algo, tu dois l'afficher à l'utilisateur, si t'a qu'une fiche, ce sera donc forcément la même unit qui envoit le param et qui affiche le résultat du traitement...
 
mais bon, c vrai que ca doit pas se rencontrer souvent des prog à une fenetre seulement, avec tt les algos décentralisés...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 24-11-2001 à 23:14:53    

plus souvent que tu ne le penses !
 
ton algo.pas ou il y a les algos sera 'esclave' (facon de parler): ce n'est pas lui qui va demander quoi que ce soit.
 
c'est ta form (form.pas) qui quand tu cliques sur un bouton ou autre va appeler les fonctions/objets/etc... definis dans algo.pas en lui passant les infos necessaires au bon deroulement de l'algo !
 
et pareil pour l'affichage des resultats, ta fonction/objet defini dans algo.pas va renvoyé des infos qui devront etre affiché par form.pas...
 
un ex. tout con:
1) cree un nouveau projet
2) ajoute une unité
3) defini une fonction MaFonction:

Code :
  1. unit Unit2;
  2. interface
  3. function MaFonction(AString:STring) : String;
  4. implementation
  5. function MaFonction(AString:STring) : String;
  6. begin
  7.   //oui, je sais c'est une fonction de m*rde ! ;)
  8.   result := 'Tu as saisi: '+ AString;
  9. end;
  10. end.


 
4) reviens sur ta form principale, pose 2 TEdit et un TButton
5) sur le click du TButton (dble click sur le TButton sur la form, ca devrait t'ouvrir l'editeur sur l'evenement Button1Click), fait  

Code :
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3.   Edit2.Text := MaFonction(Edit1.Text);
  4. end;


6) rajoute un uses Unit2 dans ton unite principale
 
Donc tu vois, tout est déclaré dans Unit2 (algo.pas) et Uni1 (Form.pas) ne fait qu'appeler des fonctions de Unit2. Unit2 est independant et ne 'connais' pas Unit1 ni les objets qui la compose! et on n'en a pas besoin !!!  
ca permettra aussi de reutiliser facilement Unit2 si jamais tu as besoin dans un autre prog des memes algos !

 

[edtdd]--Message édité par JWhy--[/edtdd]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 24-11-2001 à 23:45:42    

ok, j'ai compris...
 
-->sinon la je suis bloqué sur une merde :  
 

Code :
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var     LimiteTXT : string;
  3.         LimiteNum : integer;
  4. begin
  5.         LimiteNum := 0
  6.         while | (LimiteNum < 100) AND (LimiteNum > 300) do
  7.         InputQuery('Donnez une limite comprise entre 100 et 300', 'Valeur', LimiteTXT);
  8.         LimiteNum :=StrToInt(LimiteTXT);
  9.         if  LimiteNum < 100 then
  10.                 ShowMessage(LimiteTXT + ' est trop petit : entrez un nombre plus grand')
  11.         else if LimiteNum > 300 then
  12.                 ShowMessage(LimiteTXT + ' est trop grand : entrez un nombre plus petit');
  13.         end;
  14. end;
  15. end.


 
Erreur données : (la barre rouge c le curseur, j'ai pas mis de pipe)
[Error] Main.pas(35): Missing operator or semicolon
[Error] Main.pas(36): Incompatible types: 'Integer' and 'procedure, untyped pointer or untyped parameter'
[Error] Main.pas(47): '.' expected but ';' found
[Fatal Error] nbSecret.dpr(6): Could not compile used unit 'Main.pas'
 
 
je voudrais que la boucle se fasse tant que l'utilisateur a rien rentré entre 100 et 300 ...mais c au niveau du test que ca merde, le compilo aime pas ca du tout...je me doute que mon test booléen foire, mais je connais pas la syntaxe pour ce genre de test (GNAGNA<machin et GNAGNI>bidule )
 
je savais le faire avant, mais ca s'oublie trop vite, c affolant :D

 

[edtdd]--Message édité par Jubijub--[/edtdd]


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 00:11:43    

LimiteNum := 0 <-- point virgule manquant
c'est ce que te dis le compilo.
 
 
else if LimiteNum > 300 then
               ShowMessage(LimiteTXT + ' est trop grand : entrez un nombre plus petit';);
       end;
 
ton end; n'a pas sa place ici (c'est ce que te dis aussi le compilo ;) )
 
il te manque un begin apres le while :
  while (LimiteNum < 100) AND (LimiteNum > 300) do  
    InputQuery('Donnez une limite comprise entre 100 et 300', 'Valeur', LimiteTXT);  
       
vu que tu ne modifies pas LimiteNum dans ton while, tu vas boucler infiniment !!


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 00:14:22    

et plutot que de te prendre la tete a verifier la validite de ton champs, va dans ta palette de composant ( onglet Samples) et utilise le TSpinEdit, ca fait ce que tu veux (entier seulement avec valeur min/max)


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 00:14:22   

Reply

Marsh Posté le 25-11-2001 à 00:31:01    

maintenant g une erreur avec la veleur testée : y me dit que c pas un bon integer...du coup g un plantage méchant de l'appli
 
je me demande si ca vient pas du fait que je suis dans une procédure zarb avec un objet Delphi (c une procédure bouton)

 

[edtdd]--Message édité par Jubijub--[/edtdd]


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 00:37:55    

c'est normal si la valeur saisi n'est pas entiere.
 

Code :
  1. LimiteNum :=StrToInt(LimiteTXT);


StrToInt lance une exception si LimiteTXT n'est pas entier.
 
tu peux, par exemple,  intercepter l'exception directement dans ta form:

Code :
  1. try
  2.     LimiteNum :=StrToInt(LimiteTXT);
  3.   except
  4.     LimiteNum := -1;
  5.   end;


et tu fais un test style if limitenum = -1 then showmessage('On a dit un entier !!!';);
 
ou creer une nouvelle fonction IsNumeric:
 

Code :
  1. function IsNumeric(AString: String): Boolean;
  2. begin
  3.   try
  4.     StrToInt(AString);
  5.     Result := True;
  6.   except
  7.     Result := False;
  8.   end;
  9. end;


 
que tu pourras ensuite utiliser (et reutiliser si tu la defini dans le .pas qui n'a pas de form):
 
  if IsNumeric(LimiteTxt) then
    // tu continues
  else
    ShowMessage('On a dit un entier !!!';)


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 00:44:42    

j'ai trouvé pkoi : la valeur s'initialise jamais...g mis un query avant, ca marche...
 
par contre, juste pour ma culture, pkoi -1 ca veut dire non entier ? ...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 00:45:00    

tiens, au fait, j'suis en train de visiter le site de la team Whazaa... t'a ete voir le forum ?! y'a pas qqchose a faire ? ;)
 
pour le -1, c'est rien, c'est juste pour que tu testes qqchose, tu peux le mettre a -666 si tu veux ! ;)
 
par contre, si tu tapes du texte dans ta query et que tu n'as pas de gestion d'erreur, ca va te le dire méchamment (exception delphi non gérée qui va remonter jusqu'a l'utilisateur)

 

[edtdd]--Message édité par JWhy--[/edtdd]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 00:57:43    

en analysant mieux, g compris d'où ca venait : limiteTXT était pas initialisé, et était pas initialisée, et contenait donc n'importe quoi...du coup, ct transmis à LimiteNum, qui pour le coup n'était plus un entier lors du test pour savoir si il était inférieur à 100...
 
par contre comment on initialise une variable string avec rien ? g essayé en la mettant à 50, ca embraye cash sur c trop petit...on dirait que l'inputquery est sautée...je sais pas pkoi...
 
->autant pour moi, ct pas égale, mais reçoit...oui, tu fais comme les interruptions DOS : tu fous un code de retour aux erreurs...ensuite, selon la valeur qu'a pris l'erreur, tu peux donner un message précis à l'utilisateur...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 01:09:03    

ch'sais même pas pkoi g tjs le link, c plus mon clan :D
 
-->mais g été voir, joli hack


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 01:21:53    

en fait le pb vient du fait que tu utilises un while <test> do <instruction>
il teste avant de faire les instructions...
 
il te faut le contraire:
repeat
 <instruction>
until <test>
 
 
dans ton cas:
 

Code :
  1. repeat
  2.     InputQuery('Donnez une limite comprise entre 100 et 300', 'Valeur', LimiteTXT);
  3.     if IsNumeric(LimiteTXT) then
  4.     begin
  5.       LimiteNum := StrToInt(LimiteTXT);
  6.       if LimiteNum < 100 then
  7.         ShowMessage(LimiteTXT + ' est trop petit : entrez un nombre plus grand')
  8.       else if LimiteNum > 300 then
  9.         ShowMessage(LimiteTXT + ' est trop grand : entrez un nombre plus petit');
  10.     end
  11.     else
  12.         ShowMessage(LimiteTXT + ' n''est pas un entier !');
  13.   until (LimiteNum >= 100) AND (LimiteNum <= 300)

 

[edtdd]--Message édité par JWhy--[/edtdd]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 01:27:02    

ok, j'apprends un max la :D
 
-->le while ...Do, End; , c pour une valeur préexistente en fait...tu peux pas l'init dans la boucle (rien qu'en l'écrivant, je trouve ca con : si t'es pas vigilant sur les conditions de sorties, initier la variable de test dans la boucle, ca reste le plus sur moyen de planter l'appli :D : boucle infinie)


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 01:30:46    

en fait tu peux faire les deux... c'etait ton test qui etait foireux avec le while:
 

Code :
  1. LimiteNum := 0;
  2.   while  (LimiteNum < 100) OR (LimiteNum > 300) do
  3.   begin
  4.     InputQuery('Donnez une limite comprise entre 100 et 300', 'Valeur', LimiteTXT);
  5.     if IsNumeric(LimiteTXT) then
  6.     begin
  7.       LimiteNum := StrToInt(LimiteTXT);
  8.       if LimiteNum < 100 then
  9.         ShowMessage(LimiteTXT + ' est trop petit : entrez un nombre plus grand')
  10.       else if LimiteNum > 300 then
  11.         ShowMessage(LimiteTXT + ' est trop grand : entrez un nombre plus petit');
  12.     end
  13.     else
  14.         ShowMessage(LimiteTXT + ' n''est pas un entier !');
  15.   end;


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 01:32:04    

dans le while, t'es obligé d'init ta valeur pour que ton test soit vrai (pour entrer dans la boucle une premiere fois) alors que le repeat, t'en a pas besoin puisque tu fais le test en sortie...

 

[edtdd]--Message édité par JWhy--[/edtdd]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 01:34:46    

arf....erreur d'innatention : A OR B est faux si A ou B seul sont faux, alors que pour le AND, faut que les 2 le soient...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 01:48:39    

mdr le hackeur du forum, jubi :D
 
n'empeche gt jamai allé sur le forum depuis .. pfiouuuu :lol:

Reply

Marsh Posté le 25-11-2001 à 01:48:45    

Jubijub a écrit a écrit :

arf....erreur d'innatention : A OR B est faux si A ou B seul sont faux, alors que pour le AND, faut que les 2 le soient...  




 
heu non c le contraire...
 
false or false = false
false or true = true
true or true = true
 
false and false = false
false and true = false
true and true = true
 
false xor false = false
false xor true = true
true xor true = false


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 25-11-2001 à 01:52:52    

ou plus simplement:
  while (LimiteNum < 100) AND (LimiteNum > 300) do
en francais:
 tant que limitnum est inferieur a 100 et limitenum superieur a 300 faire. ..
 
je ne connais pas bcp de nbre qui sont inferieur a 100 et superieur a 300 a la fois ! ;)


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 02:20:08    

-->antp : ouaip, mais dans mon prog, quand la condition est vrai, alors c que le nombre est faux...:p
 
faut que je m'y remette aussi, ca fait 6 ans que g pas programmé autre chose que du Ti 83 :lol:
 
en tt cas c sympa le delphi, c rigoureux mais ca se fait...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 02:22:06    

-->Jwhy : je suis fan de desproges aussi !!!!! excellent !


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 17:10:17    

euh, isNumeric existe pas...enfin pas dans delphi 6 en tt cas...du coup je sais pas comment tester qu'une valeur est numérique....

 

[edtdd]--Message édité par Jubijub--[/edtdd]


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 17:13:10    

non, c'est une fonction faite main, je t'ai donné le code un peu plus haut...


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 25-11-2001 à 18:03:12    

arf, c bon g trouvé...saloperie de code :D

 

[edtdd]--Message édité par Jubijub--[/edtdd]


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 25-11-2001 à 18:13:36    

j'ai pas encore tout lu mais deja
 

Code :
  1. begin
  2.    randomize;
  3.    LimiteSup := 0 ;
  4.    NbSecret := 0 ;
  5.    NbSecret := Trunc(Random(LimiteSup));
  6. end;


c'est pas top...  
 
-->   LimiteSup := 0 ;
tu initialises a 0 une variable que tu passes en param. !!! ca sert a quoi de la passer en param alors ?!
 
-->   NbSecret := 0 ;
tu initialises a 0 une variable dont tu changes la valeur une ligne apres ! ca sert a quoi ?
 
-->   NbSecret := Trunc(Random(LimiteSup));
vu que limitesup est egale a 0 ca revient a faire
  NbSecret := Trunc(Random(0));
et random de 0 donne un reel entre 0 et 1 (si mes souvenirs sont bon) donc trunc (0.xxx) donnera toujours 0 donc nbsecret sera toujours egal a 0 ...  
 
c'est ce que tu veux ?


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 26-11-2001 à 20:51:35    

ben j'avais corrigé entre temps, mais oui, ca clochait bien ici...
 
maintenant ca marche, mais c roots : je sais pas comment faire pour quitter le jeu si g plus envie de trouver : tant que g pas gagné, tu peux pas sortir...
 
-->g le choix de controler ce qui est saisi pour voir si c pas 'Q' par hasard ;)
-->créer un bouton qui stoppe la procédure
 
-->le pb, c que je me souviens plus du tout quelles sont les commandes en pascale qui permettent de lire/écrire du texte dans une string, et pour ce qui est du bouton OFF, je sais pas quelle procédure appeller pour casser la boucle, d'autant que je risque d'avoir des soucis vu que ca tourne qu'en dialog box (je sais pas afficher autre chose :p) et que du coup la main windows sera pas en premier plan...donc c mort...
 
-->ceci est ma colle du moment...
-->mais merci à toi, franchement je note les structures et les shéma de pensée que tu proposes, ca m'aide à mort...
 
:jap: :jap: tt entraide n'est pas morte sur ce forum, c glop
 
par contre c affolant la quantité de code qu'il faut pour faire une pauv fenetre qui te te demande un limite pour un nombre généré au hasard dans cette limite...

 

[edtdd]--Message édité par Jubijub--[/edtdd]


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 27-11-2001 à 00:21:12    

yahoo !! je l'ai réécris, c encore plus propre...
 
g 2 routines sur CPU, indépendantes et tt propres...et 2 procedures sur Main, propres aussi...
 
bien sur, vu la complexité :D, ca peut tenir en 1 procédure, mais c pour manier la gestion de trucs plus compliqués...
 
maintenant, objectif : calcul du score et sauvegarde dans un fichier...et gestion des erreurs, et possibilité de sortie...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 27-11-2001 à 00:38:50    

pour la sauvegarde du fichier : regarde TINIfile , y'a rien de plus simple !
 
pour la gestion des erreurs, regarde l'aide sur try...except et try...finally
 
pour la sortie, tu ne devrais rien avoir a faire ? comment est gerer ton truc, c'est un bouton qui lance une boucle infini (tant que t'as pas trouvé) qui demande le numero ?  
 
tu peux faire le test tant que (numero trouvé) ou (l'utilisateur ne veut sortir) .  
le test (l'utilisateur ne veut sortir) pourrait etre un test sur la valeur du champs de saisie LimiteTXT = 'FIN' par ex.


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 27-11-2001 à 00:47:30    

-->ok : y'a tellement de composants, je me paume là dedans ! ;)
-->d'après son nom, y sert à faire des ini ce truc non :p
 
 
-->pour la boucle, ouhais, c un bouton qui la lance (je maitrise aucun des autres, faudra que je fasse des tests pour chacun d'entre eux ;) ...mais por certains c grand, genre déclaration + méthodes d'une barre de menus, ca doit prendre du temps !
 
-->après bidouillage, g enfin maitrisé la syntaxe des Label/Goto (je sais que c crade d'en mettre trop dans le code, la c juste pour sortir d'une boucle, le goto quitte pas la procédure qui l'appelle)
 
-->je testerais try, ca a l'air mieux...sinon comment gérer le cancel d'une inputquery ? parce que quand je clique dessus, ca fait comme un ok...
 
-->sinon comment tester caractère par caractère une string ?
Le cas classique : je veux que si essai > 1, g un pluriel ...essais (arf, on dirait mes cours de seconde...je savais le faire à l'époque :sweat: )
 
-->par rapport au cours que g choppé sur developpez.com, j'ai fini les procédures et fonctions, et ce qu'il appelle structure prog pascal (les for, if, etc...)...faut que je passe au types avancés, et à la manipulation des composants...ca va etre rude, ca devient sérieux là :D


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 27-11-2001 à 00:57:02    

vire le label/goto y'a rien de plus crade, serieusement...
 
si tu veux sortir d'une boucle (for, repeat ou while), utilise break
pour sortir d'une procedure ou fonction, utilise exit
 
mais generalement si tu as une boucle c'est que tu testes qqchose donc le plus propre (enfin, je sais pas si c'est le plus propre, mais c'est ce que je fais ;)) c'est de faire qqchose comme:

Code :
  1. var
  2.   bContinuer : Bool;
  3.   sValeur : String;
  4. begin
  5.   // j'assigne vrai a bContinuer  
  6.   bContinuer := true;
  7.   // tant que bContinuer est vrai, je fais mon code
  8.   while bContinuer do
  9.   begin
  10.     // bContinuer est true si l'utilisateur a clické sur OK
  11.     bContinuer := InputQuery('Input Box', 'Prompt', sValeur);
  12.     if bContinuer then
  13.     begin
  14.       // l'utilisateur a clické sur OK, donc je gere la valeur sValue saisie.
  15.     end;
  16.     //sinon, si il a clické sur Cancel, bContinuer sera False et donc je sortirai de ma boucle
  17.   end;
  18. end;


 
pour info InputQuery renvoie True si OK est clické et False si Cancel est clické (c'est dans l'aide... F1 sur InputQuery)


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 27-11-2001 à 01:00:55    

délire, c trop puissant ce truc...Boleens rulez tha world !!
 
Faut vraiment potasser l'aide à fond, chaque petit détail compte...c impressionnant...


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 27-11-2001 à 01:01:08    

Citation :


-->sinon comment tester caractère par caractère une string ?
Le cas classique : je veux que si essai > 1, g un pluriel ...essais (arf, on dirait mes cours de seconde...je savais le faire à l'époque   )


 
c'est tout simple:  

Code :
  1. if iTa_variable_integer = 1 then
  2. sChaine := '1 essai demandé'
  3. else
  4. sChaine := format('%d essais demandés', [iTa_variable_integer]);


 
et apres tu fais ce que tu veux avec la sChaine ainsi construite (ShowMessage, etc...)
 
regarde aussi l'aide de 'format', c'est bien pratique  ;)
 
edit: j'ai pas bien compris pourquoi tu parlais de "tester caractère par caractère une string "  :??:

 

[edtdd]--Message édité par JWhy--[/edtdd]


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 27-11-2001 à 01:07:55    

ok, mais tu contournes mon pb là...tu crée une sous chaine que je v concaténer...ca fait ce que je veux, mais c pas ce à quoi je pensais...en pascal de TP7, y'avais une commande, char je crois, qui te permettait de chercher un char dans une string...d'après sa position dans la chaine, genre si la chaine c 'I am happy', char(4) ct 'm'...et cette fonction avait une réciproque si je me souviens bien


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 27-11-2001 à 01:18:25    

il y a une fonction copy() qui extrait une souschaine d'une chaine et une fonction Pos() qui te donne la position d'une souschaine dans une chaine
 
mais j'ai du mal a comprendre ce que tu veux en faire ?!?


---------------
www.alliancefrancophone.org ... Home is where the heart is
Reply

Marsh Posté le 27-11-2001 à 01:18:39    

Ben euh, imaginons un exemple tordu :  
 
T sur mon site, tu dois entrer ton numéro Insee...qui contient ta date de naissance, donc je sais si tu es majeur. ( :o l'exemple foireux....ch'suis l'pornographe du phonographe :D )
 
Un numéro Insee ca donne ca :  
S - AA - MM - DD - etc...
 
S = sexe a 2 valeurs : 1 et 2 : 1 = gars, 2 = fille autre =  :heink:  
AA = année de naissance a comme valeur [00..99]
MM = mois de naissance a comme valeur [01..12]
DD = departement a comme valeur [01..110]
 
Donc suivant mon exemple, en te connectant, t'a une QueryBox qui vient et te demande ton numéro insee (seuls les 5 premiers chiffres sont significatifs, le reste tu met ce que tu veux, il en faut juste 13 en tt).
 
Tu te retrouve donc avec une string qui contient, genre '1810406....'
Je veux pouvoir scanner la string chiffre par chiffre, et en fonction de leur position, pouvoir tester des trucs, genre :  
si char(1) = '1' then Bonjour Monsieur else Bonjour Madame
si (StrToInt(char(2)+ char(3)) < 83) then ShowMessage(Tu n'es pas majeur/e (le premier char me donne l'orthographe))...et mettons que je sois fada et que j'ai rentré les 110 et quelques departements francais dans un tableau ou autre type plus adapté (j'en sais rien), que si char(4)+char(6) = '06' then Montrer le contenu du tableau ligne 6, dans un tu viens des alpes maritimes...
 
et là ton truc marche pas...parce que la saisie est uniforme, et que je dois la scinder...

 

[edtdd]--Message édité par Jubijub--[/edtdd]


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed