Accueil > Forum > > > > Pb objet Eaccess violation 004B8620
Pb objet Eaccess violation 004B8620
mardi 23 janvier 2007 à 17:28:40 |
Pb objet Eaccess violation 004B8620

martChamp
|
Bonjour à tous,
Dans un programme que je devellope, j'utilise une classe objet (intervenant) qui a pour attribut un tableau d'objet (poste)
Description class intervenant
type intervenant = class ( TObject )
private
Nom : string; Prenom : string; Adresse1 : string; Adresse2 : string; Email : string; DateNaiss : string; LieuNaiss : string; Nationalite : String; NumSecu : string; NumConge : string; Tel : string; Fax : string; Portable : string; DateEmbauche : string; lesposte : Array of poste; nbposte : integer;
Plus loing dans une procedure je me sert de ma base de donnée pour initialiser mon objet intervenant
procedure intervenant.loadSQL(idinter : integer);
begin with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT * FROM intervenant WHERE idintervenant LIKE "'+ inttostr(idinter) +'"'); Active := true; end;
Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString; Nationalite := bdd.ModuleBDD.ADOQuery_traitementint.fields[11].AsString; LieuNaiss := bdd.ModuleBDD.ADOQuery_traitementint.fields[10].AsString; Adresse2 := bdd.ModuleBDD.ADOQuery_traitementint.fields[4].AsString; Tel := bdd.ModuleBDD.ADOQuery_traitementint.fields[5].AsString; Fax := bdd.ModuleBDD.ADOQuery_traitementint.fields[6].AsString; Portable := bdd.ModuleBDD.ADOQuery_traitementint.fields[7].AsString; Email := bdd.ModuleBDD.ADOQuery_traitementint.fields[8].AsString; Nom := bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString; Prenom := bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsString; DateNaiss := bdd.ModuleBDD.ADOQuery_traitementint.fields[9].AsString; NumSecu := bdd.ModuleBDD.ADOQuery_traitementint.fields[12].AsString; NumConge := bdd.ModuleBDD.ADOQuery_traitementint.fields[13].AsString; dateEmbauche := bdd.ModuleBDD.ADOQuery_traitementint.fields[14].AsString;
with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT nomposte, cnc, idintervenant FROM intervenant_poste, poste WHERE intervenant_poste.numposte = poste.numposte AND idintervenant LIKE "'+ inttostr(idInter) +'"'); Active := true; first; while not eof do begin nbposte := nbposte + 1; lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next; end; end; end;
Delphi me fait une erreur eaccess violation a la ligne mis en rouge, je ne vois pas pk, je pensse que cela vien d'un probléme de pointeur!!!
Je compte sur vous pour méclairer dautant que je suis debutant un delphi. Merci d'avance
|
|
mardi 23 janvier 2007 à 19:38:52 |
Re : Pb objet Eaccess violation 004B8620

jace1975
|
yo,
déjà ton code pas très clair avec tes dd.ModuleBDD.ADOQuery_traitementint bon c'est pas tres grave mais c'est chiant a lire sur 20 lignes alors 50000 je te raccontes pas
sur ton problème, je vois deux choses : - tu utilises un objet poste, mis je ne vois pas dans ton code un truc du genre poste:=tposte.create( param);
donc forcément tu essaye d'acceder à une procédure de ton objet poste qui n'a pas été défini en mémoire donc....
- array of poste , mouais pourquoi pas mais ton tableau n'est jamais défini ni dynamiquement ni à la déclaration donc ca risque de coincer aussi ici ( perso y'a longtemps que j'ai abandonné les array pour gérer des object -> tobjectlist )
tschusssss
|
|
mardi 23 janvier 2007 à 19:55:36 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
il faut que tu fasse un SetLength(lesposte, TAILLE) pour allouer des emplacements memoire à ton tableau dynamique. NB: les indices de ton tableau commencent à 0. NB : jette un coup d'oeil a l'aide : tableaux dynamiques => tableaux dynamiques (Reference du langage delphi)
nbPoste := 0; with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT
nomposte, cnc, idintervenant FROM intervenant_poste, poste
WHERE intervenant_poste.numposte = poste.numposte AND idintervenant
LIKE "'+ inttostr(idInter) +'"'); Active := true; first; while not eof do begin nbposte := nbposte + 1; setLength(lesposte, nbposte); lesposte[nbposte-1]
:=
poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next; end; end;
|
|
mardi 23 janvier 2007 à 20:00:01 |
Re : Pb objet Eaccess violation 004B8620

