Déterminer le Form appelant

draft61 Messages postés 7 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 28 juillet 2005 - 22 juil. 2005 à 01:14
draft61 Messages postés 7 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 28 juillet 2005 - 28 juil. 2005 à 22:03
Bonjour,

je dois créer un prog dans lequel il y a un Form Recherche, permmettant de rechercher des Utilisateurs, Fournisseurs, Equipements...

Il existe un lien entre ces Données: Un équipement est vendu par un fournisseur et attribué à un utilisateur.

J'aimerais donc pouvoir appeler l'unique Form Recherche pour me renvoyer la bonne information :
* un IdUser si on appelle le Form Recherche depuis le Form Utilisateur
* un IdDealer si on appelle le Form Recherche depuis le Form Fournisseur...

J'aimerais donc savoir si le Form appelant peut-être reconnu dans le Form appellé et s'il y a moyen de renvoyé une variable à la fermeture du Form Recherche (ou plus exactement si on clique sur OK. Rien ne serait renvoyé sur clic de Cancel).

J'ai une solution avec des variables locales, modifiées à chaque appel, mais le code ressemble un peu à du bricolage.

Quelqu'un à une idée??

Merci!

10 réponses

jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
22 juil. 2005 à 09:28
Salut,



Utilises la propriété Tag de tes forms, ou un message perso WM_USER + constante que tu envois au clic.

j!nH
0
draft61 Messages postés 7 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 28 juillet 2005
23 juil. 2005 à 01:25
Tu n'aurais pas un exemple du WM_USER?? je ne trouve pas d'explication concrète. Il y a bien des exemples mais qui ne correspondent pas du tout à l'application que je veux faire et je ne sais pas l'adapter.

Merci!
0
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
23 juil. 2005 à 12:40
En fait je viens de relire correctement ta question. Lorsque tu
appelles ta form Recherche depuis les deux autres, tu crées
dynamiquement ta fiche Recherche, ou tu la rends juste visible?

j!nH
0
draft61 Messages postés 7 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 28 juillet 2005
23 juil. 2005 à 12:55
Le Form Recherche existe déja. Il contient les mêmes composants, qu'il soit appelé du Form Utilisateurs, Fournisseurs ou Equipements. La seul chose qui change, c'est que si on l'appelle du Form Equipement, le curseur se trouvera dans la bonne page du 'PageControl', puisqu'il y a un onglet par type de recherche. Donc Quand le Form Recherche s'ouvre, il contrôle le Form appelant et ouvre la bonne page du PageControl.
Après avoir fait la recherche, si on clique sur OK, le Form Recherche se ferme et renvoie l'Id de l'équipement (si Recherche avait été ouvert à partir du Form Equipement)
0

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

Posez votre question
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
27 juil. 2005 à 00:16
Etant donne que la Form Recherche existe deja , la declaration de sa
classe existe et appartient a ton code donc on peut la modifier .







Personellement j'ajouterais un evenement FOnCloseQuery de type TCloseQueryEvent a la fenetre Recherche







Je declarerais sa propriété OnCloseQuery en accès lecture/ecriture sur FOnCloseQuery.











Dans la procedure OnCreate de ta form principale j'initialiserai :



"SearchForm . OnCloseQuery" en lui affectant une methode de ta form principale
crée pour l'occasion et nommée par exemple "event_OnCloseQuerySearchForm".







