,---------------------------------------------------------------------------------, | [011] | | VB tome 2 | : so called : ; y'en reste 4 autre : , . . ______________ _____ __ _____ | | \ \ | / / |__ __|__ __ __ _____ \ \ | / /__ | | | \ / | | ___ \ \ |/ / | | | . | \/ | --| __| _| \ \/ / . | | | | | --| | .| _| \ / | |________|_____|__|\/|__|_____| |__|_| \________/______| [Tome of VB part #2 of 6: The most-complete one [comprehensible] Hiho, im back from back? Okay. Voici la suite de mon premier tutorial, contrairement a se quon croyait (jai lhabitude de pas finir mes suites) voici le 2-eme et comme promis je vais vous parler des boucles IF , des fonctions et procedures, des types public et prives, et des sockets. Donc commencons ou nous en etions rendu: LES FAMEUX IF: -------------- le IF = "Si" en francais amene a creer des programmes qui s'interroge savoir "si une chose est via un facteur de comparaison a un autre possible :)". Par exemple, savoir si 5 est egale a 2 ou plus grand? le IF est la pour ca. Si on prend par exemple le cas suivant: Je veux faire bouger une form de gauche a droite dans l'ecran de facon a se quelle rebondisse quand elle touche les bords. Donc vous commencez par definir la form1. Donnez lui une grandeur custom, on sen fout, le programme va tout gerer ca pour nous :) -----------------------------------------------------------lecode.vb--- Dim direction As Integer Private Sub Form_Load() direction = 0 Form1.Show Do DoEvents If direction = 0 Then Form1.Left = Form1.Left - 10 If Form1.Left <= 0 Then direction = 1 Else Form1.Left = Form1.Left + 10 If (Form1.Left + Form1.Width) >= Screen.Width Then direction = 0 End If Loop Until 5 = 3 End Sub -----------------------------------------------------------lecode.vb--- Bon maintenant expliquons le code :). Sous VB on a des constantes systemes que j'apellerais, comme screen.width par exemple qui definis tjours une valeur numerique qui est egale au nombre de TWIPS dun ecran, vous devez savoir quen VB l'unité de calcul cest des TWIPS, pas des PIXELS, pour pouvoir faire le calcul des PIXEL a partir des TWIPS un autre constante existe pour chaque axe (X/Y) cest a dire screen.twipsperpixelX et twipsperpixelY Vous pouvez voir la variable "direction" de valeur numerique dans la declaration publique. On va affecter une logique a cette valeur, si elle contient 0 cest que la direction est GAUCHE et si cest 1 cest DROITE. Vous avez pus remarquer le DO/LOOP placer dans le code, qui defini un peu la routine de base du programme. vous remarquer la fin: LOOP UNTIL 5=3. cest a dire, "On sort de la boucle si 5 est egale a 3, sinon on recommence". Donc il est facile de comprendre que se programme n'aura pas de fin. la boite de texte bougera sans arret. Mais cest une bonne exemple d'utilisation IF / ELSE. le ELSE est tres utile. il est utiliser dans le format: (IF X = 1 then {cmd1} else {cmd2} end if) SI X est egale a 1 fait ca ,sinon ca. Donc la, je vous demandes un minimum dintelligence. Vous devriez avoir compris le code moindrement? Passons au prochain... N.B: La commande DOEVENTS permet de dire a windows de pas prendre tout le process time dans le loop et de checker si Windows aurait besoin de jus pour runner autre chose (un autre application par exemple). Ca permet de faire des loop rapides sans geler la machine. Fonctions et Procedures: ------------------------ Et oui, les fonctions et procedures sont une partie interessante de la programmation. Ca permet d'optimiser son code et empecher la repetition useless. Parlons des procedures pour commencez. Si par exemple on a un petit packet de ligne qui prend une form, qui resize la grosseur dune form (X/W) : form1.width = 1000 form1.height = 1200 on pourrait bien faire ca: Sub resize_form1() form1.width = 1000 form1.height = 1200 end sub on peut tout placer dans des SUB (procedures) et les appeler de l'exterieur GENRE: Sub Form_load() resize_form1 end Sub --- Chose interessante, on peut passer des informations directement dans une procedure :) : Sub resize_Form1(x,y as integer) form1.width = x form1.height = y end sub . Et oui on peut passer directement des variables de cette facon, prochaine conception? les fonctions.Identique a un SUB (procedure) mais ca retourne une fonction: function non_dla_function(x,y as integer) as boolean ceci est un exemple simple :} Voici un exemple de code qui utilise les fonctions et les Subs: (C'est le meme programme que plus haut) ------------------------------------------------------------------code.vb- Dim direction As Integer Private sub scroll_left(x as integer) Form1.Left = Form1.Left - x If Form1.Left <= 0 Then direction = 1 end sub Private sub scroll_right(x as integer) Form1.Left = Form1.Left + x If size_from_Right >= Screen.Width Then direction = 0 end sub Private function size_from_right as integer size_from_Right = form1.left + form1.width end function Private Sub Form_Load() direction = 0 Form1.Show Do DoEvents If direction = 0 Then scroll_left(10) Else scroll_Right(10) End If Loop Until 5 = 3 End Sub ------------------------------------------------------------------code.vb- TYPE Publique et privé: ----------------------- il y a 2 types de variables sous VB, les PUBLIC et les PRIVATE. Leurs usages est identique, la seule difference cest que la variable privé se declare qua l'interieur dune procedure, tandis que l'autre se declare de nimporte ou :) Vous comprenez qu'il est tjours pratique de pouvoir caller une fonction ou une fonction unique pour tout un programme au lieu de la cloner pour chaque module. Par exemple, la variable DIRECTION si-haut est PUBLIC, on peut s'en servir nimporte ou, dans le code on l'apelle dans les 3 procedures: FORM_LOAD SCROLL_LEFT SCROLL_RIGHT Si elle n'aurais pas une nature publique on devrait la definir dans chacune de ses procedures/fonctions et elle ne garderait pas le contenu quon pourrait passer a un autre fonction. J'espere que vous commencez a saisir parce que cest une notion de base a comprendre a tout prix :) Il faut specifier que tout est definissable, pas seulement les variables. les procedures et fonctions, les constantes aussi. Pour l'instant on ne code que des programmes qui ne contiennent qu'une fenetre alors on n'aura pas a en parler tout de suite, mais dans les prochains articles sur le sujet on va de plus en plus utiliser les formes publiques de fonctions/procedures. SOCKETS( WINSOCK ) ----------------------- Bon maintenant on va parler des sockets, se qui est vraiment ma force a moi :) Un socket c'est une facon "SOFTWARE" de pouvoir gerer le TCPIP sous WINDOWS. J'espere que ce qui va suivre ne vous donnera pas l'idee de coder un programme de nuke, ca cest trop bidon :} Mais plutot un client-server. Pour cette fois-ci nous n'allons parler que de l'aspect CLIENT, c'est a dire "un programme qui se connecte a un serveur". Prochainement on parlera de l'aspect SERVEUR qui est de beaucoup plus compliquer. Bon, premierement il faut que vous ajoutiez un SOCKET a votre FORM , clicker a l'aide du bouton droite de votre sourie sur le panneau des controles (vous savez , a gauche ou il y a des iconnes) et prenez l'option "Ajout composant". Dans la liste vous verrez a un endroit Microsoft Winsock Control, prenez-le. Vous devriez voir un nouvelle iconne dans votre panneau, draggez en un sur votre form. L'objet par defaut s'appellera WINSOCK1. Maintenant voici quelque notions de TCP en Vb a comprendre. IP: Un IP est un nombre qui identifie votre machine quand vous etes sur un reseau TCP/IP. Il s'agit d'une valeur 32 bits separer par des points : IE: 1.2.3.4, chaque chiffre a une valeur minimale de 0 et une max de 255 Quand vous allez par exemple sur www.yahoo.com, votre machine resoue le NOM en IP et vous recevez le IP ou vous devez vous connectez, biensur tout ca cest transparent :} Port: Quand vous vous connectez vous devez vous branchez sur un PORT precis, un Port est en quelque sorte une porte avec un numero qui l'identifie. A la base c'est une valeur 16 bits de 0 a 65535. Remote IP: Le IP de la machine a rejoindre Remote Port: Le Port de la machine a rejoindre Connection TCP: Une connection TCP est se quon apelle une connection duplexe complete. Vous pouvez envoyez et recevoir en meme temps. Lors d'une connection les 2 machines font du "handshaking" pour pouvoir verifier si tout est parfait et si la connection peut avoir lieu, si le cas echeant un probleme survient la connection n'aura pas lieu. Une fois connecter vous pouvez transferer et recevoir de l'information de toute nature. Envoie/reception: Comme je vous l'ai dit on peut recevoir et envoyez en meme temps (duplex) et tout se qui passe est en format 8bits donc aucune transformation specifique n'est requise, vous envoyez "SALUT" et a l'autre bout il recevra "SALUT" :) Aucun troncage 7bits a faire comme dans le cas du SMTP. Maintenant voici un exemple typique de code de connection: ---------------------------------------------------------------------------------socket.code------ Private sub form_load() Winsock1.remotehost = "www.yahoo.com" Winsock1.remoteport = 80 Winsock1.connect end Sub ---------------------------------------------------------------------------------socket.code------ Si aucun probleme se produit, vous serez connecter, a noter que pour les utilisateurs de modemcables bizarres comme en europe, vous allez peut-etre devoir ajouter un code pour passer par le proxy specifique requis. Mais bon si on en revient a notre code, cest pas tres bon parce quon peut pas controler les erreurs de connection, alors voici comment moi je ferais ca. ---------------------------------------------------------------------------------socket.code------ Private Sub calc_one() dim time2 as string time2 = time do doevents loop until time <> time2 end sub Private sub form_load() dim timeout as integer Winsock1.remotehost = "www.yahoo.com" Winsock1.remoteport = 80 Winsock1.connect do doevents calc_one if timeout = 10 then msgbox "Incapable d'etablir une connection" exit sub end if timeout = timeout + 1 loop until winsock1.state = sckconnected end Sub ---------------------------------------------------------------------------------socket.code------ Bon ca l'air un peu melangant comme ca, mais j'utilise un proceder de verification de "timeout" dans le sens que si apres 10 secondes il n'y a pas de connection je creer un message d'erreur et je sort de la procedure. Ma procedure CALC_ONE est en fait un delaie de 1 seconde ou presque. quand je l'apelle , le programme attend 1 seconde ;) Le Winsock1.state est une methode pour connaitre l'etat courant de la connection, 2 states sont utiliser: sckconnected et scknotconnected Il y en a d'autre mais cest les plus utiles a mon avis :} Maintenant voyons une methode pour envoyez de l'information et en recevoir, le meilleur truc pour faire ca cest de coder un genre de petit terminal non-vt (pas encore) qui nous permet de voir se quon nous dit et se quon envoie. Donc creez-vous une FORM/feuille. Dedans ajouter une boite de texte , appelez-la DUMP et mettez les attributs: multiline, scrollbars = vertical. Faites vous une boite en dessous et appeler la KEYB et ne modifiez pas ses attributs. Bon c'est simple, la boite DUMP va etre l'endroit ou se retrouve l'information entrante et la BOITE KEYB sera l'endroit ou vous tapez le texte a expedier. Organisez-vous pour mettre votre boite DUMP d'une assez bonne grosseur, en gros ca donne ca: ________________________________________ |_Form1______________________________-ox_| | ____________________________________ | | | : | | | | BOITE DUMP : | | | | :.| | | | :o| | | | :`| | | | : | | | | : | | | |__________________________________:_| | | ____________________________________ | | |_BOITE KEYB_________________________| | |________________________________________| Maintenant creez-vous un SUB(procedure) qui va s'appeler WROTE (contenu as string) exemple: --------------------------------------------------------------------------------------code.vb- Private Sub WROTE(contenu as string) if len(dump.text) > 10000 then dump.text = mid(dump.text,5000,len(Dump.text)-5000) dump.selstart = len(dump.text) dump.sellength = 0 dump.seltext = contenu end Sub --------------------------------------------------------------------------------------code.vb- Cette fonction va permettre d'ecrire dans la boite DUMP avec le plus de securité et de simplicité possible. le programme va tout d'abord s'auto-connecter des son demarrage et si un probleme se produit il se fermera (je parle des problemes relier a la connection initiales) donc placer ceci dans le code (noubliez pas de charger votre composant Winsock1). ---------------------------------------------------------------------------------socket.code------ Private Sub calc_one() dim time2 as string time2 = time do doevents loop until time <> time2 end sub Private sub form_load() dim timeout as integer wrote "Tentative de connection a linuxqc.com ..." Winsock1.remotehost = "linuxqc.com" Winsock1.remoteport = 23 Winsock1.connect do doevents calc_one if timeout = 10 then msgbox "Incapable d'etablir une connection" end end if timeout = timeout + 1 loop until winsock1.state = sckconnected wrote "CONNECTER!"+Vbcrlf end Sub ---------------------------------------------------------------------------------socket.code------ Bon vous pouvez voir qu'ici j'utilise la constante VBCRLF qui est en fait VISUAL BASIC CARRIAGE- RETURN & LINEFEED. en gros cest un ENTER :) Cest pour changer de ligne. Si connection il y a , il faudrait maintenant etre capable de prendre l'information qu'on recoit et l'afficher, donc allez dans vos METHODS du controle WINSOCK1. Vous devriez appercevoir la methode DATAARRIVAL? Dans cette boite la, mettez ceci: dim buffer as string winsock1.getdata buffer wrote buffer - C'est tout :) la fonction GETDATA permet de lire tout informations que vous recevez et de les placers dans une valeur string, que par le suite nous affichons. Maintenant il nous reste plus qu'a pouvoir envoyez a notre tour de l'information. Allez dans la methode: KEYPRESS de l'objet boite de texte KEYB et ajoutez ceci: if keyascii = 13 then if winsock1.state = sckconnected then winsock1.senddata keyb.text +vbcrlf keyb.text = "" keyascii = 0 end if - Et voila, vous avez un programme qui lit et envoie, la fonction senddata permet denvoyer de l'information au socket. Notez que je verifie si il y a une connection d'etablie avant d'envoyez sinon cela produirais un erreur. Dans ce petit chapitre dedier au SOCKET vous avez appris les fonctions suivantes: senddata getdata connect remoteport remotehost Maintenant essayer par vous meme d'utiliser la fonction CLOSE (qui ferme une connection) Bon voila deja la fin de se tutorial, le mois prochain on continue ou nous avons laissez cela :} . : ; : ' ; __2.ouf : | : |_________________________________________________________________________________|