Delphiprog
|
Réponse acceptée !
Ton Tableau lesposte n'est pas dimensionné ! 1/ Soit tu lui attribues une taille dans le constructeur de la classe intervenant si tu la connais lors de l'instanciation d'un objet intervenant. Au passge, essaie d'utiliser la convention d'écriture utilisée par Borland en mettant un "T" devant le nom de la classe. Cela permet de distinguer entre l'instance de la classe et la classe et d'éviter les erreurs de débutants. 2/ soit tu le dimensionnes automatiquement dans le code begin nbposte := nbposte + 1; //redimensionner le tableau dynamiquement SetLength(lesposte, nbposte); lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next;3/ soit tu utilises un descendant de la classe TObject comme TList, TComponentList ou TObjectList, etc qui facilite la gestion des références et la désallocation de mémoire de manière automatique... De grâce, utilises le mot clé With pour alléger ton code et le rendre plus lisible...  Un dernier conseil : évites d'utiliser les champs par leur index retournés par une requête. Si ta base est restructurée, tout ton code est à revoir... Exemple : au lieu de Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString;Tu peux écrire : with bdd.ModuleBDD.ADOQuery_traitementint do begin Adresse1 := FieldByName('Adresse1').AsString; //...la suite end;
De cette manière le code est largement plus lisible et plus facile à maintenir. Enfin ,si je puis me permettre un dernier conseil d'optimisation, est-ce bien utile d'utiliser un prédicat comme Like (très gourmand en temps de traitement) dans tes requêtes SQL quand il ne s'agit que de comparer avec une valeur entière ? 'SELECT * FROM intervenant WHERE idintervenant LIKE "'+ inttostr(idinter) +'"'
Suggestion : 'SELECT * FROM intervenant WHERE idintervenant = '+ inttostr(idinter) +'''
Bon courage pour la suite  May Delphi be with you !
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient. 
|
|
mardi 23 janvier 2007 à 20:04:09 |
Re : Pb objet Eaccess violation 004B8620

Delphiprog
|
Erratum : au lieu de : lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString);
Il faut lire : lesposte[nbposte - 1] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString);Je suis tout à fait d'accord avec jayce1975 pour dire ques tableaux c'est bien et qu' il y a très longtemps que je ne les utilise plus non plus. May Delphi be with you !
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient. 
|
|
mardi 23 janvier 2007 à 20:07:35 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
j'ai ete si lonb que ca a repondre !!!
@jace : - je ne vois pas de variable "poste", je vois bien un intervenant.loadSQL. Et si l'objet n'existait pas, ca aurait planté sur une ligne precedente, comme Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString; par exemple - il est vrai que dans ce cas, une TObjectList serait plus appropriée
De plus je ne vois pas de fermeture de tes requetes SQL. un petit ADOQuery_traitementint.freeou un ADOQuery_traitementint.active := false; ferait pas de mal.
|
|
mardi 23 janvier 2007 à 20:17:29 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
je crois qu'il y a un leger souci de conception, la condition idintervenant LIKE "'+ inttostr(idinter) +'" me semble tres etrange. En effet, l'utilisation du like et des guillemets me laissent penser que c'est un champ texte, et que martChamp utilise seulement des entiers dans ce champ. Ou est donc l'interet de ne pas utiliser un champ de type entier qui sera beaucoup plus rapide pour ces traitements?!!
Une autre petite remarque (pour delphiprog notament) : je suis d'accord que l'utilisation du like dans ce cas est completement sans interet, mais je pense qu'un SGBD digne de ce nom doit etre capable de voir qu'il n'y a pas de caractere "%" dans la valeur, et donc qu'il faut simplement le remplacer par un "=" pour obtenir le meme resultat.
|
|
mercredi 24 janvier 2007 à 14:26:59 |
Re : Pb objet Eaccess violation 004B8620

martChamp
|
bonjour et mercie beaucoup pour votre reponsse sa marche ainssi, il et clair qu'avec un type tobjectlist se serait plus simple, je vais me pencher la dessus. Enfin mercie encor de m'avoir débloquer , longue vie a la prog 
|
|
Cette discussion est classée dans : fields, bdd, adoquery, modulebdd, traitementint
Répondre à ce message
Sujets en rapport avec ce message
Calculated fields [ par maga ]
Salutje galère, j'ai fait tout les forums impossiblea trouver le moyen avec une Dbgrid de faire un relevéde compte avec débit- crédit- solde mis a jou
Sql et Bdd [ par viper ]
Je cherche depuis qq temps à récupérer le resultat d'une requet SQL avec un TQuery et une base de donnée mais sans succès...J'aimerais donc savoir com
TTable: copier une table dans une autre [ par juan ]
Bonjour tous, mon problème aujourd'hui, c'est que j'ai une table Table1 qui est filtrée, j'ai créé une deuxième table Table2 sans aucun enregistrement
Lien vers des fichiers dans une bdd??? [ par pedrito83 ]
débutant confirmé ;-)Voilà, je dois programmer en Delphi2 (oui je sais on en est au 6 ) et je débute en delphi (1 semaine que je programme seulement )
Selectionner un alias de BDD à partir d'un formulaire [ par lomig ]
Bonjour, j'aimerais pouvoir a partir d'un formulaire, avoir accès à la liste des alias de BDD pour pouvoir en choisir une et l'assigner aux differents
BDD et Internet [ par JoeyAstor ]
Bon alors c pas simple ... pour moi en tout cas ...je voudrais me connecter à une base access ... jusque là pas de problème ... si ce n'est que ma bas
àexécution/pas à pas [ par usmok ]
j'ai un prog ki gere plusieurs bddkan j'exécute l'appli, mon prog plante (pendant kil é en train de trier des infos stovker sur une des bdd)alors ke k
àexécution/pas à pas [ par usmok ]
j'ai un prog ki gere plusieurs bddkan j'exécute l'appli, mon prog plante (pendant kil é en train de trier des infos stovker sur une des bdd)alors ke k
bdd définie par l'utilisateur [ par lnicos ]
Salut, j'aimerais un programme de base de données, mais je ne sais pas si je dois utiliser ado, dbexpress ou autre.J'aimerais que l'utilisateur puisse
BDD client/serveur [ par Corbatwork ]
salutquelqu'un pourrait-il m'expliquer simplement quels sont les composants à utiliser pour faire une appli BDD en serveur et les composants à utilise
Livres en rapport
|
Derniers Blogs
[SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|