demande001
Messages postés15Date d'inscriptionsamedi 24 juin 2006StatutMembreDernière intervention 4 novembre 2008
-
13 nov. 2006 à 08:53
demande001
Messages postés15Date d'inscriptionsamedi 24 juin 2006StatutMembreDerniè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;
demande001
Messages postés15Date d'inscriptionsamedi 24 juin 2006StatutMembreDerniè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;
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 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.