sylviecl
Messages postés26Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 1 février 2006
-
26 juil. 2005 à 18:18
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008
-
24 août 2005 à 22:38
Bonjour,
J'ai un programme qui a une fiche parent (menu principal) et deux fiches enfants (une première qui montre toutes les fiches d'intervention dans une liste et une deuxième qui affiche la fiche). Tous mes champs sont liés à une table (exemple ficheinter.db).
Quand je clique sur la liste, ma fiche s'ouvre en modification (edit), ça c'est ok mais si j'enregistre (post) et que je veux modifier (edit), il me met "erreur de violation d'accès". ??
En fait tout se passe comme si une fois enregistré, il n'était plus sur la même fiche(alors qu'elle est affichée), possible ou pas (??) et comment résoudre mon problème.
Avis aux chevaliers blancs, damoiselle en détresse.
Sans rire, j'suis vraiment bloquée si quelqu'un à ne serais-ce qu'un bout d'idée, je prends.
Merci d'avance.
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 26 juil. 2005 à 22:35
Pour le bout d'idée, moi j'ai "dée" :oP
Plaisanterie à part, une violation d'accès peut se produire si tes deux fenetres enfants essayent d'acceder à la même table au même moment tout particulièrement si tu utilises des threads. Ce genre de problème peut être résolu par un mutex qui garantira que l'accès à la base de données ne se fera que par une portion de code (et donc une fiche enfant) à un instant x, la seconde devant alors attendre et vice versa.
Cordialement.
<HR>
Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
cs_Zeroc00l
Messages postés367Date d'inscriptionlundi 1 avril 2002StatutMembreDernière intervention11 février 2010 27 juil. 2005 à 17:46
en gros c'ets un peu comme si tu declarer un Boolean de facon global.
A chaque fois qu'une fenetre veut travailler sur ta table elle regarde
la valeur de ce booleen si il est a false cela signifie que personne
(aucune feuille mdi) ne travaillesur la table
elle met le booleen a true, travaille dessus et remet le booleen a false.
Si ele veut travailler et que le booleen est a true, alors la talbe est occupée et la feuille MDI attend son tour ..
Sauf que cet astuce (moche diront certain) a ete enjolivé avec un nouveau nom : les mutex
C'est un GROS resumé ...
parce qu'en imaginant que les instruction de test du booleen des thread
s'execute successivement , alors les deux rentrerait dans la partie "il
est a false je peux travailler dessus" et ca planterait.... mais bon
c'ets improbable voire impossible je suppose que les mutex gere ce
genre de probleme (si il existe)
sylviecl
Messages postés26Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 1 février 2006 27 juil. 2005 à 17:52
Merci pour l'explication, mais donc ce n'est pas cela, car je ne travaille pas avec mes avec deux fiches sur le même enregistrement.
Ma première mdi fille représente la liste et la seconde la fiche, or sur la liste je ne touche pas à l'enregistrement et je n'ouvre qu'uneseule fiche à la fois.
Donc, je cherche toujours, merci beaucoup quand même.
Vous n’avez pas trouvé la réponse que vous recherchez ?
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 27 juil. 2005 à 19:40
Heu, à moins que j'ai mal compris tu as dis "Tous mes champs sont liés à une table (exemple ficheinter.db)." donc si une unique table de travail, et plusieurs accès possibles, mutex impératif.
Cordialement.
<HR>
Il existe 10 catégories de personne. Ceux qui connaissent le binaire et les autres...
sylviecl
Messages postés26Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 1 février 2006 28 juil. 2005 à 09:11
Effectivement on pourrait penser cela mais quand j'ai un bouton qui met en edit en direct sur ma fiche cela fonctionne. Par contre quand j'utilise le menu de ma fiche parent, ça ne fonctionne pas et il me met erreur de violation. J'ai le même problème pour l'impression et l'envoi d'e-mail. J'avoue je comprends pas...
Merci d'essayer de m'aider en tout cas.
sylviecl
Messages postés26Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 1 février 2006 28 juil. 2005 à 09:15
Heu, non tu n'as pas mal compris j'ai oublié (pardon) de dire que ma liste travaille avec un query qui effectivement est lié à ma table ficheinter. Je pense que cela doit éliminer le problème non ?
sylviecl
Messages postés26Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 1 février 2006 28 juil. 2005 à 11:09
En fait dès qu'il y a un contrôle qui n'est pas relié à la table, il me met violation d'accès.
Par exemple dès que j'essaie d'imprimer ma fiche (celle ouverte), il bloque sur RVsystem dès le départ.
Voilà le code :
procedure TFormFichesInter.ImprimerFiche;
var
i,nb : integer;
begin
if not (DM1.TFicheInter.RecordCount = 0) then
begin
//état automatique sans passer par la fenêtre setup
RvSystem1.TitlePreview := 'Aperçu du Rapport d''intervention'; //il bloque là et me met erreur de violation d'accès
RvSystem1.SystemSetups := RvSystem1.SystemSetups - [ssAllowSetup];
Memo1.clear;
//affichage des articles utilisés dans l'intervention dans un memo
DBGMateriel.DataSource.DataSet.First;
nb := DBGMateriel.DataSource.DataSet.RecordCount;
for i:=1 to nb do
begin
Memo1.Lines.Add(DBGMateriel.Fields[4].Text+' '+DBGMateriel.Fields[3].Text);
DBGMateriel.DataSource.DataSet.FindNext;
end;
RvPEditFicheClient.Open;
RvPEditFicheClient.SetParam('TypeInter',TraitementIntervention);
RvPEditFicheClient.SetParam('Articles',Memo1.Text);
if MessageDlg('Voulez-vous votre fiche avec l''entête ISAPRO, Confirmer ?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then
RvPEditFicheClient.ExecuteReport('Report1')
else RvPEditFicheClient.ExecuteReport('Report2');
end;
RvPEditFicheClient.Close;
end;
J'essaye d'expliquer un peu plus clairement, enfin j'espère...
sylviecl
Messages postés26Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 1 février 2006 28 juil. 2005 à 14:28
Merci mais j'utilise ce forum comme une grande chance ! C'est vrai que trouver de l'aide sur son problème particulier n'est pas toujours facile et là je suis épatée on a une réponse qui si elle ne sollutionne pas tout de suite au moins aide et permet de voir son prog d'une autre manière. Merci beaucoup à tous.
sylviecl
Messages postés26Date d'inscriptionvendredi 24 septembre 2004StatutMembreDernière intervention 1 février 2006 28 juil. 2005 à 14:57
Je viens de m'apercevoir d'une chose dont je ne sais pas si ça a de l'importance :
en fait j'ai testé cela dans mon prog
FormFichesInter.RvSystem1.TitlePreview := 'Aperçu du Rapport d''intervention';
En fait il n'en a pas besoin puisque ce code est dans ma ficheinter, par contre cela ma permis de m'apercevoir que quand je le lance, FormFichesInter= nil ?? (en pas à pas )
Et évidemment ça plante parce qu'il ne trouve pas mon contrôle mais pourquoi, je ne comprends pas ?
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 29 juil. 2005 à 18:24
bah en pas a pas t'as eu ta réponse ?
if(fiche=nil)then exit;
lors de la creation des fiches tous composants visuel appellent leurs procédures d'affichages et c'est tout a fait normal , mais ici la fiche n'est pas encore creer ou non visible , et c'est une question de protection du code ,on devrais toujours verifier si l'objet est assigner ...
Bon ici c'est une fenêtre mdi ,alors elle se creer a chaque utilisation et est détruite après chaque utilisation , utilise plutôt une fiche standard en la créant a la création et utilise ShowModal qui bloque l'accès a la fiche principale tant que la fiche ne sera pas fermer
Application.CreateForm(TForm1, Form1);//visible
Application.CreateForm(TForm2, Form2);pas visible mais disponible