Application MDI

Résolu
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009 - 31 oct. 2008 à 18:45
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009 - 3 nov. 2008 à 16:17
bjrs;
j'espére trouver bon echo a mon interogation, j'ai une forme MDI principale (form1) et une MDIshild (Form2) et une forme normale (form3).
j'ai mis un Edit (Edit1) et un Speed (speed1) sur Form2, et Quand je clique le Speed j'affiche en modal (Form3) sur laquelle j'ai mis un DBGrid (DBGrid1) et j'aimerais que: quand je doublclique sur le DBGrid j'affecte la valeur du champs de l'enregistrement actif a l'Edit de la forme2 et que je ferme Form3.
j'ai donc ajouter form2 dans le uses de form3 et j'ai mis le code suivant a l'evenement dblclic du DBGrid de la form3:
  Form2.Edit1.Text := Table1.FieldByName('Nom_Champ').AsString;
  Form12.Close;
mais ça plante surement du fait que je suis en MDI!!!
Une ame charitable pour me debloquer de cette situation ???

28 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 13:33
Ok tant mieux :) pense à accepter la réponse ;)

Cordialement, Bacterius !
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
3 nov. 2008 à 14:10
essaie la méthode FindComponent genre :

Compocherche : TTable;
with form2 do
begin
    Compocherche := TTable(FindComponent('Table1'));
    if Assigned(Compocherche ) then
     Compocherche.Append;
  end;

par contre, tu n'as mis tout le code.. 

cantador
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
3 nov. 2008 à 14:28
TTable(ActiveMDIChild.Components[index de table1]).Append;

Si tu mets ça dans le code de la form3, c'est normal : car tu utilises ActiveMDIChild de la form3.

Essaye cela : TTable(Form1.ActiveMDIChild.Components[index de table1]).Append;

Voilà ...

Et, en effet : mets tout le code, cela nous aidera.

Cordialement, Bacterius !
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
31 oct. 2008 à 23:07
bonsoir,


j'ai pas encore testé, mais si tu fermes Form2, ton edit disparait..
que devient sa valeur ?

cantador
0

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

Posez votre question
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
31 oct. 2008 à 23:51
Salut !
En fait il ferme la Form12 ^^'
Mais normalement quand on fait un Close sur une fiche non principale, elle ne fait que disparaître - rien n'est libéré est tout est conservé.
Donc pour rebondir sur Cantador, la valeur de l'edit ne change pas.

Sinon, je crois bien qu'une application MDI n'est, au minimum, que une paire de fiches, une principale et une autre. Appelons-les A et B.

A appelle une instance de B
donc A => B1

Si tu réappelles une autre instance de B :
A => B1
A => B2

Bref, si Form2 est la fiche MDI, si tu dis Form2. ..., l'application ne sait pas à quelle instance tu fais référence ! Bref, elle manifeste son problème par un plantage ...

Essaye voir du côté de Form1.MDIChildCount et Form1.MDIChildren[Index: Integer]
Elle permet d'accéder à la fiche de l'instance voulue.

Dans une application MDI, appeler la fiche MDI par sa référence absolue n'a pas de sens, car cette fiche obtient plusieurs instances. Il faut alors faire avec ces instances.

Après, cela n'est écrit nulle-part, c'est juste extrait de mes experiences personnelles d'utilisation d'MDI.

En espérant que cela aura répondu à ton problème :)

Cordialement, Bacterius !

PS : je ne suis absolument pas certain de ce que je dis, je n'ai pas pu tester, mais je pense que cela t'apportera quelques éléments de réponse.
Pense bien à Form1.MDIChildCount et Form1.MDIChildren !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 01:03
Oui en effet "Form2.Close" plante.
Car, conséquence des informations que j'ai développées plus haut, fermer la fenêtre MDI de cette façon n'a pas de sens.
Je pense que ça devrait marcher avec ceci :

Form1.MdiChildren[IndexDeMaMDI].Edit1.Text := Table1.FieldByName('Nom_Champ').AsString;
Form1.MdiChildren[IndexDeMaMDI].Close;

Voilà !

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 01:05
Ou même mieux en fait :

