Procédure entre deux forms

Résolu
Yil2201 Messages postés 134 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 10 août 2008 - 14 avril 2006 à 14:00
Yil2201 Messages postés 134 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 10 août 2008 - 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

12 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 avril 2006 à 14:18
<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.
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 avril 2006 à 14:15
Salut,
dans Form2 :

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

@+
Cirec
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
14 avril 2006 à 15:01
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 !!!
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
14 avril 2006 à 15:04
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}
0

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

Posez votre question
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
14 avril 2006 à 15:06
Hey mais pkoi j'ai mis Form2.Envia , c'est Form1.Envia lol okay je sors !!!
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 avril 2006 à 16:04
pfff... même pas vu
je dois être trop vieux déjà

@+
Cirec
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
14 avril 2006 à 20:57
En fait, les trois solutions fonctionnent..
quelle est la plus perfomante ?

cantador
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 avril 2006 à 22:23
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
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
15 avril 2006 à 12:20
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.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
15 avril 2006 à 12:22
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;
0
cs_shining Messages postés 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 mars 2012
15 avril 2006 à 18:05
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 !!!
0
Yil2201 Messages postés 134 Date d'inscription mercredi 1 décembre 2004 Statut Membre Dernière intervention 10 août 2008
16 avril 2006 à 11:47
Ok, merci beaucoup les gars, j'ai opté pour la première, A+ ;)

[url]www.yiliman2201.be.tf/url
Mon site !
0
Rejoignez-nous