Probleme affectation de données vers une form mdi [Résolu]

demande001 17 Messages postés samedi 24 juin 2006Date d'inscription 4 novembre 2008 Dernière intervention - 13 nov. 2006 à 08:53 - Dernière réponse : demande001 17 Messages postés samedi 24 juin 2006Date d'inscription 4 novembre 2008 Dernière intervention
- 26 nov. 2006 à 09:51
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..


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;
Afficher la suite 

6 réponses

Répondre au sujet
demande001 17 Messages postés samedi 24 juin 2006Date d'inscription 4 novembre 2008 Dernière intervention - 26 nov. 2006 à 09:51
+3
Utile
Bonjour;
Un ami que je connais pas ma donné la solution suivante qui marche à 100% :

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] as TFormMdiChild1;
     end;
  end;
  if Trouve  then
   Begin
     fmChild1.Edit1.Text: =Données1;
     fmChild1.Label20.Caption:=Données2;
    FormMdiChild2.free;
   End;
end;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de demande001
demande001 17 Messages postés samedi 24 juin 2006Date d'inscription 4 novembre 2008 Dernière intervention - 14 nov. 2006 à 09:27
0
Utile
Y a personne pour me rependre ?
Commenter la réponse de demande001
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 14 nov. 2006 à 16:22
0
Utile
salut,

je vais peut-être avoir l'air négatif, mais t'es pas partie juste. C'est bourré de fautes.

(dsl, mais j'ai de la peine a comprendre ta question -> réécriture)
Sous-titre :
"Je crée une form MDIChild(F2) depuis une FormMDI (F1). F2 est une form de dialoge pour selectionner des données de F1.

J'ai une AV lorsque je tente de lire la valeur d'un TEdit de F1 depuis F2 (je suis pas sur du sens dans lequel tu fait l'opération).

D'où peut venir le problème?"


Pour commencer utilise les MDIChild pour des document ou des entité similaire.

utilise des form normal pour les dialogues.

ensuite, de manière général une form MDICHild n'est pas proriétaie d'une autre. C'est l'application qui les possède. (il y a toujours des cas différent, mais c'est presque une régle universelle.) Ceci évite les problème du genre "et si user ferme F1/F2 en premier?" et les problèmes de mémoires.

Aussi, on évite les .free sur les TForm, on appel .Close ou .release. mais pas .free. (lit l'aide et des post de ce forum si tu veux savoir pourquoi)


Ensuite ton bout de code ne sert à rien.

Si tu as la var FormMDICHild1, pourquoi fait tu une recherche dans MDICHildren?
Et si tu ne l'as pas et que tu doit la rechercher, pourquoi utilise tu une var global après ta boucle?
de plus, tu fait une recherche par CLASS et non par INSTANCE. donc si t'as eux fenêtre ouverte, tu ne sait pas ce qui vas se passer.

(je suppose que) Tu as une AV car tu fait référence à FormMDiChild1 qui est une var global que tu as probablement soit déjà détruit, soit pas construit.

Je te propose (de tête, donc y a peut-être des blanc) une structure qui devrait résoudre ton problème:

1) crée une form de dialog ( TfrmExtraireDonnee) pour "extraire tes donnée"
1.1) crée une propriété "Appleant : TFormMDIChild"
1.2) crée une propriété "DonneeChoisie : String"
1.3) dans .OnHide affect DonneeChoisie
1.4) dans .onShow init ton affichage en utilisant "Appelant" (et non une var global)
1.5) met deux TBitBtn avec des valeurs pour .ModalResult (MrOk, mrCancel) pour fermer la form.

2) depuis ta FormMDI, appel ton dialogue comme ça
with TfrmExtraireDonne.Create do
try
Appelant := self;
if ShowModal = mrOk then
TraiterDonne(DonneChoisie);

finally
Release;
end;

3) cree tes form MDI comme dans l'exemple de Delphi.

voilà. avec cette structure, tu ne devrait plus avoir de AV.
(tu devrait pouvoir "corriger" ton code sans devoir tout réécrire)

PS:
1) Oublie pas de faire des tests "Assigned" là ou c'est nécessaire.

2) On ne travail pas pour le site, on répond pour rendre service. Alors ne t'attent pas à avoir une réponse sous 30min (surtout à 9h du mat: soit on est au taf, soit on dort.)

3) si ton dialogue est très gros, utilise plutôt une instance global.
Commenter la réponse de cs_Loda
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 15 nov. 2006 à 08:17
0
Utile
je voulais juste "supprimer" mon ps2, j'avais pas vu que tu avais poster le jour d'après. dsl.
Commenter la réponse de cs_Loda
demande001 17 Messages postés samedi 24 juin 2006Date d'inscription 4 novembre 2008 Dernière intervention - 18 nov. 2006 à 10:02
0
Utile
Bonjour ;
Merci Loda pour votre aide et vos conseils
mais désolé car votre méthode n'a pas marché je me suis retourné vers l'ancienne méthode de prog (SDI) avec les .Show; et le .Close;
domage j'aurais bien aimer travailler sur des applications MDI
Commenter la réponse de demande001
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 21 nov. 2006 à 09:10
0
Utile
salut,

Cette méthode fonctionne très bien.

quelle partie posent problème?
Commenter la réponse de cs_Loda

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.