Probleme affectation de données vers une form mdi

Résolu
demande001 Messages postés 15 Date d'inscription samedi 24 juin 2006 Statut Membre Dernière intervention 4 novembre 2008 - 13 nov. 2006 à 08:53
demande001 Messages postés 15 Date d'inscription samedi 24 juin 2006 Statut Membre Dernière intervention 4 novembre 2008 - 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;

5 réponses

demande001 Messages postés 15 Date d'inscription samedi 24 juin 2006 Statut Membre Dernière intervention 4 novembre 2008
26 nov. 2006 à 09:51
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;
3
demande001 Messages postés 15 Date d'inscription samedi 24 juin 2006 Statut Membre Dernière intervention 4 novembre 2008
14 nov. 2006 à 09:27
Y a personne pour me rependre ?
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
14 nov. 2006 à 16:22
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.
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
15 nov. 2006 à 08:17
je voulais juste "supprimer" mon ps2, j'avais pas vu que tu avais poster le jour d'après. dsl.
0

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

Posez votre question
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
21 nov. 2006 à 09:10
salut,

Cette méthode fonctionne très bien.

quelle partie posent problème?
0
Rejoignez-nous