Variable publique, creation dynamique ?

Variable publique, creation dynamique ? - Delphi/Pascal - Programmation

Marsh Posté le 29-12-2004 à 11:10:47    

Bonjour,
voila g un projet ou je cree differentes fenetres heritees d une fenetre de "base" dans laquelle je declare une variable publique ModeSaisie.
 
Dans ma fenetre de menu, je veux creer dynamiquement mes fenetres pour des raisons assez compliques (devellopement avec intraweb pour une appli intranet avec un systeme de retour au menu par un bouton "sommaire" mais egalement une naviguation en cascade par un bouton "precedent" bref...) et donc j applique ce code :
 

Code :
  1. with TwBaseWindowClass(GetClass('TwSaisieCellule')).Create(WebApplication) do begin
  2.   ModeSaisie:=AJOUT;
  3.   Show;
  4. end;


 
Et voila donc ou se pose mon pb, c que la valeur ModeSaisie que j initialise est en faite initialiser dans mon menu et non dans la fenetre creee.
Pourtant si on faisait :
 

Code :
  1. with TwSaisieCellule.Create(WebApplication) do begin
  2.   ModeSaisie:=AJOUT;
  3.   Show;
  4. end;


 
ca fonctionnerait parfaitement....:/
 
Qqun a t il une idee sur ce qui cloche ? (en esperant que mon explication est suffisament claire :p)
 
Merci

Reply

Marsh Posté le 29-12-2004 à 11:10:47   

Reply

Marsh Posté le 29-12-2004 à 11:50:24    

Je ne dois qd meme pas faire un truc du style :
 

Code :
  1. TwBaseWindowClass(GetClass('TwSaisieCellule')).Create(WebApplication)
  2. TwBaseWindowClass(GetClass('TwSaisieCellule')).ModeSaisie:=AJOUT;
  3. TwBaseWindowClass(GetClass('TwSaisieCellule')).Show;


 
 
????
 
