IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

probleme acces au form mdi


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut probleme acces au form mdi
    Bonjour;
    je suis nouveau sur les applications Mdi
    j'ai une form mdi child qui fait appele a une autre forme mdi child elle devient donc sa proprietaire. je fait appele a la deuxieme forme pour faire une extraction de donnés et revenir a la premiere avec des données.
    Mon probleme est que quand je veux affecté la valeur choisis a un Edit de la premiere forme a partir de la deuxieme j'ai une violation d'accée se produit..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    var i : integer;
        Trouve : Boolean;
    begin
     Trouve := False;
     for i := 0 to Application.MainForm.MdiChildCount-1   do
      begin
       if Application.MainForm.MdiChildren[i].ClassType = TFormMdiChild1 then
         begin
          Trouve:=true;
         end;
      end;
      if Trouve  then
       Begin
        FormMdiChild1.Edit1.Text:=Données1;
        FormMdiChild1.Label20.Caption:=Données2;
        FormMdiChild2.free;
       End;
    end;

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Faire FormMdiChild2.Release au lieu de FormMdiChild2.free;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bjr;
    Merci de s'etre interesser a mon Pb, mais sa ne resoupas le Pb car la violation d'accé de produise lord de l'affectation de la valeur a partir de la premiere fenetre vers la deuxieume fenetre
    FormMDIChild1.Edit1.Text:=FormMdiChild2.Donne;
    Merci d'avance...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    bonjour, j'ai eu le même problème

    si ça plante au niveau de l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FormMdiChild1.Edit1.Text:=Données1;
    tu devrais essayer qqc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    var i : integer;
        Trouve : Boolean;
        fmChild1 : TFormMdiChild1
    begin
     Trouve := False;
     for i := 0 to Application.MainForm.MdiChildCount-1   do
      begin
       if Application.MainForm.MdiChildren[i].ClassType = TFormMdiChild1 then
         begin
          Trouve:=true;
           fmChild1 := Application.MainForm.MdiChildren[i];
         end;
      end;
      if Trouve  then
       Begin
         fmChild1.Edit1.Text:=Données1;
         fmChild1.Label20.Caption:=Données2;
        FormMdiChild2.free;
       End;
    end;

  5. #5
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par rjuju
    bonjour, j'ai eu le même problème

    si ça plante au niveau de l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FormMdiChild1.Edit1.Text:=Données1;
    tu devrais essayer qqc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    var i : integer;
        Trouve : Boolean;
        fmChild1 : TFormMdiChild1
    begin
     Trouve := False;
     for i := 0 to Application.MainForm.MdiChildCount-1   do
      begin
       if Application.MainForm.MdiChildren[i].ClassType = TFormMdiChild1 then
         begin
          Trouve:=true;
           fmChild1 := Application.MainForm.MdiChildren[i];
         end;
      end;
      if Trouve  then
       Begin
         fmChild1.Edit1.Text:=Données1;
         fmChild1.Label20.Caption:=Données2;
        FormMdiChild2.free;
       End;
    end;
    Salut!

    Je suis persuadé que rjuju a raison mais je crois qu'il a oublié un petit détail.

    La raison pour laquelle ton appli plante est que tu tente d'accéder à la fiche #1 via sa variable. Comme tu travailles en MDI et que par conséquent il est possible d'avoir plusieurs instances de ta fiche #1, il est normal que la variable ne puisse pas toutes les contenir. En fait, il est même fort possible que la variable ne contienne rien du tout (nil) au moment d'y accéder. C'est pourquoi notre ami rjuju propose de stocker temporairement l'instance trouvée dans une variable locale et d'y accéder de cette façon.

    Le petit oubli de rjuju est dans la ligne "FormMdiChild2.free;". S'il est possible que FormMdiChild1 soit nil, il est aussi probable que FormMdiChild2 le soit également pour les mêmes raisons. Je suggère donc, si ton code est déjà dans la classe TFormMdiChild2, de changer la référence de FormMdiChild2 à self (self étant un pointeur sur l'objet en cours, F1 pour plus de détails).

    Enfin, Graffito a soulevé un détail qui pourrait devenir important éventuellement : une fiche, ça se libère avec Release() et non Free(). Sauf que perso, pour les fiches MDI, je préfère les libérer avec un simple Close(). Si tu décides d'y aller avec la méthode Close() n'oublie pas de mettre "Action := caFree" dans l'événement FormClose de tes fiches. Ça indique à ta fiches de libérer la mémoire qu'elle occupe si on la ferme (autrement, elle ne fera que se réduire dans le bas de son MDIForm maître).

    Bon dev!
    -Slimjoe

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour;
    Merci les amis pour l'importance que vous accordez à mon probleme mais désoler si je vous dit que cette solution est logique mais elle pose l'erreur de compilation suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Types incompatibles: 'TMdiChild1' et 'TForm'
    à la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       if Application.MainForm.MdiChildren[i].ClassType = TFOrdonnance then
         begin
          Trouve:=true;
          fmChild1 := Application.MainForm.MdiChildren[i];     
         end;
      end;
    Merci d'avance...

  7. #7
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Dans tes variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      fmChild1: TFOrdonnance;
    Dans le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       if Application.MainForm.MdiChildren[i].ClassType = TFOrdonnance then
         begin
          Trouve:=true;
          fmChild1 := Application.MainForm.MdiChildren[i] as TFOrdonnance; //Transtyper dans le type de ta fiche     
         end;
    -Slimjoe

  8. #8
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Très Bien
    Bonjour;
    Mille Mercis à vous tous qui se sont données de la peine pour m'aider c enfin résolus je vous suis très reconnaissant les amis et espérons que je puisse aider les autres
    Merci encore une autre fois a vous RJUJU & SLIMJOE

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/02/2007, 12h18
  2. [c#]probleme avec les menu toolStripItem dans une form mdi??
    Par must19 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/11/2006, 23h02
  3. Serveur de fichier Samba - problème accès Win XP
    Par rohstev dans le forum Réseau
    Réponses: 2
    Dernier message: 10/06/2005, 08h10
  4. [Struts]Accès aux Form en session depuis execute?
    Par odoli dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/12/2004, 13h55
  5. probleme de connexion forms-oracle
    Par bargou dans le forum Oracle
    Réponses: 2
    Dernier message: 11/11/2004, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo