[Delphi] problème MDI + Base de données + ListBox [Résolu]

problème MDI + Base de données + ListBox [Résolu] [Delphi] - Delphi/Pascal - Programmation

Marsh Posté le 31-08-2006 à 16:18:36    

Alors voilà le problème, j'ai créer un petit programme qui fait quelques requêtes sur une base de données via des composant ADOQuery et ADOConnection pour remplir une listeBox.  
 
Ayant testéle programme individuellement, je n'avais absoluement aucuns Problèmes. Ensuite, ce petit bout de programme à du être intégré dans un programme déjà existant sous forme de MDI. Le MDIForm contient actuellement le composant ADOConnection. J'ai donc fait les transformation nécessaire. j'ai passé ma mon programme en MDIChild, j'ai mis dans les uses le nom de ma MDIForm et j'ai changer les ConnectionString de mes requêtes. Dès lors, dès que j'ouvre pour la première fois la form contenant mon programme il me met une erreur de violation d'accès à l'adresse....
 
Perso je ne vois pas de quoi ca pourrait bien venir. quelqu'un pourrait'il m'éclairer?
 
merci d'avance!


Message édité par kishibojin le 01-09-2006 à 14:20:10

---------------
Premier membre du Fan Club Ebichu .:. Les gaufres c'est par -> ici
Reply

Marsh Posté le 31-08-2006 à 16:18:36   

Reply

Marsh Posté le 31-08-2006 à 17:17:09    

J'ai bien une petite idée : le second Form est-il crée au moment ou tu lui fait appel?
Si tu l'appelle dans le créateur du 1er form sans le creer explicitement, c'est normal.

Reply

Marsh Posté le 31-08-2006 à 18:19:21    

dans le .bdsproj j'ai enlevé la ligne de création de la form et sinon mon MDIChild je le crée sur l'évènement OnClick d'un bouton

Reply

Marsh Posté le 31-08-2006 à 18:29:28    

Pas d'idée alors.
Tu peut dire quelle est l'instruction exacte qui plante?  
Un petit extrait de code?

Reply

Marsh Posté le 31-08-2006 à 21:01:47    

il y a une chose de bizarre j'ai essayer avec deux autres formulaires, et les deux s'ouvrent sans problème. Un n'a pas accès à la base de données et l'autres oui et les donnes sont stocker dans un ADOLookupListBox pourtant ils sont tous ouvert de la même manière.
 

Code :
  1. procedure TMainSesame.ToolButton2Click(Sender: TObject);
  2. begin
  3.   EdtGroupes := TEdtGroupes.Create(Application);
  4. end;


 
par contre dans celui qui pose problème il plante lorque je veux créer un treeView
 
code de l'évènement OnCreate

Code :
  1. procedure TEdtGroupes.FormCreate(Sender: TObject);
  2. begin
  3.   EG_EdtSGroupe.Enabled := False;
  4.   EG_QueryPortes.Open;
  5.   EG_QueryEdtGroupe.Open;
  6.   TreeViewCreate;
  7. end;


 
Debut de de la procedure TreeViewCreate

Code :
  1. procedure TreeViewCreate();
  2. var
  3.   Enreg_id: TPtrId;
  4.   PtrId : TPtrId;
  5. begin
  6.   EdtGroupes.CNode := EdtGroupes.EG_TVGroupes.TopItem;
  7.   PtrId := EdtGroupes.CNode.Data;
  8.   if PtrId <> nil then
  9.     TreeViewClear;


et enfaite il plante sur la première ligne. j'ai essayer d'enlever tout ca et mettre que la procedure TreeViewClear mais ca plante à la première lignes de l'autre fonction. il me semble que ca apparait dès que je touche a mon TreeView.
 
Si après avoir vu l'erreur, si je relance plusieurs fois de suite mon programme le problème n'est plus :heink:

Reply

Marsh Posté le 01-09-2006 à 00:23:26    

Je sugererais :
 
procedure TEdtGroupes.FormCreate(Sender: TObject);
begin
  inherited FormCreate(Sender);
  EG_EdtSGroupe.Enabled := False;
  EG_QueryPortes.Open;
  EG_QueryEdtGroupe.Open;
  TreeViewCreate;
end;

 
De plus, pour éviter une dépendance à l'ordonancement d'exécution, tu devrait passer un TEdtGroupes en parametre de TreeViewCreate.


Message édité par el zozo le 01-09-2006 à 09:41:24
Reply

Marsh Posté le 01-09-2006 à 08:18:58    

Euh oui mais si je met cette ligne, il me met une erreur à la compilation avec Identificateur non déclaré


