Procédure entre deux forms

[Résolu]
Signaler
Messages postés
134
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 août 2008
-
Messages postés
134
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 août 2008
-
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

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
<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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,
dans Form2 :

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

@+
Cirec
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

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 !!!
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

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}
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

Hey mais pkoi j'ai mis Form2.Envia , c'est Form1.Envia lol okay je sors !!!
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
pfff... même pas vu
je dois être trop vieux déjà

@+
Cirec
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
En fait, les trois solutions fonctionnent..
quelle est la plus perfomante ?

cantador
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
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;
Messages postés
304
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
10 mars 2012

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 !!!
Messages postés
134
Date d'inscription
mercredi 1 décembre 2004
Statut
Membre
Dernière intervention
10 août 2008

Ok, merci beaucoup les gars, j'ai opté pour la première, A+ ;)

[url]www.yiliman2201.be.tf/url
Mon site !