Procédure entre deux forms [Résolu]

Yil2201 134 Messages postés mercredi 1 décembre 2004Date d'inscription 10 août 2008 Dernière intervention - 14 avril 2006 à 14:00 - Dernière réponse : Yil2201 134 Messages postés mercredi 1 décembre 2004Date d'inscription 10 août 2008 Dernière intervention
- 16 avril 2006 à 11:47
Salut à tous! VOilà j'ai une procédure nommée Envia ds ma form 1. J'aimerais pouvoir envoyer un message à cette procédure de la form 2 mais lorsque je tape Envia('CHG', 'AWY'); , il me dit que Envia est un identificateur non déclaré. Comment fais-ton pour faire réagir une procédure depuis une autre form ?

+ D'infos :
form 1 ds private :
procedure envia(s1,s2:string;appendcrlf:boolean=true);
la procédure :
procedure TForm1.envia(s1,s2:string;appendcrlf:boolean=true);
var s:string;
begin
s:=s1+' '+inttostr(FTrId);
if s2<>'' then s:=s+' '+s2;
inc(FTrId);
if (appendcrlf) then s:=s+#13#10;
if Fcon1 then form1.clientsocket1.socket.sendtext(s)
else form1.clientsocket2.socket.sendtext(s);
{$IFDEF Debug}log('PixaMSNlog.txt', 'NSS: '+s);{$ENDIF}
end;
Merci, A+, Yil2201
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 14 avril 2006 à 14:18
3
Merci
<hr size="2" width="100%">
unité 1 :

UNIT unit1;

INTERFACE

// on place la declaration de la procedure ici pour la rendre visible
// dans toute les unités qui utiliseront Unit1
procedure Envia([args]);

IMPLEMENTATION

procedure Envia([args]);
begin
... code ...
end;

end.

<hr size="2" width="100%">
unité 2 :

UNIT unit2;



INTERFACE



IMPLEMENTATION


// on declare Unit1 dans la clause Uses de l'implementation et
// non dans la clause uses de l'interface pour eviter un apel cyclique de Unit1
uses Unit1;


procedure Form2.Button2Click(Sender : TObject);

begin
Unit1.Envia(...);

end;



end.

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 74 internautes ce mois-ci

Commenter la réponse de f0xi
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 14 avril 2006 à 14:15
0
Merci
Salut,
dans Form2 :

...
Implementation
Uses Unit1; // Form1
...
Begin
Form1.Envia('CHG', 'AWY');
End;

@+
Cirec
Commenter la réponse de Cirec
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 14 avril 2006 à 15:01
0
Merci
ptdr.... hey vous savez lire ??

+ D'infos :
form 1 ds private : <=== PRIVATE
procedure envia(s1,s2:string;appendcrlf:boolean=true);

mets ta procedure en visibilité "PUBLIC"

public
procedure envia(s1,s2:string;appendcrlf:boolean=true);

maintenant tu peux faire Form2.Envia sans oublié le commentaire de CIREC concenant la déclaration de "unit1" dans la clause uses tout en sachant que unit1 est l'unité de ta Form1 si tu n'a pas changer cette valeur par défaut cette unité s'appel unit1.pas !!!
Commenter la réponse de cs_shining
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 14 avril 2006 à 15:04
0
Merci
autre chose ...

procedure TForm1.envia(s1,s2:string;appendcrlf:boolean=true);
var s:string;
begin
s:=s1+' '+inttostr(FTrId);
if s2<>'' then s:=s+' '+s2;
inc(FTrId);
if (appendcrlf) then s:=s+#13#10;
if Fcon1 then form1.clientsocket1.socket.sendtext(s)
else form1.clientsocket2.socket.sendtext(s); <== étant donné que tu es dans Form1 inutile d'ajouter Form1.clientSocket1.Socket tu peux mettre directement ClientSocket1.Socket et c'est valable pour toutes les variables propre à TForm1
{$IFDEF Debug}log('PixaMSNlog.txt', 'NSS: '+s);{$ENDIF}
Commenter la réponse de cs_shining
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 14 avril 2006 à 15:06
0
Merci
Hey mais pkoi j'ai mis Form2.Envia , c'est Form1.Envia lol okay je sors !!!
Commenter la réponse de cs_shining
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 14 avril 2006 à 16:04
0
Merci
pfff... même pas vu
je dois être trop vieux déjà

@+
Cirec
Commenter la réponse de Cirec
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 14 avril 2006 à 20:57
0
Merci
En fait, les trois solutions fonctionnent..
quelle est la plus perfomante ?

cantador
Commenter la réponse de cs_cantador
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 14 avril 2006 à 22:23
0
Merci
a mon avis il n'y a pas de différences de performances.
Mais la méthode la plus courante est celle posté par f0xi.

Et pour mémoire toutes les fonctions, procédures et variables déclarés dans la section Interface d'une unité sont visibles dans toutes autres unités qui la déclarera dans les Uses

@+
Cirec
Commenter la réponse de Cirec
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 15 avril 2006 à 12:20
0
Merci
oui tout ce qui se trouve dans INTERFACE est visible partout ou l'unité serat declaré dans les USES.

d'ailleur parfois borland s'amuse a appelé la zone PUBLIC des objet l'INTERFACE de l'objet et la zone PRIVATE la zone IMPLEMENTATION de l'objet...

vus que le mode de protection est le meme...

c'est un truc a savoir.

par contre un truc c'est qu'on peu garder une procedure en implementation tout en la laissant disponible dans tout la zone.

exemple :

IMPLEMENTATION

procedure Appel1;
begin
Appel2; { erreur, Appel2 est introuvable }
end;

procedure Appel2;
begin
... instruction ...
end;

end.

dans cet exemple Appel2 n'est pas visible pour Appel1 car Appel2 est declarée plus bas dans l'implementation.

certain declareront donc Appel2 dans l'interface de l'unité pour la rendre visible.
mais, si l'on veut obtenir cela tout en gradant Appel2 protégée des autres unités il faudrat faire :


IMPLEMENTATION


procedure Appel2; FORWARD;


procedure Appel1;

begin

Appel2; { Appel2 est maintenant visible pour Appel1 }

end;



procedure Appel2;

begin

... instruction ...

end;



end.


voila pour le rappel.
Commenter la réponse de f0xi
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 15 avril 2006 à 12:22
0
Merci
rappel egalement :

si la procedure Envia est declarée dans TForm1, il n'est plus utile d'appeler les objet en commeçant par Form1....

procedure TForm1.envia(s1,s2:string;appendcrlf:boolean=true);
var s:string;
begin
s:=s1+' '+inttostr(FTrId);
if s2<>'' then s:=s+' '+s2;
inc(FTrId);
if (appendcrlf) then s:=s+#13#10;
if Fcon1 then form1.clientsocket1.socket.sendtext(s)
else form1.clientsocket2.socket.sendtext(s);
{$IFDEF Debug}log('PixaMSNlog.txt', 'NSS: '+s);{$ENDIF}
end;
Commenter la réponse de f0xi
cs_shining 329 Messages postés lundi 30 décembre 2002Date d'inscription 10 mars 2012 Dernière intervention - 15 avril 2006 à 18:05
0
Merci
pour ma part dès le premier coup d'oeil j'ai opté pour la déclaration en "PUBLIC" à cause d'un point important !!!!


"if Fcon1 then form1.clientsocket1.socket.sendtext(s)" <=== "fcon" semble être une variable propre à TForm1 et sans doute en visilibité privée !!!, avec l'exemple de Foxi on ne pourra donc pas accèder à cette variable si tenté qu'elle soit en visibilité "privée", dans ce cas là il faudrait mettre cette variable en visibilité publique !!!
Commenter la réponse de cs_shining
Yil2201 134 Messages postés mercredi 1 décembre 2004Date d'inscription 10 août 2008 Dernière intervention - 16 avril 2006 à 11:47
0
Merci
Ok, merci beaucoup les gars, j'ai opté pour la première, A+ ;)

[url]www.yiliman2201.be.tf/url
Mon site !
Commenter la réponse de Yil2201

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.