Form1.ActiveMDIChild.Edit1.Text := Table1.FieldByName('Nom_Champ').AsString;
Form1.ActiveMDIChild.Close;

Héhé ...

Cordialement, Bacterius !
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
1 nov. 2008 à 09:48
form12, vous savez moi sans mes lunettes...

cantador
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
1 nov. 2008 à 10:50
en faite! j'ai pas parler de la fermeture de form2 !! mais plutot de Form3 elle méme donc là ya pas de problemes.
mais pour recuperer la valeur de l'enregistrement actif sur form3 dans l'edit1 de form2 j'ecris:
Form1.ActiveMDIChild.Edit1.Text := Table1.FieldByName('Nom_Champ').AsString;
ou:
Form1:c'est la MDI principale.
Form2: la MDIChild. (et c'est la MDIChild Active dans mon cas).
Form3: une modal non MDI.

le probléme c'est que ça reconnait pas Edit1 !!!
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 11:16
Allez je tente :

with Form2 as Form1.ActiveMDIChild do
if Components[0] is TEdit then TEdit(Components[0]).Text := ...

Pense bien à mettre ton TEdit comme premier composant de la fiche.

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 11:24
J'ai essayé ceci dans une application MDI brouillon :

1 TEdit en 2eme position (donc index 1) dans le child.

TEdit(Form1.ActiveMdiChild.Components[1]).Text := 'Salut !';

L'enfant actif change sa valeur ;)

Mais on va essayer de peaufiner ça hmm ?

function TForm3.ChangeEditValue(EditIndex: Integer): Boolean;
begin
Result := False;
if Form1.ActiveMDIChild.Components[EditIndex] is TEdit then
begin
TEdit(Form1.ActiveMDIChild.Components[EditIndex]).Text := Table1.FieldByName('Nom_Champ').AsString;
Result := True;
end;
end;

Cette fonction te permettra de changer la valeur de ton TEdit en ce que tu désirais.
Tu spécifies juste l'index de l'edit, et la fonction te renverra True si ça a marché, False si ça a foiré.

N'oublie pas que les Index commencent toujours à 0.

Cordialement, Bacterius !
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
1 nov. 2008 à 12:01
TEdit non declaré!!!!!!
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 12:35
Lol ...
Chez moi ça marche ^^ tu es sur que tu as bien écrit ce que j'ai fait ?
As-tu mis Classes dans les Uses ? Quelle version de Delphi utilises-tu ?

Cordialement, Bacterius !
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
1 nov. 2008 à 12:48
delphi5 pro
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 12:53
Bizarre ...
Essaye de faire mot à mot ce que j'ai écrit.
Chez moi ça passe sans problème ...

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
1 nov. 2008 à 12:54
(Delphi 6 Personal)
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
1 nov. 2008 à 13:25
thank's mon grand ça a marché!
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
2 nov. 2008 à 13:47
Mais normalement quand on fait un Close sur une fiche non principale, elle ne fait que disparaître - rien n'est libéré est tout est conservé.
Donc pour rebondir sur Cantador, la valeur de l'edit ne change pas.

chuis pas d'accord sur ce point Bactérius,
oui pour la forme, mais la valeur saisie dans l'edit elle est perdue sauf à la stocker dans une variable..

cantador
0
impossibleok Messages postés 54 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 26 juin 2009
2 nov. 2008 à 18:23
l'edit est dans une autre forme child ok!!

sinon:
si j'ai Form1 MDI principale.
???je peux actualiser une table (Table1) qui est dans une form MDIchild Active (Form2) a partir d'une autre forme modal (Form3) avec ce code?
TTable(Form1.ActiveMDIChild.Components[index de Table1]).Refresh;
???
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
2 nov. 2008 à 21:59
Bien sûr ! Tant que tu peux avoir accès à la forme MDI active, tu peux accéder à ses composants et à leur contenu ! Donc il suffit d'ajouter l'unité de la Form1 en Uses dans ta Form3, et ça devrait coller ;)
@Cantador : je ne savais pas cela en revanche, merci Cantador de cette info :)

Cordialement, Bacterius !
0
Rejoignez-nous