Comme quoi, de petites causes peuvent avoir de grandes conséquences ! J'avais oublié d'initaliser une variable à 0. Sous W10, ça passait... W7 est visiblement plus "chatouilleux". Une ligne de code supplémentaire pour mettre un zéro dans une vairable integer - c'est tout. Ca m'apprendra...
lepetitmarocain
Nombre de messages : 341 Age : 82 Localisation : Région Parisienne (à mon grand désespoir) Date d'inscription : 04/07/2018
Ceci dit, je me permets tout de même une petite remarque concernnt ces anciennes versions de Windows. Dans le cas présent, le problème venait d'une légerté de progammation de ma part. Dotn actte. Mais, comme je l'ai signalé plus haut, W7 n'est plus maintenu par MicroSoft. Donc, tout ou tard, les utilisateurs de W7 rencontreront des problèmes qui ne seront plus solubles. J'en sais quelque chose: j'étais un fan de Windows XP et je leai maintenu en vie longtemps, mais jai dû me résoudre à passer à des versions plus récentes suite à des impasses techniques. W7 est déjà ancien. Il y a eu, brièvement, W8.0, puis W8.1 et enfin W10. J'ai suivi toutes ces migrations. Certes, il y a des grains de sable dans la mécanique de migration d'un système vers un autre. Mais globalement, ça se passe bien et il y a des forums très compétents et très motivés qui assistent en cas de problème. J'en ai fait l'expéreince.
Donc, sauf impértif absolu dont je ne pourrais pas préjuger, je conseille à tous de migrer vers W10. PAr contre, on peut parfaitement installer une virtualisation avec un W7 virtualisé si l'on doit faire toutner un logiciel qui ne tournerait pas sous W10. MicroSoft a on produit de virtualsation dont le "plauer" est gratuit, mais il y a plusieurs freeware parfaitement opérationnels.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Nouveautés: - PrinterManager: nouveau code fonction: 12 = choisir le mode millimètres / pixels - PrinterFunction, PrinterPrintText, PrinterDrawArc: toutes les mesures en pixels ou millimètres
Modules modifiés: KGF.dll KGF.chm
La doc est à jour.
A partir de maintenant, toutes les coordonnées et mesures pour l'impression peuvent être données en pixels (défaut) ou en millimètres. Ceci est choisi par le code fonction 12 de PrinterManager. Ce code est utilisable n'importe quand, à partir du moment où une impression est ouverte (on a au moins utilisée PrinterManager avec le code 1 (Start doc). On peut changer le type de mesure autant que nécessaire, si l'on veut combiner des opérations en pixels avec d'autres en millimètres.
Yannick aime ce message
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Jeu 3 Juin 2021 - 11:27
KGF.dll V9.50 du 03/06/2021
Nouveautés: - PrinterPrintText: correction d'un bug introduit en V9.49
Modules modifiés: KGF.dll
La doc est inchangée. Une erreur dans la doc de PrinterPrintText sera prochainement corrigée.
Yannick aime ce message
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
Sujet: re Ven 4 Juin 2021 - 0:26
Chess_48.ilb est toujours en liberté.
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Sujet: Re: KGF_dll - nouvelles versions Ven 4 Juin 2021 - 1:15
Oui... j'ai corrigé en urgence le bug sur PrinterPrintText. Le fichier ilb que tu rencontres, est généré dans le code d'initialisation de KGF.dll qui est plus chatouilleux à toucher. Mais ça viendra - patience !
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
Nouveautés: - objet ChessBoard: le fichier des icônes des pièces n'est plus extrait systématiquement lors de DLL_ON, mais seulement en cas de besoin lors de la création de l'objet ChessBoard. - nouveaux objets WebServer et WebClient
Modules modifiés: KGF.dll KGF.chm
La doc est à jour.
La nouveauté majeure est la création des deux nouveaux objets WebServer et WebClient !
Ces objets permettent maintenant de créer de véritables applications client/serveur, et ce dans les cas de ficure suvants: - serveur et clients résidants sur la même machine (localhost) - serveur sur une machine et clients répartis sur les machines d'un réseau local via iintranet - serveur sur une machine et clients répartis sur les machines d'un réseau distant via internet On peut même réaliser une application de messagerie instantanée (chat) à travers internet sur un réseau distant.
Le principe est le suivant:
Le serveur est lancé sur une machine, et connecté à un port (>=1024). Il écoutera ce port de façon permanente. Tout évènement se produisant sur ce port sera remonté au programme Panoramic du serveur via le mécanisme des USER_EVENT.
Le ou les clients sont lancés sur la même machine ou sur des machines différentes dispersées sur le réseau. Le client doit spécifier l'hôte du serveur (host) ainsi que le même numéto de port. Il se connectera alors sur le serveur qui en prend note et le signale. Le client signale également au programme Panoramic tout évènement sur le port via le mécanisme des USER_EVENT.
Le client peut alors envoyer une commande au serveur qui répondra en fonction de la commande. Une commande a la syntaxe suivante: keyword,parameter
Pour le moment, le seul mot-clé opérationnel est Panoramic, le paramètre étant une chaîne de caractères quelconques. Le serveur reconnaîtra qu'il s'agit d'une commande pour Panoramic et le signale au programme du serveur via un USER_EVENT spécifique, tout en transmettant la chaîne de caractères du paramètre. Le programme Panoramic devra alors traiter cette chaîne de caractères et envoyer la réponse au client sous forme d'une autre chaîne de caractères.
Voici une démo du Serveur et du Client que vous pourrez lancer sur la même machine, pour simplifier. Il est nécessaire pour cela de générer les EXE à partir des deux sources et de lancer ces EXE. Le port par défaut est 2000. Si les deux sont sur la même machine, le client doit spécifier localhost comme nom d'hôte.
Après le lancement du serveur, il suffit de cliquer sur le bouton "Connecter" et il sera en ligne. Après le lancement du client, il faut taper localhost dans la zone du nom de l'hôte, puis cliquer sur le bouton Connecter.
Ensuite, un peut saisir une commande pour Panoramic dans le champ de saisie en bas de l'écran, puis cliquer sur le bouton Envoyer. Rentrez n'importe quoi et cliquez sur envoyer, et le serveur répondra qu'il ne comprend pas la commande. Mais il vous dira également ce qu'il faut faire pour connaître les commandes implémentées. Amusez-vous...
Le serveur:
Code:
' test_WinServer.bas
label creer, user_event
dim SRV%, res%, event_code%, s$, socket%, commande$, port%
width 0,700 caption 0,"WebServer" button 1 : top 1,10 : left 1,200 : caption 1,"Créer serveur" : on_click 1,creer alpha 10 : top 10,40 : left 10,10 : caption 10,"Log des évènements:" memo 11 : top 11,60 : left 11,10 : width 11,300 : height 11,300 : bar_both 11 alpha 12 : top 12,40 : left 12,320 : caption 12,"Info associée:" edit 13 : top 13,60 : left 13,320 : width 13,300 alpha 14 : top 14,10 : left 14,10 : caption 14,"Port:" spin 15: top 15,10 : left 15,60 : width 15,100 : min 15,1024 : max 15,9000 : text 15,2000
user_event: if bin_and(user_event_WParam,hex("FF000000"))=hex("14000000") event_code% = bin_and(user_event_WParam,hex("00FF0000"))/65536 select event_code% case 1 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Connexion client acceptée" case 2 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Nouveau client connecté" case 3 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client déconnecté" case 4 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Demande à Panoramic" socket% = user_event_lparam commande$ = text$(13) s$ = "Désolé, je ne comprends pas..."+chr$(13)+chr$(10)+"Tapez Panoramic,?" ' *** traitement spécifique des commandes if commande$="Quel est ton nom ?" s$ = "Je m'appelle WinServer" end_if if commande$="Quel est ta date de naissance ?" s$ = "Je suis né le 29 Juillet 2021" end_if if commande$="Quel est ton créateur ?" s$ = "J'ai été créé par Klaus" end_if if commande$="?" s$ = "Je comprends les commandes suivantes:"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton nom ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ta date de naissance ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton créateur ?"+chr$(13)+chr$(10) end_if ' *** fin du traitement spécifique des commandes res% = dll_call3("WebServerReplyToClient",SRV%,socket%,adr(s$)) case 5 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Serveur à l'écoute" case 6 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client demande n fichier" case 7 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Erreur dans connexion client" end_select end_if return
width 0,700 caption 0,"WinClient" alpha 1 : top 1,10 : left 1,10 : caption 1,"Host:" edit 2 : top 2,10 : left 2,50 : width 2,160 alpha 3 : top 3,10 : left 3,240 : caption 3,"Port:" spin 4 : top 4,10 : left 4,280 : width 4,100 : min 4,1024 : max 4,9000 : text 4,2000 button 5 : top 5,10 : left 5,390 : caption 5,"Créer client" : on_click 5,creer button 6 : top 6,10 : left 6,500 : caption 6,"Connecter" : on_click 6,connecter button 7 : top 7,10 : left 7,590 : caption 7,"Déconnecter" : on_click 7,deconnecter
alpha 10 : top 10,40 : left 10,10 : caption 10,"Log des évènements:" memo 11 : top 11,60 : left 11,10 : width 11,300 : height 11,300 : bar_both 11 alpha 20 : top 20,40 : left 20,320 : caption 20,"Texte reçu:" memo 21 : top 21,60 : left 21,320 : width 21,300 : height 21,300 : bar_both 21
alpha 30 : top 30,380 : left 30,10 : caption 30,"Type de commande:" combo 31 : top 31,380 : left 31,120 : width 31,200 item_add 31,"Commande PANORAMIC" ' d'autres types de commande seront ajoutés prochainement item_select 31,1 alpha 32 : top 32,405 : left 32,10 : caption 32,"Commande:" edit 33 : top 33,405 : left 33,120 : width 33,300 button 34 : top 34,400 : left 34,425 : caption 34,"Envoyer" : on_click 34,envoyer
dll_on "KGF.dll" on_user_event user_event
end
creer: host$ = text$(2) if host$="" message "Le host n'est pas indiqué" return end_if port% = val(text$(4)) CLI% = dll_call3("CreateWebClient",adr(host$),port%,handle(21)) if CLI%<>0 then item_add 11,"Le client est créé" return
envoyer: select item_index(31) case 1: ' commande PANORAMIC s$ = "Panoramic,"+text$(33) res% = dll_call2("SendWebClientCommand",CLI%,adr(s$)) case 2: ' commande à venir end_select return
user_event: if bin_and(user_event_WParam,hex("FF000000"))=hex("15000000") event_code% = bin_and(user_event_WParam,hex("00FF0000"))/65536 select event_code% case 1 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client en cours de connexion" case 2 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client connecté" case 3 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client déconnecté" case 4 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Message envoyé au serveur" case 6 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Message reçu du serveur" case 7 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Erreur dans connexion client" if user_event_lparam=10061 then item_add 11," Serveur non trouvé" end_select end_if return
Yannick aime ce message
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Nouveautés: - objet WebServer: nouvelle fonction WebServerGetClients
Modules modifiés: KGF.dll KGF.chm
Cette nouvelle fonction permet au serveur de connaître la iste des clients connectés. Ci-dessous le prgramme de démo du serveur pour mettre cete nouvelle fonction en lumière. Le client est inchangé.
Pour tester: - créer les EXE à partir du serveur (ci-après) egt du client (ci-dessus) - lancer le serveur et cliquer sur le bouton "Créer" - lancer 2 ou 3 fois le client - déplacer les fenêtres des clients lancés de sorte que tous les programmes soient visibles - dans chaque client, saisir localhost dans le champ du hôte (en haut à gauche) - dans chaque client, cliquer sur le bouton "Créer" ==> rien ne se passe visuellement - dans chaque client, cliquer sur le bouton "Connecter" ==> la connexion est indiquée dans la trace, mais le nouveau client est également montré dans le mémo de la liste des clients - dans un client quelconque, cliquer sur le bouton "Déconnecter" ==> le client ciblée disparaît de la liste des clients connectés - puis, lancer et connecter à nouveau un ou plusieurs clients selon la procédure ci-dessus, en arrêter d'autres et observer la liste des clients connectés - à tout moment, à partir de n'importe quel client, on peut envoyer une commande au serveur par le champ de saisie en bas et le bouton envoyer
Ceci permet à l'administrateur d'un réseau de voir à tout moment qui est connecté.
Voici le serveur:
Code:
' test_WinServer.bas
label creer, user_event
dim SRV%, res%, event_code%, s$, socket%, commande$, port%
width 0,700 caption 0,"WebServer" button 1 : top 1,10 : left 1,200 : caption 1,"Créer serveur" : on_click 1,creer alpha 10 : top 10,40 : left 10,10 : caption 10,"Log des évènements:" memo 11 : top 11,60 : left 11,10 : width 11,300 : height 11,300 : bar_both 11 alpha 12 : top 12,40 : left 12,320 : caption 12,"Info associée:" edit 13 : top 13,60 : left 13,320 : width 13,300 alpha 14 : top 14,10 : left 14,10 : caption 14,"Port:" spin 15: top 15,10 : left 15,40 : width 15,100 : min 15,1024 : max 15,9000 : text 15,2000 alpha 16 : top 16,90 : left 16,320 : caption 16,"Clients connectés:" memo 17 : top 17,110 : left 17,320 : width 17,300 : height 17,250 : bar_both 17
user_event: if bin_and(user_event_WParam,hex("FF000000"))=hex("14000000") event_code% = bin_and(user_event_WParam,hex("00FF0000"))/65536 select event_code% case 1 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Connexion client acceptée" case 2 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Nouveau client connecté" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 3 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client déconnecté" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 4 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Demande à Panoramic" socket% = user_event_lparam commande$ = text$(13) s$ = "Désolé, je ne comprends pas..."+chr$(13)+chr$(10)+"Tapez Panoramic,?" ' *** traitement spécifique des commandes if commande$="Quel est ton nom ?" s$ = "Je m'appelle WinServer" end_if if commande$="Quel est ta date de naissance ?" s$ = "Je suis né le 29 Juillet 2021" end_if if commande$="Quel est ton créateur ?" s$ = "J'ai été créé par Klaus" end_if if commande$="?" s$ = "Je comprends les commandes suivantes:"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton nom ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ta date de naissance ?"+chr$(13)+chr$(10) s$ = s$ + "Quel est ton créateur ?"+chr$(13)+chr$(10) end_if ' *** fin du traitement spécifique des commandes res% = dll_call3("WebServerReplyToClient",SRV%,socket%,adr(s$)) case 5 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Serveur à l'écoute" clear 17 res% = dll_call2("WebServerGetClients",SRV%,handle(17)) case 6 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Client demande n fichier" case 7 item_add 11, right$("00000"+hex$(user_event_wparam),8)+" "+right$("00000"+hex$(user_event_lparam),8)+" Erreur dans connexion client" end_select end_if return
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Je viens de déposer une version corrigée de KGF.dll sur mon site (via ma signature). Le fichier Chess_48.ilb n'est plus systématiquement créé, mais uniquement si l'on crée l'objet ChesBoard. Aucun autre changement, et je n'ai pas changé le numéro de version pour si peu...
Yannick aime ce message
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
Nouveautés: - nouvelle fonction FindTreeViewNodeByName
Modules modifiés: KGF.dll KGF.chm
Cette nouvelle fonction, créée à l'initiative deJP06, permet de chercher un noeud d'un objet TreeView en fonction de son nom (le texte affiché). Par défaut, on cherche à partir du début (à partir du premier noeud) de l'objet TreeView. Cependant, on peut envisager des cas où des noeuds de noms identiques se trouvent dans la structure. J'ai donc prévu un paramètre "index de départ" permettant de chercher toutes les occurences successives d'un nom dans la structure.