Problème de classe dans delphi

Ishizaki Messages postés 51 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 4 décembre 2008 - 30 mars 2006 à 15:07
Ishizaki Messages postés 51 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 4 décembre 2008 - 6 avril 2006 à 13:48
Hello tout le monde, voilà, j'ai un gros problème qui m'a foutu mon oral en l'air ce matin.

En fait, j'ai fait un ptit programme sous delphi qui s'occupe de la gestion de formations. Donc, en premier lieu, je choisis dans une combobox la formation a afficher, et ensuite, on arrive sur un formulaire où il faut sélectionner les personnes à ajouter dans cette formation ou à retirer. Il y a donc 2 tableaux, sous formes de StringGrid, les prétendants à la formation et ceux qui y sont déjà.

On a 2 boutons ajouter et retirer qui permettent de faire ce que leur intitulé montre(^^).

Et c'est là que ça bug, quand je clique sur ajouter ou retirer, le programme plante et me sort une "Adress Violation" avec un tas de chiffres à la con derrière.
Idem quand je veux sélectionner une case dans un des stringgrids...

En fait, Delphi me montre que ça plante au niveau de ma classe.

Je vous montre à quoi elle ressemble:

type
listeopclass=class
private
T_element: array of OP;

public
constructor init(elt: array of OP; selection : integer; libre : integer);//initialisation(Op est un type salarié)
procedure ajouter(unOP : OP);//Ajout d'un salarié
procedure trier;//Tri des salariés
Function vide : boolean;//Retourne si une case est vide
procedure maj_ilibre;//On met à jour la première case libre du tableau
Function recup_ilibre : integer;//On récupère la première ligne libre du tableau
Function recuperer : OP;//Fonction de récupération d'un salarié
procedure retirer;//Quand on clique sur retirer
Procedure selectionner(selec : integer);//Pour selectionner dans un tableau

protected
isel:integer;//indice de l'élement sélectionné dans le tableau
ilibre:integer;//indice du premier élément libre du tableau
end;
(*Nb:Que je mette ilibre ou isel dans private ou protected, cela ne change rien aux erreurs...*)

Ensuite, voilà les procédures où ça plante, toujours dans mon unit où je déclare les méthodes de classe:

procedure listeopclass.selectionner(selec : integer);
begin
isel := selec;//recupère l'indice de l'élément sélectionné dans le tableau
end;


Function listeopclass.recup_ilibre : integer;
begin
result := ilibre;//recupère l'indice du premier élément libre du tableau
end;


Voilà voilà, en espérant une réponse de votre part ^^, c'est la merde, ça ne plantait pas avant, et faut que ça me fasse ça ce matin --__--.

Merciiii ^^.


je quote tu quotes...

8 réponses

cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
30 mars 2006 à 17:56
Ta question est très foue ( ya la class, mais c'est surtout le reste du code qui serait interressant ) je vais donc essayer de répondre aux 2 erreurs potentielles que j'ai trouvé:


Je suppose que ton T_Element est le elt assigné dans l'init ( pour info on utilise habituellement Create comme nom de contructeur en delphi mais c'est une autre histoire).
Les tableaux dynamiques en delphi sont implicitement des pointeurs ( normal puisqu'il faut pouvoir les redimentionner )
or, prenons un exemple:

Var
elt: array of OP;
loc: listopclass; // pour info les types en delphi commence par un "T" genre TOp=class(blabla);
Begin
setlength(elt, 6);
loc:=listopclass.init(elt, 0, 5);

//jusque là ça peux aller, mais si tu fait
setlength(elt, 32);

//le pointeur elt sera mis a jour, mais T_ELement de Loc sera forcement foireux, donc pratiquement toutes les opérations donneront une vilation d'accés .
loc.trier; //boom
ENd;


deuxième chose:
est-tu sur d'avoir construit ton objet de type listopclass ? ( en faisant comme plus haut )
est tu sûr de ne pas avoir "écrasé" la référence de cette objet ? ( comme les tableaux dynamiques, les objets en delphi sont implicitement des pointeurs )
0
Ishizaki Messages postés 51 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 4 décembre 2008
30 mars 2006 à 18:07
Heu, donc, tu veux que je te balance quoi comme code ? celui de l'unit de la classe ?
0
cs_neko Messages postés 135 Date d'inscription jeudi 14 août 2003 Statut Membre Dernière intervention 12 octobre 2006 1
30 mars 2006 à 19:01
ben la class en elle même n'est pas fausse ( même si certains choix ne sont pas judicieux a priori ) il faut voir comment tu l'utilise.
Pas besoin de montrer tout ton code, mais simplement la déclaraction d'un objet listopclass, son instanciation, etc. bref comment tu l'utilise
0
Ishizaki Messages postés 51 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 4 décembre 2008
30 mars 2006 à 19:49
voilà une des proc d'un formulaire, celui où se trouve les stringgrind:

{Formulaire d'enregistrement des modifs}
procedure TForm_Enreg.B_okbisClick(Sender: TObject);
var
ok : boolean;
i : integer;

begin
IBQ_demandeur.SQL.text :'select matricule from demander where CODEFORMATION'''+E_cf.Text+''';';
IBQ_demandeur.Open;{requete ouverte }


while not(IBQ_demandeur.Eof) do begin
ok := false;
for i := 0 to opun.recup_ilibre-1 do begin
opun.selectionner(i);{opun correspond au string grind des demandeurs de formation de type Op}
if IBQ_demandeur.Fields[0].Value = opun.recuperer.matricule then begin
ok := true;
end
end;
if not(ok) then begin
IBQ_part.SQL.text := 'insert into SUIVRE values('''+IBQ_demandeur.Fields[0].Value+''','''+E_cf.Text+''');';
IBQ_part.ExecSQL;
IBQ_part.SQL.text :'delete from DEMANDER where matricule '''+IBQ_demandeur.Fields[0].Value+''' and CODEFORMATION ='''+E_cf.Text+''';';
IBQ_part.ExecSQL;
end;
IBQ_demandeur.Next;
end;
IBQ_demandeur.Close;


for i := 0 to opun.recup_ilibre-1 do begin
opun.selectionner(i);
IBQ_demandeur.SQL.text :'select matricule from DEMANDER where CODEFORMATION'''+E_cf.Text+''' and MATRICULE = '''+ opun.recuperer.matricule+''';';
IBQ_demandeur.Open;
if IBQ_demandeur.Eof then begin
IBQ_part.SQL.text := 'insert into DEMANDER values('''+opun.recuperer.matricule+''','''+E_cf.Text+''','''+''','''+''');';
req := IBQ_part.SQL.text;
IBQ_part.ExecSQL;
IBQ_part.SQL.text :'delete from SUIVRE where matricule '''+opun.recuperer.matricule+''' and CODEFORMATION ='''+E_cf.Text+''';';
IBQ_part.ExecSQL;
end;
IBQ_demandeur.close;
end;
application.MessageBox('modification enregistrée','ok');
end;
0

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

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 mars 2006 à 05:14
Salut,
Il faut que tu nous donnes le code du Constructor et de la procedure Ajouter il y a de grandes chances pour que le problème s'y loge.


Et tu dis aussi :
... ça ne plantait pas avant, et faut que ça me fasse ça ce matin --__--.
qu'est ce que tu as modifié entre avant et ce matin

@+
Cirec
0
Ishizaki Messages postés 51 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 4 décembre 2008
31 mars 2006 à 18:23
Ok, ben j'ai rien modifié c'est bien ça le problème ! Et ça me reste en travers !

Mais bon, jvais vous montrer ces méthodes:

constructor listeopclass.init(elt : array of OP; selection : integer; libre : integer);
//on valorise les variables privées de la classe listeop
var i : integer;
begin


i := libre+1;
setlength(T_element,i);
for i := 0 to libre-1 do begin
T_element[i] := elt[i];
end;
isel := selection;
ilibre := libre;
end;

procedure listeopclass.ajouter(unOP : OP);
begin
T_element[ilibre] := unOP;//On ajoute un opérateur dans la première case libre du tableau
end;

Voilààààà ^^.


je quote tu quotes...
0
Ishizaki Messages postés 51 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 4 décembre 2008
1 avril 2006 à 17:56
Alors....Personne ?


je quote tu quotes...
0
Ishizaki Messages postés 51 Date d'inscription lundi 6 novembre 2000 Statut Membre Dernière intervention 4 décembre 2008
6 avril 2006 à 13:48
Heu je crois que le sujet a été lâché..snif...snif...

Bon bah en attendant, je vais continuer à chercher ce qui bug, mais merci de votre aide, elle est la bienvenue.

je quote tu quotes...
0
Rejoignez-nous