Resultat (parce que je suis sur que t'a pas trouvé ca clair ^^ ):



---------------------



// TSearchForm fait reference a la classe de ta fenetre de recherche



//SearchForm sera le nom de ta fenetre de recherceh pour la suite


//La declaration de TSearchForm devrait ressembler a ça :






TSearchForm = class(TObject)



private



// ... du code auto generé et géré par delphi







protected



// Ajoutes la ligne qui suit dans la section private ou protected



FOnCloseQuery : TCloseQueryEvent ;







public



//... du code auto generé et géré par delphi







// Ajoutes ces deux lignes dans public



property OnCloseQuery : TCloseQueryEvent



read FOnCloseQuery write FOnCloseQuery ;



end;



---------------------







Maintenant selectionne SearchFor dans delphi, va dans l'inspecteur d'objet, onglet "evenements".



Là, doubles click dans OnCreate ca crée la methode associe a l'evenement si ce n'etait deja fait :







Ecris/ ajoute a l'interieur de cette methode :



---------------------



FOnCloseQuery := NIL; //Initialise (obligatoire)



---------------------







Toujours dans l'inspecteur , dans les évènements, double click sur OnCloseQuery







Dans la fonction met (le nom de la fonciton ressemble alors a ca ) :




---------------------







TSearchForm.OnCloseQuery(Sender : TObject; var CanClose : Boolean)



Begin


if Assigned(FOnCloseQuery)



FOnCloseQuery (Sender, CanClose);


End;




---------------------















Maintenant :







Dans la classe de la form principale (que je nommerai MainForm ) crées une méthode :



---------------------



procedure event_OnCloseQuerySearchForm(Sender : TObject; var CanClose : Boolean);



---------------------







dans le code de ta classe principale met le code pour cette methode :








---------------------




Procedure TMainForm.event_OnCloseQuerySearchForm(Sender : TObject; var CanClose : Boolean);



Begin



CanClose := false; //indique que SearchForm ne se ferme pas ...



SearchForm.Hide() //par contre toi tu la cache ...



Enabled := true; //et tu restitue le control a cette form



End;




---------------------







Dans le OnCreate de ta form principale :




---------------------



SearchForm.OnCloseQuery = event_OnCloseQuerySearchForm;




---------------------











La ou tu declenche l'apparition de SearchForm :




---------------------



Enabled := false;



SearchForm.Show();




---------------------



















Quelques Remarques :







En fait ce qu'o na fait c'est relegue la gestion de la fermeture de SearchForm a ta fenetre principale ...











Note : on aurait directement pu faire :



---------------------



SearchForm.OnCloseQuery = event_OnCloseQuerySearchForm;



---------------------



Sans creer la methode OnCloseQuery de SearchForm



Mais ca permet d'intercepter je jour ou t'a envie de changer quelquechose ...















J'espere que cette explication t'aidera sinon hesite pas a venir sur le chat !!!



Je suis l2 heure par jour en ce moment.


Bonne continuation


et pense a valider la reponse si elle te convient









-={[ Zeroc00l ]}=-
0
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
27 juil. 2005 à 00:23
En relisant je me suis apercu que il y avait deux evenemnt a gerer .. :)



ce que j'a idit est valable pour le click sur la croix de la fenetre (on tente de la ferme)



et bien le code qu'il y a dedans tu le copi et tu le met dans ton bouton Cancel





Sinon pour le bouton ok, tu peux faire de meme :

1) tu declare une variable de type TNotifyEvent qui ne prend pas de parametre

2) tu l'init a NIL dans le OnCreate de SearchForm

3) tu cree une methode dans ta form principale

4) tu link cette methode avec l'evenement de la SearchForm

5) et voila ..



par contre comment fait tu pour passer les information de la SearchForm a la MainForm ?


-={[ Zeroc00l ]}=-
0
draft61 Messages postés 7 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 28 juillet 2005
27 juil. 2005 à 22:55
... Justement, c'est ça ma question.
J'ai plusieurs Forms qui appellent SearchForm.
J'appelle SearchForm par showmodal. Il faudrait intercepter un paramètre pour savoir quel Form l'a appelé. Ainsi je pourrais me placer dans le champ qui m'intéresse.
- Le champ Utilisateur si SearchForm a été appelé du Form Utilisateur
- Le champ Fournisseur si SearchForm a été appelé du Form Fournisseur.

Idem à la fermeture (en appuyant sur OK), il faudrait renvoyer un paramètre pour indiquer l'Id de l'utilisateur trouvé lors de la recherche dans SearchForm.

J'ai essayé ton code (qui à l'air pas mal) mais il semble que se soit pour gérer l'affichage du SearchForm d'une autre manière. Je voulais l'essayer parce que je ne connais pas les méthodes que tu utilises. Mais j'ai un prob avec la ligne:
SearchForm.OnCloseQuery = event_OnCloseQuerySearchForm;
Tout passe à la compile mais ça plante!

T'as une idée pour mon problème de paramètres??

Merci.
0
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
28 juil. 2005 à 00:39
Verifie que la SearchForm es tcrée avant ta Form principale ... sinon forcement ca plante

Sinon comme ca je vois pas





Sinon pour ton probleme :

Si ce n'est pas ton code qui gere la fenetre SearchForm (tu a parle de show modale)

si c'ets une boite de dialog jevois pas comment faire sans faire des truc tres compliqué

Si c'ets toi qui l'a fait dans ce cas



c'est simple :



Fais toi une fonction Show overloadé qui prend en parametre le nom de la form appelante.



Sinon j'a ivu que tu etait venu sur mirc, j'etait au tel je suis revenu 30 minute apres (le taf ...)

Desolé

-={[ Zeroc00l ]}=-
0
cs_Zeroc00l Messages postés 367 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 11 février 2010
28 juil. 2005 à 00:40
Oups.. "mirc" = le chat ( l'habitude ... )

Perso j'utilise un logiciel externe ... pas le site
0
draft61 Messages postés 7 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 28 juillet 2005
28 juil. 2005 à 22:03
... Merci pour tes conseils. Mais je rechche une solution différente. Il s'agit juste de passer des paramètres dans un sens et dans l'autre. Si je ne trouve rien d'autre, je compte utiliser des variables locales et les modifier d'un Form à l'autre.
Si tu as une autre idée entre temps...

A+
0