---------------
Premier membre du Fan Club Ebichu .:. Les gaufres c'est par -> ici
Reply

Marsh Posté le 01-09-2006 à 09:54:10    

kishibojin a écrit :

Euh oui mais si je met cette ligne, il me met une erreur à la compilation avec Identificateur non déclaré


Oui, non... On vas dire que j'était fatigué  [:autruche]  
A part ça, la violation d'adresse, c'est généralement quand un objet n'est pas créé au moment de l'execution.
Un petit code du genre
 
procedure TreeViewCreate();
(...)
begin
 if EdtGroupes = nil then showMessage ('EdtGroupes null');  //si tu apelle la procedure depuis un autre endroit
 if EG_TVGroupes = nil then showMessage ('EG_TVGroupes null');
 (...)
end;
 
devrait te donner l'explication.
 
De plus, si on TreeView est vide, CNode est null et donc l'appel à Cnode.data provoque une violation d'accées à la 2ième ligne


Message édité par el zozo le 01-09-2006 à 09:58:38
Reply

Marsh Posté le 01-09-2006 à 10:23:22    

j'ai essayer et apparement il rentre dans la première condition donc EdtGroupes est à nil quand il passe dans mon TreeViewCreate.
 
Donc maintenant me reste plus qu'à résoudre ca et c'est bon je suppose


---------------
Premier membre du Fan Club Ebichu .:. Les gaufres c'est par -> ici
Reply

Marsh Posté le 01-09-2006 à 10:34:23    

En fait, c'est pour ça que je suggerait de passer ton?? en parametre plutot que d'attaquer le EdtGroupes en variable globale. Ca t'empeche d'apeller la procedure si le form utilisé n'existe pas.
 
Tu n'aurait pas déclaré 2 EdtGroupes a 2 niveaux de visibilité different, par asard?

Reply

Marsh Posté le 01-09-2006 à 10:34:23   

Reply

Marsh Posté le 01-09-2006 à 11:10:12    

en faite je crois avoir plus ou moins cerner le problème. Dans mon évènement FormCreate j'ai mis la procedure TreeViewCreate. Ceci pour avoir mon TreeView rempli à l'ouverture de ma form. Si je l'enlève ça fonctionne très bien. Le truc c'est que apparement ma form ne dois pas être encore créé puisque lorsque ma procedure se lance le test retourne que EdtGroupes = nil.
 
Maintenant il faudrait que je trouve le moyen de lancer ma procedure TreeViewCreate juste après création du formulaire et non pendant la création. tu vois le truc?


---------------
Premier membre du Fan Club Ebichu .:. Les gaufres c'est par -> ici
Reply

Marsh Posté le 01-09-2006 à 11:17:33    

FormCreate est appelé après la création.
 
Je pense surtout qu'a la 1ere execution, ta procedure n'est pas appelé par "EdtGroupes := TEdtGroupes.Create(Application);"
 
Ou que tu a déclaré un autre EdtGroupes au niveau de TMainSesame
 
En tout état de cause, un code "propre" serait :
 

Code :
  1. procedure TEdtGroupes.FormCreate(Sender: TObject);
  2. begin
  3.   EG_EdtSGroupe.Enabled := False;
  4.   EG_QueryPortes.Open;
  5.   EG_QueryEdtGroupe.Open;
  6.   TreeViewCreate(self);
  7. end;


 

Code :
  1. procedure TreeViewCreate(MonForm :TEdtGroupes) ;
  2. var
  3.   Enreg_id: TPtrId;
  4.   PtrId : TPtrId;
  5. begin
  6.   MonForm.CNode := MonForm.EG_TVGroupes.TopItem;
  7.   if MonForm.CNode.Data <> nil then
  8.     TreeViewClear;
  9.   (...)


 
Ou simlement de faire de TreeViewCreate une methode de la classe TEdtGroupes (à priori le plus logique)


Message édité par el zozo le 01-09-2006 à 11:22:24
Reply

Marsh Posté le 01-09-2006 à 11:26:52    

Citation :

Ou simlement de faire de TreeViewCreate une methode de la classe TEdtGroupes (à priori le plus logique)


 
c'est exactement ce que je viens de faire et sur l'évènement du bouton, juste après j'appelle la méthode TreeViewCreate et du coup ca fonctionne comme un chef.  
 
En tout cas merci pour ton aide :jap:


---------------
Premier membre du Fan Club Ebichu .:. Les gaufres c'est par -> ici
Reply

Sujets relatifs:

Leave a Replay

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