Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Panoramic et QR code | |
| | |
Auteur | Message |
---|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Panoramic et QR code Mar 20 Avr 2021 - 18:10 | |
| Bonjour à tous ! Voilà un moment que je cherche une idée qui soit dans l'air du temps et je crois que j'en ai une mais bon, mes compétences étant limités et n'ayant plus pratiqué depuis un bon moment... Je vais faire un appel au public. Quelqu'un aurait il connaissance d'un plugin en ligne de commande pour créer des QR codes ? | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Panoramic et QR code Mar 20 Avr 2021 - 18:44 | |
| Salut Yannick ! Je n’ai pas ta réponse. J’avais commencé un générateur de QR code en Panoramic. Je ne sais pas si cela peut t’aider, mais je te donne le source inachevé. - Code:
-
' Generateur QR code ' Versions QR code : 1 à 19 (limite à 19 : Les versions peuvent aller jusqu'a 40) ' Encodage : ISO 8859-1 ' Niveaux de correction : L M Q H ' Marc - 27 septembre 2020 DIM nombreDeCaracteres%,correction%,versionQR% DIM tableCapaciteVersion%(4,19) DIM trame$ LABEL dessinerQRCode,nouveauQRCode,redimensionnerFenetre,calculNombreCaracteresRestant LABEL selectionNiveauCorrection chargementTableCapaciteVersion() creerFenetrePrincipale() creerFenetreAffichageQRCode() END
selectionNiveauCorrection: IF LEFT$(LTRIM$(TEXT$(11)),1) = "L" correction% = 1 END_IF
IF LEFT$(LTRIM$(TEXT$(11)),1) = "M" correction% = 2 END_IF
IF LEFT$(LTRIM$(TEXT$(11)),1) = "Q" correction% = 3 END_IF
IF LEFT$(LTRIM$(TEXT$(11)),1) = "H" correction% = 4 END_IF
IF LEN(TEXT$(13)) > tableCapaciteVersion%(correction%,19) TEXT 13, LEFT$(TEXT$(13),tableCapaciteVersion%(correction%,19)) CARET_POSITION 13,LEN(TEXT$(13)) END_IF
caracteresRestant() SET_FOCUS 13
RETURN
SUB creerFenetrePrincipale() WIDTH 0,500 HEIGHT 0,500 LEFT 0,(SCREEN_X-WIDTH(0))/2 TOP 0,(SCREEN_Y-HEIGHT(0))/2 COLOR 0,50,50,80 CAPTION 0,"QR code générateur" ON_RESIZE 0,redimensionnerFenetre
PICTURE 7 WIDTH 7,40 HEIGHT 7,40 LEFT 7,420 TOP 7,20 FILE_LOAD 7,"QRcode.bmp"
PICTURE 8 WIDTH 8,40 HEIGHT 8,40 LEFT 8,20 TOP 8,20 FILE_LOAD 8,"logo.bmp" ALPHA 9 TOP 9,25 LEFT 9,96 FONT_COLOR 9,250,250,250 FONT_SIZE 9,24 CAPTION 9,"QR code générateur"
ALPHA 10 TOP 10,90 LEFT 10,42 FONT_COLOR 10,250,250,250 FONT_SIZE 10,10 CAPTION 10,"Choisissez un niveau de correction d'erreur :" COMBO 11 TOP 11,110 LEFT 11,42 WIDTH 11,260 FONT_SIZE 11,9 ITEM_ADD 11," L : récupère jusqu'à 7% des données" ITEM_ADD 11," M : récupère jusqu'à 15% des données" ITEM_ADD 11," Q : récupère jusqu'à 25% des données" ITEM_ADD 11," H : récupère jusqu'à 30% des données" ITEM_SELECT 11,1 ON_CHANGE 11,selectionNiveauCorrection ALPHA 12 TOP 12,159 LEFT 12,42 FONT_COLOR 12,250,250,250 FONT_SIZE 12,10 CAPTION 12,"Tapez votre texte à encoder :" MEMO 13 WIDTH 13,400 HEIGHT 13,150 LEFT 13,42 TOP 13,180 BAR_VERTICAL 13 FONT_SIZE 13,10 ON_CHANGE 13,calculNombreCaracteresRestant
ALPHA 14 TOP 14,332 LEFT 14,42 FONT_COLOR 14,250,250,250 FONT_SIZE 14,10 BUTTON 15 LEFT 15,42 TOP 15,390 WIDTH 15,150 FONT_SIZE 15,10 CAPTION 15,"&Générer le QR code" ON_CLICK 15,dessinerQRCode BUTTON 16 LEFT 16,20 TOP 16,390 LEFT 16,292 WIDTH 16,150 FONT_SIZE 16,10 CAPTION 16,"&Nouveau" ON_CLICK 16,nouveauQRCode correction% = 1 caracteresRestant() SET_FOCUS 13 END_SUB
calculNombreCaracteresRestant: caracteresRestant() RETURN
SUB caracteresRestant() OFF_CHANGE 13 DIM_LOCAL caracteres% nombreDeCaracteres% = LEN(TEXT$(13)) IF nombreDeCaracteres% > tableCapaciteVersion%(correction%,19) TEXT 13,LEFT$(TEXT$(13),tableCapaciteVersion%(correction%,19)) nombreDeCaracteres% = LEN(TEXT$(13)) END_IF CARET_POSITION 13,LEN(TEXT$(13)) caracteres% = tableCapaciteVersion%(correction%,19) - nombreDeCaracteres% CAPTION 14,"Nombre de caractères restant : " + STR$(caracteres%) ON_CHANGE 13,calculNombreCaracteresRestant END_SUB
SUB creerFenetreAffichageQRCode() CREATE_HIDE FORM 20 BORDER_HIDE 20 COLOR 20,255,255,255 END_SUB
SUB chargementTableCapaciteVersion() DIM_LOCAL i%,j% FOR j% = 1 TO 4 FOR i% = 1 TO 19 READ tableCapaciteVersion%(j%,i%) NEXT i% NEXT j% END_SUB
dessinerQRCode: SHOW 20 trame$ = "0100" :' entete de la trame : indicateur mode 8bits ISO8859-1 determinerVersion() codageNombreCaracteres() conversionTexteEnBinaire() RETURN
' determiner la version de QR code en fonction du nombre de caracteres à encoder SUB determinerVersion() versionQR% = 1
WHILE tableCapaciteVersion%(correction%,versionQR%) < nombreDeCaracteres% versionQR% = versionQR% + 1 END_WHILE
END_SUB
' codage binaire du nombre de caracteres du texte a encoder et ajout a la trame SUB codageNombreCaracteres() DIM_LOCAL res$ IF versionQR% < 10 res$ = conversionDecimalBinaire8bit$(nombreDeCaracteres%) trame$ = trame$ + res$ ELSE res$ = conversionDecimalBinaire16bit$(nombreDeCaracteres%) trame$ = trame$ + res$ END_IF END_SUB
' conversion du texte en binaire et ajout a la trame SUB conversionTexteEnBinaire() DIM_LOCAL i%,texte$,texteBinaire$,caractere$,mot$,valeurAscii%,res$,longueur% texte$ = TEXT$(13) FOR i% = 1 TO LEN(texte$) caractere$ = MID$(texte$,i%,1) valeurAscii% = ASC(caractere$) WHILE valeurAscii% > 0 IF FRAC(valeurAscii% / 2) = 0 mot$ = "0" + mot$ ELSE mot$ = "1" + mot$ END_IF valeurAscii% = INT(valeurAscii% / 2) END_WHILE longueur% = LEN(mot$) IF longueur% < 8 mot$ = STRING$(8-longueur%,"0")+mot$ END_IF texteBinaire$ = texteBinaire$ + mot$ mot$ = "" NEXT i% trame$ = trame$ + textebinaire$ END_SUB
FNC conversionDecimalBinaire8bit$(nombreDecimal%) DIM_LOCAL longueur%,nombreBinaire$ WHILE nombreDecimal% > 0 IF FRAC(nombreDecimal% / 2) = 0 nombreBinaire$ = "0" + nombreBinaire$ ELSE nombreBinaire$ = "1" + nombreBinaire$ END_IF nombreDecimal% = INT(nombreDecimal% / 2) END_WHILE longueur% = LEN(nombreBinaire$) IF longueur% < 8 nombreBinaire$ = STRING$(8-longueur%,"0")+nombreBinaire$ END_IF RESULT nombreBinaire$ END_FNC
FNC conversionDecimalBinaire16bit$(nombreDecimal%) DIM_LOCAL longueur%,nombreBinaire$ WHILE nombreDecimal% > 0 IF FRAC(nombreDecimal% / 2) = 0 nombreBinaire$ = "0" + nombreBinaire$ ELSE nombreBinaire$ = "1" + nombreBinaire$ END_IF nombreDecimal% = INT(nombreDecimal% / 2) END_WHILE longueur% = LEN(nombreBinaire$) IF longueur% < 16 nombreBinaire$ = STRING$(16-longueur%,"0")+nombreBinaire$ END_IF RESULT nombreBinaire$ END_FNC
nouveauQRCode: CLEAR 13 HIDE 20 SET_FOCUS 13 RETURN
redimensionnerFenetre: OFF_RESIZE 0 WIDTH 0,500 HEIGHT 0,500 ON_RESIZE 0,redimensionnerFenetre RETURN
' Capacites de carateres pour la correction d'erreur L DATA 17,32,53,78,106,134,154,192,230,271,321,367,425,458,520,586,644,718,792
' Capacites de carateres pour la correction d'erreur M DATA 14,26,42,62,84,106,122,152,180,213,251,287,331,362,412,450,504,560,624
' Capacites de carateres pour la correction d'erreur Q DATA 11,20,32,46,60,74,86,108,130,151,177,203,241,258,292,322,364,394,442
' Capacites de carateres pour la correction d'erreur H DATA 7,14,24,34,44,58,64,84,98,119,137,155,177,194,220,250,280,310,338 Et une capture d’écran : | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 20 Avr 2021 - 18:52 | |
| Merci Marc, je vais regarder ton code de près. Je me dis que si c'est possible sur le net cela doit l'être avec panoramic. Le tout est de trouver les bonnes infos pour la conception du code. | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Panoramic et QR code Mar 20 Avr 2021 - 18:56 | |
| Eh, ça a l'air intéressant, ce truc !!! Et où trouve-t-on les : FILE_LOAD 7,"QRcode.bmp" FILE_LOAD 8,"logo.bmp" | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 20 Avr 2021 - 19:01 | |
| | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Panoramic et QR code Mar 20 Avr 2021 - 19:19 | |
| Je te donne également ce module (c'est une sub) que j'avais développé et qui vient s'ajouter dans le source ci-dessus. Il s'agit de la complétion de la trame générée. C'est en trois parties : Les datas : - Code:
-
' Longeur de trame pour completion trame pour le type L DATA 19,34,55,80
' Longeur de trame pour completion trame pour le type M DATA 16,28,44,64 ' Longeur de trame pour completion trame pour le type Q DATA 13,22,34,48 ' Longeur de trame pour completion trame pour le type H DATA 9,16,26,36 Le chargement des datas : - Code:
-
SUB chargementTableCompletionVersion() DIM_LOCAL i%,j% FOR j% = 1 TO 4 FOR i% = 1 TO 4 READ tableCompletion%(j%,i%) NEXT i% NEXT j% END_SUB
Et la sub pour la complétion : - Code:
-
' completion de la trame SUB completionTrame() DIM_LOCAL motsManquant%, completion1$,completion2$ completion1$ = "11101100" completion2$ = "00010001" trame$ = trame$ + "0000" motsManquant% = tableCompletion%(correction%,versionQR%) - LEN(trame$)/8
WHILE motsManquant% > 0 trame$ = trame$ + completion1$ IF LEN(trame$)/8 = tableCompletion%(correction%,versionQR%) EXIT_WHILE END_IF trame$ = trame$ + completion2$ motsManquant% = tableCompletion%(correction%,versionQR%) - (LEN(trame$)/8) END_WHILE END_SUB
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Panoramic et QR code Mar 20 Avr 2021 - 19:35 | |
| Salut JJn4 !
Désolé, je n'avais pas vu ton post.
Voici les logos : https://mon-partage.fr/f/E4zd5Fli/ | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Panoramic et QR code Mar 20 Avr 2021 - 21:39 | |
| Je me suis intéressé aussi aux QRCodes. Voici un générateur de QRCode. On tape un texte dans l'EDIT "text" et le QRCode est généré en temps réel dans un PICTURE. http://panoramic-language.pagesperso-orange.fr/EXE/QRCodeGenerator.exeMais la raison pour laquelle j'interviens, c'est que Yannick m'a donné une idée avec le mot "plugin": - Yannick a écrit:
- Quelqu'un aurait il connaissance d'un plugin en ligne de commande pour créer des QR codes ?
En fait, il manque des "plugins" à Panoramic. Mon idée est de transformer QRCodeGenerator.exe en une dll qui serait appelée de manière simple: on lui passe en paramètre un string et le numéro d'un objet PICTURE, et ce plugin remplit le PICTURE avec le QRCode généré à partir du string. Ce serait simple et efficace. Et le grande idée c'est qu'on peut tout faire de cette manière ! Pour ajouter des fonctions, on ajoute des plugins sous forme de dll. A bientôt pour les plugins dans Panoramic... _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 21 Avr 2021 - 11:56 | |
| | |
| | | jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Re: Panoramic et QR code Jeu 22 Avr 2021 - 14:35 | |
| @Marc: J'ai essayé ton programme avec les 3 parties en plus, j'ai beau taper n'importe quoi, ça ne donne toujours qu'un espace blanc en haut à gauche et pas de QRcode. Est-ce que c'est normal, est-ce que c'est encore inachevé ? | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Panoramic et QR code Jeu 22 Avr 2021 - 19:21 | |
| Salut JJNn4 ! Oui ,le code-source est inachevé et donc pas du tout fonctionnel. C'est pour cela que j'ai précisé à Yannick : - Marc a écrit:
- J’avais commencé un générateur de QR code en Panoramic.
Je ne sais pas si cela peut t’aider, mais je te donne le source inachevé. Il reste encore quelques étapes à coder avant pourvoir générer un QR code. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 22 Avr 2021 - 20:26 | |
| @Marc, Pour quelqu'un qui n'a pas été très loin dans les études comme moi c'est un cauchemar. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Panoramic et QR code Mar 27 Avr 2021 - 9:56 | |
| A partir d'un code trouvé sur internet, j'ai codé une DLL qui contient une fonction qui retourne un QR Code dans le presse-papier quand on lui donne un texte en paramètre. Voici la dll: http://panoramic-language.pagesperso-orange.fr/Panoramic_DLL.dllEt un exemple d'utilisation de cette dll: - Code:
-
dim texte$ picture 1:stretch_on 1:width 1,200:height 1,200 library 1,"Panoramic_DLL.dll" function "genere%","QR_Code_Generate",1,"i","stdcall" texte$="Bonjour les panoramiciens" caption 0,genere%(adr(texte$)) clipboard_paste 1 end Cette fonction s'appelle QR_Code_GenerateElle appartient à la dll Panoramic_DLL.dllOn lui passe en paramètre l'adresse d'un string. La fonction calcule un QR Code à partir ce string et le met dans le presse-papier. En panoramic, il suffit alors de le récupérer par clipboard_paste 1. L'objet numéro 1 étant un PICTURE. La fonction retourne un entier qui vaut 0 si tout s'est bien passé et 1 s'il y a eu une erreur dans la génération du QR Code. Ce code, je le met dans le bandeau de FORM0 par la commande CAPTION. Notez également que j'utilise LIBRARY et FONCTION, ce qui permet de créer son propre mot-clé GENERE%, C'est un avant-gout de ce que seront les plugins ! Je met son source à disposition (3559 lignes) pour ceux que ça intéresse: http://panoramic-language.pagesperso-orange.fr/Panoramic_DLL.dprLe passage de l'adresse du string en paramètre est intéressant. J'avais eu il y a quelques années une discussion intéressante avec Klaus sur la récupération d'un string dans une DLL quand on lui passe son adresse par la fonction Panoramic ADR(Variable$)Klaus récupérait le string en Delphi. Lorsque Pedro avait fait son planétarium à l'été 2018, j'avais du "bidouiller" une fonction de la DLL de Klaus en son absence du forum pour pouvoir compiler le planétarium de Pedro, puis nouvelle discussion sur le passage d'un string à une dll, lorsque Klaus avait réapparu quelques mois plus tard. Nous avions alors testé différentes méthodes de passages de l'adresse d'un string par le compilateur. Dans ce source, vous verrez que dans la dll, je récupère le string en assembleur: - Code:
-
MOV ECX,PTexte MOV EDX,0 MOV EBX,[ECX] BOUCLE: MOV EAX,[EBX] MOV BYTE PTR Bte[EDX],AL CMP AL,0 JE FIN INC EBX INC EDX JMP BOUCLE FIN: En fait, ADR(Variable$) de Panoramic retourne une adresse de 32 bits (ici la variable PTexte) et passe en paramètre l'adresse d'un mot de 32 bits qui est l'adresse sur 32 bits du string Variable$ codé en zéro-terminal. (En résumé ADR retourne en fait l'adresse de l'adresse d'un string à zéro-terminal) Ainsi, lorsqu'on récupère le string dans le tableau Bte (par MOV BYTE PTR Bte[EDX],AL), il suffit de le faire dans une boucle (BOUCLE:) qui teste si l'octet est nul ou pas ( CMP AL,0). Klaus faisait cela d'une autre manière. J'explique ce code assembleur, car j'ai l'intention de permettre l'écriture de plugins pour Panoramic, et ce code pourrait resservir pour récupérer un string dans un plugin. L'avantage d'un plugin, c'est qu'il pourra agir sur les objets et les variables de Panoramic. Mais ce sera l'objet d'une autre histoire. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 27 Avr 2021 - 13:21 | |
| Waouuuu !... Merci Jack ! J'en ai rêvé, Jack l'a fait... Je vais continuer quand même mon exploration pour le fun et surtout pour pas mourir idiot. Je suis d'accord avec cette vue de l'avenir. Les modules, plug-in, ou le nom que vous voulez, des utilisateurs qui seront partagés sur ce forum pourrait par la suite être intégré à un package lors des nouvelles versions. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 27 Avr 2021 - 13:51 | |
| Aie ! Avec la version 29i9 me dit que la ligne 6 n'est pas bonne pas possible d'appeler la dll pas un bon string bref c'est le souk à la ligne 6 Pour la version i9, le chemin doit être complet : - Code:
-
"c:\.....\...\Panoramic_DLL.dll" la ligne 6 doit être : - Code:
-
caption 0,str$(genere%(adr(texte$))) je vais revoir avec la version i11 mais vu les bêtises que cette version me fait... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Panoramic et QR code Mar 27 Avr 2021 - 14:04 | |
| Merci Jack.
@Yannick Tu dois indiquer le chemin complet de Panoramic_DLL.dll Ça m’a arrivé aussi. Personnellement , j’ai ajouté au PATH le dossier qui contient les DLL que j’utilise (KGF.DLL, Panoramic_DLL.dll, etc ..) De cette façon plus besoin d’indiquer le chemin de la DLL en question. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Panoramic et QR code Mar 27 Avr 2021 - 14:43 | |
| - yannick a écrit:
- la ligne 6 doit être :
Code: caption 0,str$(genere%(adr(texte$))) Là je suis surpris car il y a transformation automatique d'un entier en string. Il n'y a pas besoin de transformer en string par STR$. Ne serais-tu pas en train de tester la dll avec le compilateur, qui, lui, exige une transformation en string par STR$ ? Je ne pense pas que la dll fonctionne avec le compilateur (je n'ai pas testé), car de mémoire, ADR(Variable$) ne fonctionne pas de la même manière avec le compilateur. (c'est un résidu de la compilation du planétarium de Pedro, j'avais changé aussi ADR dans le compilateur pour "faire fonctionner" son planétarium avec le compilateur.) J'ai testé la dll avec l'interpréteur en version 0.9.i11 du 7/11/2020 et je vous assure que cela fonctionne. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Panoramic et QR code Mar 27 Avr 2021 - 15:05 | |
| - Jack a écrit:
- J'ai testé la dll avec l'interpréteur en version 0.9.i11 du 7/11/2020 et je vous assure que cela fonctionne.
Je confirme : ça fonctionne. Il suffit d’indiquer le chemin où se trouve la dll. Pour caption pas besoin d’indiquer un string. Voici un code et son résultat - Spoiler:
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 27 Avr 2021 - 15:34 | |
| @ Jack Comme j'ai changé les deux avant de lancer, peut être que seul le chemin complet suffit. Je suis sous 29i9 la i11 me fait un truc bizarre et me plante mon programme (le programme saute d'une condition - if...end_if - à une autre ,où il n'a rien à faire, et plante) Je ne veux pas crier au loup car cela fait un moment que je n'ai pas fait de programme et je suis un peu rouillé voir corrodé . - début de programme:
- Code:
-
' ============================================================================== ' QR-CODE GENERATOR ' Vs 0.01 ' Y.GERONIMI ' ============================================================================== ' DECLARATIONS VARIABLES ' ==============================================================================
dim i% dim no%
' Objets dim Mm% dim Sm%(30) dim MemTxt% dim ContOpt% dim OptType%(4) dim alph%(10) dim param%(10)
' Système dim QrVsInfo%(40,15) dim QRvs% dim QRsize% dim TypeVal%,QRtype$ dim QRmode% dim QRmatrice%
' ============================================================================== ' NUMEROTATION DES OBJETS ' ==============================================================================
no% = no%+1 : Mm% = no% for i%=1 to 30 : no% = no%+1 : Sm%(i%) = no% : next i% no% = no%+1 : MemTxt% = no% no% = no%+1 : ContOpt% = no% for i%=1 to 4 : no% = no%+1 : OptType%(i%) = no% : next i% for i%=1 to 10 : no% = no%+1 : alph%(i%) = no% : next i% for i%=1 to 10 : no% = no%+1 : param%(i%) = no% : next i% ' ============================================================================== ' DECLARATIONS SOUS PROGRAMMES ' ==============================================================================
label Kup
' ============================================================================== ' DECLARATIONS ETIQUETTES ' ==============================================================================
label Table label QrSizeData ' ============================================================================== ' DATAS ' ==============================================================================
Table: data "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
QrSizeData: data 21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121 data 125,129,133,137,141,145,149,153,157,161,165,169,173,177
' ============================================================================== ' PROGRAMME ' ==============================================================================
INTERFACE() INIT() end
' ============================================================================== ' GUI ' ==============================================================================
sub INTERFACE() height 0,700 width 0,550 top 0,(screen_y-height(0))/2 left 0,(screen_x-width(0))/2 caption 0,"QR-CODE GENERATOR" font_name 0,"Courier New" font_size 0,10 main_menu Mm% sub_menu Sm%(1) : parent Sm%(1),Mm% : caption Sm%(1),"QR-Code" memo Memtxt% height Memtxt%,250 width Memtxt%,width_client(0)-20 top Memtxt%,10 left Memtxt%,10 bar_vertical Memtxt% on_key_down MemTxt%,Kup color MemTxt%,255,187,175 alpha Alph%(1) top Alph%(1),top(Memtxt%)+height(Memtxt%)+10 left Alph%(1),10 caption Alph%(1),"Type"+string$(4,chr$(32))+": " font_bold Alph%(1) edit param%(1) width param%(1),120 top param%(1),top(alph%(1))-2 left param%(1),left(alph%(1))+width(alph%(1))+5 color Param%(1),255,187,175 inactive param%(1) alpha Alph%(2) top Alph%(2),top(param%(1))+height(param%(1))+10 left Alph%(2),10 caption Alph%(2),"Version : " font_bold Alph%(2) edit param%(2) width param%(2),50 top param%(2),top(alph%(2))-2 left param%(2),left(alph%(2))+width(alph%(2))+5 color Param%(2),255,187,175 inactive param%(2) alpha Alph%(3) top Alph%(3),top(param%(2))+height(param%(2))+10 left Alph%(3),10 caption Alph%(3),"Mode"+string$(4,chr$(32))+": " font_bold Alph%(3) combo param%(3) width param%(3),50 top param%(3),top(alph%(3))-2 left param%(3),left(alph%(3))+width(alph%(3))+5 color Param%(3),198,255,217 item_add Param%(3),"L" item_add Param%(3),"M" item_add Param%(3),"Q" item_add Param%(3),"H" item_select Param%(3),1 end_sub
' ============================================================================== ' INITIALISATIONS ' ==============================================================================
sub INIT() dim_local x% ' chargement des infos de taille en blocs restore_label QrSizeData for x%=1 to 40 read QrVsInfo%(x%,1) next x% end_sub
' ============================================================================== ' SOUS PROGRAMMES ' ==============================================================================
Kup: off_key_up MemTxt% DetectType(MemTxt%) set_focus MemTxt% on_key_up MemTxt%,Kup return
' ============================================================================== ' PROCEDURES ' ==============================================================================
sub DetectType(obj%) dim_local x%,l%,c$,scc% scc% = scancode display l% = len(text$(obj%)) if l% = 0 TypeVal% = 0 color MemTxt%,255,187,175 end_if if scc%=8 if l%>0 TypeVal% = 0 for x%=1 to l% c$ = mid$(text$(obj%),x%,1) TypeVal% = CheckTypeVal%(c$) next x% end_if else TypeVal% = 0 color MemTxt%,255,187,175 end_if if scc%<>8 if l%>0 c$ = mid$(text$(obj%),caret_x_position(obj%),1) TypeVal% = CheckTypeVal%(c$) color MemTxt%,198,255,217 end_if end_if select TypeVal% case 0 : QRtype$ ="" : text Param%(1),"" : color Param%(1),255,187,175 case 1 : QRtype$="0001" : text Param%(1),"Numérique" : color Param%(1),198,255,217 case 2 : QRtype$="0010" : text Param%(1),"Alphanumérique" : color Param%(1),198,255,217 case 3 : QRtype$="0100" : text Param%(1),"Binaire" : color Param%(1),198,255,217 end_select end_sub
' ============================================================================== ' FONCTIONS ' ==============================================================================
fnc CheckTypeVal%(car$) dim_local TbleNum$,TbleAlph$ TbleNum$ = "0123456789" TbleAlph$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" if instr(TbleNum$,car$)>0 if TypeVal%<1 : result 1 : end_if else if instr(TbleAlph$,car$)>0 if TypeVal%<2 : result 2 : end_if else result 3 end_if end_if end_fnc
J'ai été obligé de coupé au niveau des lignes 192,193 et de faire deux conditions séparées : if scc% = 8 if scc% <>8 au lieu d'un : else car la condition scc%<>8 n'était pas respecté et le programme sautait à la ligne 196 et planté en 197 avec un caret à 0 edit : Rien que d'écrire ces quelques mots et vient une idée de faire la bidouille d'une autre manière. Pas sûr qu'elle soit très orthodoxe mais bon, le bon vieux système P. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Panoramic et QR code Mar 27 Avr 2021 - 17:38 | |
| @yannick: Je ne comprends pas bien ta demande. Je n'ai pas trouvé d'erreur dans le code que tu montres. Si tu penses trouver une erreur, isole la en quelques lignes, propose la sur le forum et je l'analyserai. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 27 Avr 2021 - 18:20 | |
| @ Jack, Ne te bile pas, j'avais du faire une andouillerie... Par contre, je suis curieux de savoir une chose. Lorsque l'on récupère le code touche par la variable système scancode,la variable est elle chargé avant l'effet de la touche sur l'objet ou après ? J' image le truc : j'ai un objet edit il a le focus je tape sur la touche e Par on_key_down,... et avec la variable système scancode je veux récupérer le code la touche e. La variable est elle chargée avant ou après que la lettre e soit affichée dans l'objet edit ? Je sais que je suis tordu mais... le savoir peut changer beaucoup de choses | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Panoramic et QR code Mer 28 Avr 2021 - 10:52 | |
| SCANCODE appelle l'API Windows GetAsyncKeyState, qui, comme son nom l'indique est asynchrone. SCANCODE n'a rien a voir avec la gestion des événements ON_KEY_DOWN ou ON_KEY_UP et je ne peux pas dire si un objet Windows affiche le caractère avant ou après la fonction GetAsyncKeyState. Tout ce que j'ai vu du comportement de Windows, c'est qu'il gère ses objets de manière totalement asynchrone et je pense qu'il traite d'abord ce qui est le plus rapide et qu'il effectuera les traitements longs "plus tard". C'est ce que j'ai observé sur les objets qui affichent une image (PICTURE): l'image est mise à jour quand il n'y a plus rien d'autre à faire.
D'autre part, je ne comprends pas pourquoi tu utilises SCANCODE qui n'existe, ainsi que INKEY$ ou même INPUT que pour être compatible avec les ancien basics (programmation séquentielle). Ce sont des résidus de l'époque ou un seul programme tournait et où la notion d'événement n'existait pas. SCANCODE et INKEY$ ont été développés à la demande d'utilisateurs du forum qui avaient des habitudes d'une programmation qui se faisait sous DOS (exécution séquentielle en monotache avec le programme qui gère tout lui-même) et qui ne sont plus du tout compatibles des fonctionnements des OS d'aujourd'hui, où c'est l'OS qui gère l'environnement (programmation événementielle).
Dans un traitement d'événement, il faut oublier SCANCODE ou INKEY$ qui correspondent à une programmation séquentielle. Il n'est pas bon de mélanger les 2 modes de programmation. C'est un peu comme vouloir tester soi-même l'objet cliqué par IF CLICKED(N)=1 au lieu d'utiliser ON_CLICK N,L. Cela ne correspondent pas à une programmation événementielle. Mais je me répète car j'en ai déjà parlé de nombreuses fois sur ce forum...
Le seul moyen compatible avec la gestion des événements ON_KEY_DOWN ou ON_KEY_UP pour connaître exactement quelle touche a déclenché l'événement est d'utiliser KEY_DOWN_CODE, KEY_UP_CODE avec en complément, KEY_DOWN_SPECIAL et KEY_UP_SPECIAL pour savoir si une touche spéciale a été utilisée en plus. _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 28 Avr 2021 - 13:48 | |
| @ Jack, Merci pour la réponse, j'y vois plus clair même si cela ne fait pas mes affaires. Le but du jeu tu dois t'en douter est de détecter si le type de texte contenu dans le MEMO est du type Numérique, Alphanumérique ou ISO.... je fais l'impasse sur Kanji . si je me sers de ON CHANGE N,L derrière il faut que je teste tout le texte de l'objet dans une boucle car le changement n'est pas forcement sur le dernier caractère. Avec quatre mille et des brouettes caractères pour les QRC les plus long cela risque d'être un peu long comme traitement entre deux frappe clavier. Donc, je suis parti sur le teste de chaque frappe clavier. je récupère le caractère, je détermine son type et j'ajoute ou retire un élément à sa catégorie. Puis je fais ma soupe de condition pour savoir de quel type je dois me servir pour la suite. Pour l'ajout de caractère on_key_up + key_up_code c'est bon, la lettre est affiché dans le mémo je récupère donc cette lettre à la levée de la touche Pour le retrait d'un caractère, là, ca se complique. Je dois récupérer le caractère avant qu'il soit effacé pour en déterminer son type. Et pour couronner le tout j'ai des comportements que je n'explique pas mais je ne désespère pas. Voilà où j'en suis : - Spoiler:
- Code:
-
' ============================================================================== ' DECLARATIONS DES VARIABLES ' ==============================================================================
' type de données dim TypeVal%(3) ' Codes binaires dim QrType$
' ============================================================================== ' DECLARATIONS DES CONSTANTES ' ==============================================================================
dim TableNum$ dim TableAlph$ dim TableKeyCar$
' ============================================================================== ' DECLARATIONS DES SOUS PROGRAMMES ' ==============================================================================
label Kdown label Kup ' ============================================================================== ' DECLARATIONS DES ETIQUETTES ' ==============================================================================
label DatKeyCar ' ============================================================================== ' DATAS ' ==============================================================================
DatKeyCar: data 13,32,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,71,72,73,74,75,76 data 77,78,79,80,81,82,83,84,85,86,87,89,90,96,97,98,99,100,101,102,103,104 data 105,106,107,109,110,111,186,187,188,190,191,192,219,220,221,222,223,226 ' ============================================================================== ' INTERFACE ' ==============================================================================
height 0,450 width 0,500 top 0,(screen_y-height(0))/2 left 0,(screen_x-width(0))/2
font_name 0,"Courier New" font_size 0,10
memo 1 height 1,height_client(0)-50 width 1,width_client(0) bar_vertical 1 color 1,255,187,175 on_key_down 1,Kdown on_key_up 1,Kup
alpha 2 top 2,height(1)+10 left 2,10 caption 2,"Type : "
edit 3 top 3,height(1)+8 left 3,left(2)+width(2)+5 inactive 3 color 3,255,187,175 alpha 4 top 4,height(1)+5 caption 4,"Nbre de caractères : 0" left 4,width_client(0)-(width(4)+10) InitConstantes() end ' ============================================================================== ' SOUS PROGRAMMES ' ============================================================================== Kdown: off_key_down 1 DetectCodeTypeDelCar(1,key_down_code) AffectCodeTypeValue(3) caption 4,"Nbre de caractères : "+str$(len(text$(1))) left 4,width_client(0)-(width(4)+10) on_key_down 1,Kdown set_focus 1 return
Kup: off_key_up 1 DetectCodeTypeAddCar(1,key_up_code) AffectCodeTypeValue(3) caption 4,"Nbre de caractères : "+str$(len(text$(1))) left 4,width_client(0)-(width(4)+10) on_key_up 1,Kup set_focus 1 return ' ============================================================================== ' PROCEDURES ' ==============================================================================
' Initialisation des constantes Sub InitConstantes() dim_local cod%,x% TableNum$ = "0123456789" TableAlph$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" restore_label DatKeyCar for x%=1 to 63 read cod% TableKeyCar$ = TableKeyCar$+str$(cod%)+"," next x% read cod% TableKeyCar$ = TableKeyCar$+str$(cod%) end_sub ' Ajout de carateres sub DetectCodeTypeAddCar(In%,SCC%) dim_local car$,l%,v% if SCC%<>8 and instr(TableKeyCar$,str$(SCC%))>0 l%=len(text$(In%)) if l%>0 car$ = mid$(text$(In%),caret_position(In%),1) v% = CheckTypeVal%(car$) TypeVal%(v%)=TypeVal%(v%)+1 end_if end_if end_sub
' Suppression de caracteres sub DetectCodeTypeDelCar(In%,SCC%) dim_local car$,l%,v% if SCC%=8 l%=len(text$(In%)) if l%>0 car$ = mid$(text$(In%),caret_position(In%),1) v% = CheckTypeVal%(car$) TypeVal%(v%)=TypeVal%(v%)-1 end_if end_if end_sub
' Attribution des valeurs Sub AffectCodeTypeValue(Out%) if TypeVal%(3)>0 QrType$ = "0100" text Out%,"Binaire" color Out%,198,255,217 else if TypeVal%(2)>0 QrType$ = "0010" text Out%,"Alphanumérique" color Out%,198,255,217 else if TypeVal%(1)>0 QrType$ = "0001" text Out%,"Numérique" color Out%,198,255,217 else QrType$ = "" text Out%,"" color Out%,255,187,175 end_if end_if end_if caption 0,str$(TypeVal%(1))+"-"+str$(TypeVal%(2))+"-"+str$(TypeVal%(3)) end_sub ' ============================================================================== ' FONCTIONS ' ==============================================================================
fnc CheckTypeVal%(car$) if instr(TableNum$,car$)>0 result 1 else if instr(TableAlph$,car$)>0 result 2 else result 3 end_if end_if end_fnc
| |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Panoramic et QR code Mer 28 Avr 2021 - 22:17 | |
| Bonsoir à tous ! @Yannick Voici une idée de discrimination du type de chaine de caractères. - Code:
-
dim type$, pos%, caractere$, charIsAlpha% dim bin%, num%, alphaNum%, iso% label identification memo 1 on_change 1,identification end
identification: caption 0,"" type$ = ""
bin% = 1 num% = 1 alphaNum% = 1 iso% = 1 for pos% = 1 to len(text$(1)) caractere$ = mid$(text$(1),pos%,1)
' binaire ? if asc(caractere$) <> 48 and asc(caractere$) <> 49 bin% = 0 end_if
' numérique ? if asc(caractere$) > 57 or asc(caractere$) < 48 num% = 0 end_if
' Alpha-Numérique ? charIsAlpha% = 0
if asc(caractere$) = 32 charIsAlpha% = 1 end_if
if asc(caractere$) > 35 and asc(caractere$) < 38 charIsAlpha% = 1 end_if
if asc(caractere$) > 41 and asc(caractere$) < 44 charIsAlpha% = 1 end_if if asc(caractere$) > 44 and asc(caractere$) < 59 charIsAlpha% = 1 end_if if asc(caractere$) > 64 and asc(caractere$) < 91 charIsAlpha% = 1 end_if if charIsAlpha% = 0 alphaNum% = 0 end_if next pos%
affichageResultat() return
sub affichageResultat() ' affichage du résultat dans le caption 0 if bin% = 1 type$ = " Binaire +" end_if if num% = 1 type$ = type$ + " Numérique +" end_if if alphaNum% = 1 type$ = type$ + " Alpha Numérique +" end_if
type$ = type$ + " iso8859" caption 0,type$ end_sub
Je suis parti du principe que - tout binaire est numérique ; - tout numérique est alpha numérique ; - tout alpha numérique est iso8859. Le résultat s'affiche dans le caption 0. En espérant que cela convienne à ta recherche. Bonne continuation ! EDIT : J’oubliais de préciser que l’on peut insérer ou supprimer un caractère du memo, l’analyse de fait à chaque fois sur l’ensemble de la chaine de caractères. Si le principe est retenu, il faudra ajouter entre autres, une condition si la chaine de caractères est entièrement effacée … | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 28 Avr 2021 - 23:50 | |
| Merci Marc, je vais regarder cela de près. | |
| | | Contenu sponsorisé
| Sujet: Re: Panoramic et QR code | |
| |
| | | | Panoramic et QR code | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |