exception que je pige pas :(

exception que je pige pas :( - Delphi/Pascal - Programmation

Marsh Posté le 29-07-2003 à 18:01:26    


bon deja , voila lexception :  
 
http://www.easy-hebergement.net/~csclanth/texto.jpg
 
 
ensuite quand je fait ok , elle me renvoit sur une procedure qui a deja ete executee plusieurs fois sans planté :  
 
calcul(form1.Vendredi3,a,chaine);  
qui est declaree  ainsi :  
 
procedure calcul(lememo:Tmemo;a:string;chaine:byte);
 
mais le probleme c ke jai pas de variable i dans cette procedure :  
 
voila la procedure appellée :  
 

Code :
  1. procedure Tprime.calcul(lememo:Tmemo;a:string;chaine:byte);
  2. begin
  3. if form1.reperer(lememo,a) then
  4. case strtoint(copy(lememo.Name,length(lememo.Name)-1,1)) of
  5. 1:
  6. begin
  7. case chaine of
  8. 2:
  9.    begin
  10.    ch1:=ch1+1;
  11.    ch2:=ch2-1;
  12.    end;
  13. 3:
  14.    begin
  15.    ch1:=ch1+1;
  16.    ch3:=ch3-1;
  17.    end;
  18. 4:
  19. ch1:=ch1+1;
  20. end;
  21. end;
  22. 2:
  23. begin
  24. case chaine of
  25. 1:
  26.    begin
  27.    ch2:=ch2+1;
  28.    ch1:=ch1-1;
  29.    end;
  30. 3:
  31.    begin
  32.    ch2:=ch2+1;
  33.    ch3:=ch3-1;
  34.    end;
  35. 4:
  36. ch2:=ch2+1;
  37. end;
  38. end;
  39. 3:
  40. begin
  41. case chaine of
  42. 2:
  43.    begin
  44.    ch3:=ch3+1;
  45.    ch2:=ch2-1;
  46.    end;
  47. 1:
  48.    begin
  49.    ch3:=ch3+1;
  50.    ch1:=ch1-1;
  51.    end;
  52. 4:
  53. ch3:=ch3+1;
  54. end;
  55. end;
  56. end;


 
 
 
 
 
 
 
 

Reply

Marsh Posté le 29-07-2003 à 18:01:26   

Reply

Marsh Posté le 29-07-2003 à 18:49:29    

le bug a lieu avant...trace ton code pas à pas et tu verras le moment "magique" :D

Reply

Marsh Posté le 29-07-2003 à 19:48:48    

je poste le code parceque la je bloke :( meme avant je voit pas la merde ... et pour un pas pas , le blem c que ca marche pendant les premiere boucle que j'ai mis entre 2 linge sur le code ci dessous  !  
 
help  
 
 

Code :
  1. unit fiche_prime;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls;
  6. type
  7.   Tprime = class(TForm)
  8.     Memo1: TMemo;
  9.     CheckBox1: TCheckBox;
  10.     CheckBox2: TCheckBox;
  11.     CheckBox3: TCheckBox;
  12.     Button1: TButton;
  13.     procedure Button1Click(Sender: TObject);
  14.     procedure Checking(a:string);
  15.     procedure calcul(lememo:Tmemo;a:string;chaine:byte);
  16.   private
  17.     { Déclarations privées }
  18.   public
  19.     { Déclarations publiques }
  20.   end;
  21. var
  22.   prime: Tprime;
  23.   ch1,ch2,ch3:byte;
  24. implementation
  25. uses principale, OP;
  26. {$R *.dfm}
  27. procedure Tprime.calcul(lememo:Tmemo;a:string;chaine:byte);
  28. begin
  29. if form1.reperer(lememo,a) then
  30. case strtoint(copy(lememo.Name,length(lememo.Name)-1,1)) of
  31. 1:
  32. begin
  33. case chaine of
  34. 2:
  35.    begin
  36.    ch1:=ch1+1;
  37.    ch2:=ch2-1;
  38.    end;
  39. 3:
  40.    begin
  41.    ch1:=ch1+1;
  42.    ch3:=ch3-1;
  43.    end;
  44. 4:
  45. ch1:=ch1+1;
  46. end;
  47. end;
  48. 2:
  49. begin
  50. case chaine of
  51. 1:
  52.    begin
  53.    ch2:=ch2+1;
  54.    ch1:=ch1-1;
  55.    end;
  56. 3:
  57.    begin
  58.    ch2:=ch2+1;
  59.    ch3:=ch3-1;
  60.    end;
  61. 4:
  62. ch2:=ch2+1;
  63. end;
  64. end;
  65. 3:
  66. begin
  67. case chaine of
  68. 2:
  69.    begin
  70.    ch3:=ch3+1;
  71.    ch2:=ch2-1;
  72.    end;
  73. 1:
  74.    begin
  75.    ch3:=ch3+1;
  76.    ch1:=ch1-1;
  77.    end;
  78. 4:
  79. ch3:=ch3+1;
  80. end;
  81. end;
  82. end;
  83. end;
  84. procedure Tprime.Checking(a:string);
  85. var
  86. chaine,mini:byte;
  87. i:integer;
  88. oui:boolean;
  89. begin
  90. //on initialise variables
  91. oui:=false;
  92. ch1:=0;
  93. ch2:=0;
  94. ch3:=0;
  95. chaine:=0;
  96. mini:=1;
  97. // on verifie s'il n'a jamais été absent
  98. //et si c le cas on sort de la procedure pour passer a celui d'après
  99. i:=0;
  100. while i<=(form1.abs.Lines.Count-1) do
  101.   begin
  102.    if a=copy(form1.abs.Lines.Strings[i],0,3) then exit;
  103.    i:=i+1;
  104.   end;
  105. if form1.reperer(form2.chaine1,a) then
  106. begin
  107.   ch1:=6;
  108.   chaine:=1;
  109. end;
  110. if form1.reperer(form2.chaine2,a) then
  111. begin
  112.   ch2:=6;
  113.   chaine:=2;
  114. end;
  115. if form1.reperer(form2.chaine3,a) then
  116. begin
  117.   ch3:=6;
  118.   chaine:=3;
  119. end;
  120. if chaine=0 then chaine:=4;
  121. //les proco
  122. calcul(form1.Lundi1,a,chaine);
  123. calcul(form1.Lundi2,a,chaine);
  124. calcul(form1.Lundi3,a,chaine);
  125. calcul(form1.Mardi1,a,chaine);
  126. calcul(form1.Mardi2,a,chaine);
  127. calcul(form1.Mardi3,a,chaine);
  128. calcul(form1.Mercredi1,a,chaine);
  129. calcul(form1.Mercredi2,a,chaine);
  130. calcul(form1.Mercredi3,a,chaine);
  131. calcul(form1.Jeudi1,a,chaine);
  132. calcul(form1.Jeudi2,a,chaine);
  133. calcul(form1.Jeudi3,a,chaine);
  134. calcul(form1.Vendredi1,a,chaine);
  135. calcul(form1.Vendredi2,a,chaine);
  136. calcul(form1.Vendredi3,a,chaine);
  137. calcul(form1.Samedi1,a,chaine);
  138. calcul(form1.Samedi2,a,chaine);
  139. calcul(form1.Samedi3,a,chaine);
  140. //Si le matricule n'est nul part , ca sert a rien de continuer donc on passe a celui d'après
  141. //c a d on sort de la procedure !
  142. if (ch1=0) and (ch2=0) and (ch3=0) then exit;
  143. if (checkbox1.Checked=true) and (ch1>=mini) then oui:=true;
  144. if (checkbox2.Checked=true) and (ch2>=mini) then oui:=true;
  145. if (checkbox3.Checked=true) and (ch3>=mini) then oui:=true;
  146. if oui=true then memo1.Lines.Add(a);
  147. // d
  148. end;
  149. procedure Tprime.Button1Click(Sender: TObject);
  150. var
  151. i:integer;
  152. a:string;
  153. begin
  154. memo1.Text:='';
  155. if (CheckBox1.Checked=false) and (checkbox2.Checked=false) and (checkbox3.Checked=false) then
  156. begin
  157.   memo1.Lines.add('Personne n''est primé');
  158.   exit;
  159. end;
  160. -------------------------------------------------------------------
  161. i:=0;
  162. while i<=999 do
  163. begin
  164. a:=inttostr(i);
  165. case length(a) of
  166.     1:
  167.       a:='00'+a;
  168.     2:
  169.       a:='0'+a;
  170. end;
  171. checking(a);
  172. i:=i+1;
  173. end;
  174. ----------------------------------------------------------------------
  175. end;
  176. end.


Message édité par piloud le 29-07-2003 à 19:51:21
Reply

Marsh Posté le 29-07-2003 à 22:08:36    

:bounce:

Reply

Marsh Posté le 30-07-2003 à 10:49:03    

Tu as quoi dans lememo.Name quand tu fais ça ?
 
case strtoint(copy(lememo.Name,length(lememo.Name)-1,1)) of

Reply

Marsh Posté le 30-07-2003 à 11:01:14    

Autres remarques gratuites sur ton code :
 
déclarer CHAINE en numérique c'est pas le top (idem pour les ch qui font penser à.....CHaine)
déclarer un boolean qui s'appelle OUI n'est pas mieux...
 
if (checkbox3.Checked=true) and (ch3>=mini) then oui:=true;
peut être codé : (même si ça ne s'applique pas ici car 3 tests en séquence, chacun pouvant modifier indépendamment oui)
oui:=(checkbox3.Checked=true) and (ch3>=mini);
if oui=true then memo1.Lines.Add(a);
devient :
if oui then memo1.Lines.Add(a);
 
A la limite tu peux ainsi de passer de ton init à false de oui


Message édité par qi130 le 30-07-2003 à 11:03:10
Reply

Marsh Posté le 30-07-2003 à 11:43:59    

quand je fait ca :  
 
case strtoint(copy(lememo.Name,length(lememo.Name)-1,1)) of  
 
jai ca ! (Ca finit toujours pas un chiffre :) lundi1 , mardi1 ....
 
calcul(form1.Lundi1,a,chaine);
  calcul(form1.Lundi2,a,chaine);
  calcul(form1.Lundi3,a,chaine);
  calcul(form1.Mardi1,a,chaine);
  calcul(form1.Mardi2,a,chaine);
  calcul(form1.Mardi3,a,chaine);
  calcul(form1.Mercredi1,a,chaine);
  calcul(form1.Mercredi2,a,chaine);
  calcul(form1.Mercredi3,a,chaine);
  calcul(form1.Jeudi1,a,chaine);
  calcul(form1.Jeudi2,a,chaine);
  calcul(form1.Jeudi3,a,chaine);
  calcul(form1.Vendredi1,a,chaine);
  calcul(form1.Vendredi2,a,chaine);
  calcul(form1.Vendredi3,a,chaine);
  calcul(form1.Samedi1,a,chaine);
  calcul(form1.Samedi2,a,chaine);
  calcul(form1.Samedi3,a,chaine);
 
pour les remarque gratuites , merci , mais ca ne resoud pas mon probleme !  

Reply

Marsh Posté le 30-07-2003 à 13:21:59    

Justement, elles sont gratos !
 
Ca aussi c'est gratos :
 
LUNDI1
 
longueur = 6
 
longueur - 1 = 5
 
et donc COPY('LUNDI1',5,1) renvoie le i  CQFD !
 
Tu peux dire merci, même si on t'apprend qq chose.
 
....prochain pilou !

Reply

Marsh Posté le 30-07-2003 à 19:00:46    

jai pas compris la , ca marcherai pour lundi mais pas pour vendredi qui comprend plus de lettre !

Reply

Marsh Posté le 30-07-2003 à 21:34:38    

Non, la démo en mode "forum" vaut pour lundi
 
mais c'est pareil pour vendredi
vendredi1 => lg=9 et lg-1=8
 
COPY('vendredi1',8,1) renvoie i
 
T'as pas une fonction RIGHT sous la main ?
Tiens, gratos encore:
Function _Right(ch_entree:string;longueur:byte):string;
var i:integer;
Begin
     i:=length(ch_entree);
     if longueur>i then _right:=''
        else _right:=copy(ch_entree,i-longueur+1,longueur);
End;

Reply

Marsh Posté le 30-07-2003 à 21:34:38   

Reply

Marsh Posté le 31-08-2003 à 23:00:01    

voila  , je rentre apres 1 mois de vac et jai compris ...
ca fait du bien les vacs , en tous cas , merci beaucoup !
 
en fait , je fesais ca car je pensais que copy commencais appartir du caractere 0 et non du 1 , c pour ca que je fesais lenght -1
 

Reply

Sujets relatifs:

Leave a Replay

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