[edit] bah de toute facon c pas possible de coder ca :(


Message édité par mkracing66 le 29-12-2004 à 11:53:22
Reply

Marsh Posté le 29-12-2004 à 20:25:28    

with TwSaisieCellule(TwBaseWindowClass(GetClass('TwSaisieCellule')).Create(WebApplication)) do
begin
  ModeSaisie:=AJOUT;
  Show;
end;


 
Dans ton cas il prenait ModeSaisie de Self plutôt que du TwSaisieCellule créé, vu que dans le with tu avais un TwBaseWindowClass au lieu d'un TwSaisieCellule ;)
 
Une variable intermédiaire serait peut-être plus simple qu'un "with" dans ce cas, non ?


Message édité par antp le 29-12-2004 à 20:27:01

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-12-2004 à 10:31:52    

antp a écrit :

with TwSaisieCellule(TwBaseWindowClass(GetClass('TwSaisieCellule')).Create(WebApplication)) do
begin
  ModeSaisie:=AJOUT;
  Show;
end;


 
Dans ton cas il prenait ModeSaisie de Self plutôt que du TwSaisieCellule créé, vu que dans le with tu avais un TwBaseWindowClass au lieu d'un TwSaisieCellule ;)
 
Une variable intermédiaire serait peut-être plus simple qu'un "with" dans ce cas, non ?


 
Merci, mais j avais compris les symptomes, en fait je ne pige pas pk c si bloquant et comment contourner ce pb.
 
c quoi pour toi une variable intermediaire dans ce cas precis ou g une creation dynamique de chez dynamique et que je dois absolument y passer un param ?
 
Ce que je ne pige pas c que le show il me le fait bien, il m affiche bien la fenetre wSaisieCellule, donc pk on n arrive pas a y passer un param  :heink:  

Reply

Marsh Posté le 30-12-2004 à 14:05:07    

Parce que Show existe dans TwBaseWindowClass alors que ModeSaisie n'existe pas je suppose.
La variable intermédiaire c'était pour éviter les erreurs du with : quand un truc n'existe pas dans l'objet passé à with il prend le truc de Self, sans qu'on ne s'en rende compte. Donc quand on teste il est parfois plus prudent de faire une variable intermédiaire et de ne pas utiliser le with ; quitte à mettre le with une fois que tout marche bien.


Message édité par antp le 30-12-2004 à 14:05:43

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-12-2004 à 14:36:14    

Je ne vois tjs pas comment tu veux faire pour cette variable intermediaire.
 
Juste pour rappel : toutes mes fenetres dont TwSaisieCellule derivent de TwBaseFenetre, et dans cette classe g ModeSaisie en variable publique.
 
Pour revenir sur les erreurs du with , si c etait reellement le cas, il ferait Self.ModeSaisie et Self.Show (etant donne que c deja le cas) et donc ne m afficherait pas ma nouvelle fenetre, non ?
Ma foi , ca me semble super obscure....
 
Merci pour ton aide, si tu pouvais me mettre un petit exemple de ta variable intermediaire histoire de voir si je peux vraiment appliquer ca, ca serait sympa
 
Merci

Reply

Marsh Posté le 30-12-2004 à 14:47:42    

Je ne savais pas que ModeSaisie existait dans l'ancêtre ;)
Alors je ne sais pas pourquoi ça foirait...  
 
pour l'histoire de la variable, je parlais bêtement de faire :
NewWin := TwSaisieCellule(TwBaseWindowClass(GetClass('TwSaisieCellule')).Create(WebApplication));
NewWin.ModeSaisie:=AJOUT;
NewWin.Show;


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-12-2004 à 14:49:24    

ca fonctionne pas de faire ce petit bout de code.
La encore mystere, mais ca foire a la compil
 
Il n apprecie guere TwBaseWindowClass(GetClass('TwSaisieCellule')


Message édité par mkracing66 le 30-12-2004 à 14:50:39
Reply

Marsh Posté le 30-12-2004 à 15:10:08    

"Il n apprecie guere"
il dit quoi ?  

Citation :

[Error] at line 541: je n'aprécie guère ce code


?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 30-12-2004 à 15:21:56    

g teste ce que j avais mis dans mon 2eme post, et je ne me rappelle plus l erreur.
Par contre, je ne peux pas appliquer ton bout de code tel quel  car sinon je perd tout l interet de la construction dynamique par un string si je cast directement dans la fenetre que j obtiens :p

Reply

Marsh Posté le 30-12-2004 à 15:21:56   

Reply

Marsh Posté le 30-12-2004 à 15:27:48    

oui, je m'en doute, c'est pour ça que je parlais de faire ça pour tester et d'ensuite remplacer le "NewWin :=" par un "with" (parce que répéter le code du with pour chaque ligne comme tu voulais le faire, c'est totalement impossible vu que soit tu recrées l'objet à chaque ligne, soit tu appliques ton code à la classe au lieu de l'objet)


Message édité par antp le 30-12-2004 à 15:28:36

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2005 à 12:33:38    

antp a écrit :

Je ne savais pas que ModeSaisie existait dans l'ancêtre ;)
Alors je ne sais pas pourquoi ça foirait...  
 
pour l'histoire de la variable, je parlais bêtement de faire :
NewWin := TwSaisieCellule(TwBaseWindowClass(GetClass('TwSaisieCellule')).Create(WebApplication));
NewWin.ModeSaisie:=AJOUT;
NewWin.Show;


 
Bon g eu en fait des soucies avec delphi qui m a fait des trucs etranges O_o style en compilation il ne voyait plus mes points d arrets ou ce genre de connerie...
 
bon g reteste ton code, ca ne fct tjs pas, mon pb s etend un petit peu je pense :
 
'ModeSaisie' etait declaree en variable publique sur ma class TwBaseWindow, mais la g une variable publique 'N_Poste' definie dans TwSaisieCellule, qd je compile ton bout de code avec variable intermediaire g variable non declare pour N_Poste :s
 
Commence a me gaver ce pb, et plus j etudie la question moins je pense qu il existe une reelle solution au pb mais plus j en ai besoin de ce truc...Ouuinn :'(
 
Merci a toute ame genereuse qui pourra m eclairer un peu
 

Reply

Marsh Posté le 03-01-2005 à 13:17:36    

bah il doit y avoir un problème dans ta déclaration si il dit qu'elle n'est pas déclarée... faut voir le code


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2005 à 13:43:44    

c simple , si je remplace :
 
test := TwSaisiePoste(TwBaseWindowClass(GetClass('TwSaisiePoste')).Create(WebApplication));
 
par :
 
test := TwSaisiePoste.Create(WebApplication);
 
ca fontionne....

Reply

Marsh Posté le 03-01-2005 à 14:37:51    

Elles dérivent de TForm tes classes ? Si oui, pourquoi ne pas utiliser WebApplication.CreateForm plutôt ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 03-01-2005 à 15:04:06    

elles derivent de TIWAppForm (intraweb)


Message édité par mkracing66 le 03-01-2005 à 15:04:25
Reply

Marsh Posté le 03-01-2005 à 16:33:30    

Je parlais pas au premier niveau, mais dans l'arbre des classes.  
TIWAppForm a-t-il TForm dans ses parents ?
 
Sinon tu peux aussi tenter de faire  
NewForm := GetClass('TwSaisieCellule').NewInstance;
où NewFom est de type TwBaseWindowClass
mais je ne suis pas sûr du résultat :D C'est ce que Delphi fait quand il créé des composants lus dans les .dfm lors de la création d'une Form, mais dans la doc ils disent de ne pas l'appeler directement.


Message édité par antp le 03-01-2005 à 16:37:23

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed