Plantage avec les fenêtres MDI

sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 1 février 2006 - 26 juil. 2005 à 18:18
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 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.

14 réponses

WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 2
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...
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 1 février 2006
27 juil. 2005 à 09:12
Rebonjour ,
Moi j'ai juste "i".
Heu sérieusement, j'suis pas encore réellement très "douée" en delphi, c'est quoi un mutex ?
Merci
0
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 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)


-={[ Zeroc00l ]}=-
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Derniè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.
0

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

Posez votre question
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 2
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...
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Derniè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.
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Derniè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 ?
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Derniè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...
0
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
28 juil. 2005 à 13:44
Hum jamais utiliser ca .. je suis hors course la :(



Sinon ouais que ce soit plus clair ou pas au moins t'essayes d'autre ne
le font meme pas et ral contre les developpeur apres .... ^^

-={[ Zeroc00l ]}=-
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Derniè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.
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Derniè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 ?
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 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

yve
0
sylviecl Messages postés 26 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 1 février 2006
24 août 2005 à 17:52
Merci pour la réponse mais malheureusement je suis obligée de passer par une fenêtre mdi puisque j'utilise un menu général dans me fenêtre mdi parent.
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
24 août 2005 à 22:38
tu peux peut-être creer une application midi ,et compare le code ça devrais t'aider.
menu fichier /nouveau/autres/projets/MDI application

yve
0