Yil2201
Messages postés134Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention10 août 2008
-
14 avril 2006 à 14:00
Yil2201
Messages postés134Date d'inscriptionmercredi 1 décembre 2004StatutMembreDernière intervention10 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
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;
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 !!!
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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 }
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 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 !!!