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 |
|
|
| V2.83 du 15/02/2014 - ajout fonction CreateMask | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: V2.83 du 15/02/2014 - ajout fonction CreateMask Sam 15 Fév 2014 - 10:49 | |
| Nouvelle version: KGF.dll V2.83 du 15/02/2014Nouveauté: ajout de la fonctioin CreateMaskModules modifiés: KGF.dllKGF_SUB.basKGF.chmKGF.docKGF.pdfLa doc et les sources sont à jour. Cette fonction, d'après une suggestion de Cosmos70, construit une chaîne de caractères en sortie, représentant un masque pour une chaîne de caractères en entrée. Les paires de guillemets seront remplacés par des paires accolades, tout séparateur trouvé dans une liste de séparateurs est remplacé par un caractère masque symbolisant la présence d'un séparateur, et tous les autres caractères sont remplacés par un caractère masque symbolisant la présence d'un caractère texte normal. Ainsi, voici le résultat pour un cas concret: - Citation :
- ' For a% = 1 to 10:print "fort de toute expérience": next a%:if a%>=10 then a%=10: ' fin de la ligne
' *===*==***=*==*==*=====*{====*==*=====*==========}**====*==*==*==**==*====*==*==****===*==*==*===== | |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Sam 15 Fév 2014 - 16:05 | |
| J'avais pas vu que c'était une nouvelle version que tu venais de créer. Klaus! Plus fort que Lucky Lucke? Il a la dégaine rapide! |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Sam 15 Fév 2014 - 18:44 | |
| Je reviens à la charge, car j'ai commis une erreur. J'ai publié un code avec un masque de parenthèses. J'avais bien marqué que c'étais pour le contrôle, car j'avais des erreurs lors de la conception du code. Il n'est pas bon de mettre un masque différent pour les parenthèses. Si j'utilise instr() pour progressé à la sortie du masque, je dois le faire pour "*" et pour "{" et comparer lequel est devant l'autre, ce qui complique et ralenti l'exécution du code. Pour le masque de fermeture, cela n'a pas d'importance, si il n'y a rien entre les deux parenthèses, je peux recherché l'étoile, ou l'accolade fermante. Autrement à la place de instr(), il faudrait faire une boucle for/next et regardé le masque. C'est pas un avantage.
Désolé d'avoir montré une fausse piste. @+ |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Sam 15 Fév 2014 - 22:20 | |
| Pas grave. Montre-moi ce que tu cherches vraiment - je peux sûrement adapter. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 15 Fév 2014 - 23:23 | |
| @ Klaus, Garde celle là quand même, elle peut servir... | |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 16 Fév 2014 - 1:23 | |
| Ah! j'arrive! J'y ai repensé depuis: le plus simple car cela ne modifie presque pas le code que tu as du faire, c'est de mettre aussi une variable de remplacement pour les guillemets. Ainsi on représente les guillemets de la même manière, ou on ressort celui-ci. Peut-être concernant les guillemets, faudrait-il avoir un flag pour soit éviter les masques dans la chaine, soit faire comme si les guillemets n'avaient pas d'intérêt. Je ne sais pas tous les cas que cette instruction peut avoir besoin, mais cette méthode pourrait s'adapter à des cas non pensés.
Il ne reste qu'un seul argument. Où alors dans le masque, on évite le masque "=" qui n'a pas besoin d'être indiqué, c'est celui que tu choisis.
Qu'en penses-tu? Ce qu'on lit est le masque qui ressort par rapport aux caractères standards. Il n'est pas nécessaire d'indiquer un caractère générique. Il ne reste que celui du guillemet qui peut-être une option. Si on a: a$ = "for a% = 1" avec un retour: m$= "---*--***-" on sait que mid$(a$, instr(m$,"*"),1) est égal à " ", et on traite le contrôle espace. Il suffit de connaitre les caractères que tu as choisi, pour les prendre dans les contrôle. De cette façon il y a assez de paramètres pour DLL. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 16 Fév 2014 - 10:29 | |
| J'ai ajouté un paramètre mask_quote à GenerateMask pour gérer la représentation des guillemets.
Si ce paramètre est la chaîne vide, les guillemets seront considérés comme du simple texte.
Si ce paramètre ne contient qu'un seul caractère, tous les guillemets seront remplacés par ce caractère. A fortiori, si ce caractère est chr$(34), les guillemets seront inchangés dans le masque résultant.
Si ce paramètres a 2 ou plusieurs caractères, le premier marquera le guillemet ouvrant, se deuxième le guillemet fermant. Exemple: "{}" pour reproduire le comportement de la fonction avant l'ajout de ce paramètre. | |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 16 Fév 2014 - 12:03 | |
| Merci Klaus. Je viens de tester.
C'est pas tout à fait ce que je pensais, mais c'est sans importance, c'est très bien ainsi. Il suffit pour les parenthèses de mettre "*}" pour les quillemets. Lorsqu'on trouve le premier guillemet, on recherche "}" pour éviter les masques entre les guillemets. Donc c'est formidable. C'est une fonction généraliste qui peut servir à autre chose que d'avoir à coloriser une ligne de code.
|
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Lun 17 Fév 2014 - 1:32 | |
| Je mets ici un petit programme de démonstration pour montrer que parfois, c'est pas une mauvaise idée que de demander une instruction à Klaus (sans vouloir le surcharger, évidemment) Ce programme n'est pas optimisé, je m'y étais pris à l'envers comme ça m'arrive souvent, et il y a des routines qui pourraient diminer le code. Je n'ai même pas traité le code REM , je voulais voir la rapidité du programme. Je n'ai pas utilisé le RichEdit, je ne le connais pas encore, seulement le seul objet de Panoramic qui permet la coloration: PICTURE. Mon chrono étant en 100ème de minute: 6 centièmes pour afficher une page. Cela était impossible avant. - Spoiler:
- Code:
-
dim g$ , t$ , x% , y% , clic% , cmd$ cmd$ = " FOR TO NEXT PRINT IF THEN ELSE END_IF " g$ = chr$(34) : t$ = chr$(13) width 0,screen_x : font_name 0,"Consolas" : font_size 0,10 : font_bold 0 edit 1 : width 1,width(0)-30 : height 1,30 edit 2 : width 2,width(1) : height 2,30 : top 2,30 edit 4 : width 4,width(1) : height 4,30 : top 4,60 memo 3 : top 3,90: width 3,width(1) : height 3,400 form 10 : full_space 10 picture 11 : parent 11,10 : full_space 11 : font_size 11,10 : font_bold 11 : font_name 11,"Consolas" print_target_is 11 : 2d_target_is 11 : color 11,195,140,121
dll_on "kgf.dll" teste() end ' ==================== sub teste() dim_local a$,separe$, separe2$ dim_local msk1$, msk2$, b$, res% , a% , quote$ msk1$ = "*" : msk2$ = "=" : quote$ = "*}" y% = 10 : x% = 10 separe2$ = " ,:<>='/*+-" a$ = " For a% = 1 to 10:print " + g$ + "fort de toute expérience" + g$ + ": next a%:if a%>=10 then a%=10: ' fin de la ligne" text 1,a$ for a% = 1 to 200 text 4,"" : color 4,255,255,255
b$ = string$(len(a$)," ") res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) text 4,b$ text 4,"" : color 4,255,255,0 b$ = string$(len(a$)," ") res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) text 4,b$ next a% color 4,255,255,255 hide 11 : message "Prêt" for a% = 1 to 50 b$ = string$(len(a$)," ") res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) colorise(a%,a$,b$) y% = y% +18 next a% show 11
end_sub ' ===========================================================
sub colorise(ligne% ,a$ , b$) to_foreground 10 dim_local v% , w%, c% , d$ , mot$ , j : j = 9
x% = 40 2d_fill_color 230,230,230 : font_color 11,187,153,143: print_locate 0,y% : print right$(" "+str$(ligne%),4)
repeat v% = instr(b$,"*") if v% > 0 d$ = mid$(a$,v%,1) c% = asc(d$) if instr(",:<>=/*+-",d$) > 0 font_color 11, 240,100,57 print_locate x%,y% if v% = 1 print d$ : mot$="" : a$ = right_pos$(a$,2) : b$ = right_pos$(b$,2) : x% = x%+j else
mot$ = left$(a$,v%-1) :' ici il faudra tenir compte des mot-cles et afficher
if instr(cmd$," " + upper$(mot$) + " ") > 0 font_color 11, 0,0,255 else if numeric(mot$) = 1 font_color 11, 255,0,0 else font_color 11, 0,0,0 end_if end_if print mot$ x%=x%+(len(mot$)*j) mot$ = d$ : print_locate x%,y% :font_color 11,240,100,57 print mot$ :x%=x%+(len(mot$)*j) : a$ = right_pos$(a$,v%+1) : b$ = right_pos$(b$,v%+1) end_if else if d$ = g$ ' il faudra mettre en sub généraliste if mot$ <> "" then print_locate x%,y%:print mot$ : x%= x%+(len(mot$)*j) a$ = right_pos$(a$,v%) : w% = instr(b$,"}") mot$ = left$(a$,w%-1) : font_color 11,34,114,61 print_locate x%,y% print mot$ x%=x%+ (len(mot$) * j) : print_locate x%,y%:print g$: x% = x%+j mot$="" a$=right_pos$(a$,w%+1) b$ = right_pos$(b$,w%+1) else if d$ = " " mot$ = left$(a$,v%-1) +" " if instr(cmd$ , " "+upper$(trim$(mot$)) + " ") > 0 font_color 11, 0,0,255 print_locate x%,y% : print mot$ : x% = x% + (len(mot$)*j) a$ = right_pos$(a$,v%+1) : b$ = right_pos$(b$,v%+1) : mot$ = "" else if numeric(mot$) = 1 font_color 11, 255,0,0 else font_color 11, 0,0,0 end_if print_locate x%,y% : print mot$ : x% = x% + (len(mot$)*j) a$ = right_pos$(a$,v%+1) : b$ = right_pos$(b$,v%+1) : mot$ = "" end_if
else if d$ = "'" font_color 11, 250,59,183 : print_locate x%,y% : print a$ : exit_repeat else font_color 11, 250,0,183 : print_locate x%,y% : print mot$ : x% = x% + (len(mot$)*j) mot$ = "" :a$ = right_pos$(a$, v%+1) : b$ = right_pos$(b$,v%) end_if end_if end_if: ' <<= g$ end_if
end_if to_foreground 10 until b$ = "" or v% = 0 or a$ = "" or scancode = 27
end_sub
|
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Lun 17 Fév 2014 - 2:20 | |
| Cela me réjouit que ma routine est non seulement fonctionnelle et utile, maius également rapide. C'est super. Juste pour avoir une idée de ce que ça représente en Delphi, voici le code complet de cette fonction: - Code:
-
function GenerateMask(txt,sep,msk1,msk2,msk3: pstring; out: integer):integer; stdcall; export; var texte, separ, mask1, mask2, mask3, accol: string; i: integer; p: pointer; begin texte := txt^; separ := sep^; mask1 := msk1^; mask2 := msk2^; mask3 := msk3^; if length(mask3)=0 then mask3 := mask2; // si mask_quote absent, on prend mask_text if length(mask3)<1 then mask3 := mask3 + mask3; accol := mask3[1]; i := pos('"',texte); while i>0 do begin if i>1 then texte := LeftStr(texte,i-1) + accol + MidStr(texte,i+1,Length(texte)) else texte := accol + MidStr(texte,i+1,Length(texte)); if accol=mask3[1] then accol := mask3[2] else accol := mask3[1]; i := pos('"',texte); end; for i:=1 to length(texte) do begin if pos(texte[i],'{}')=0 then begin if pos(texte[i],separ)>0 then begin if i>1 then texte := LeftStr(texte,i-1) + mask1 + MidStr(texte,i+1,Length(texte)) else texte := mask1 + MidStr(texte,i+1,Length(texte)); end else begin if i>1 then texte := LeftStr(texte,i-1) + mask2 + MidStr(texte,i+1,Length(texte)) else texte := mask2 + MidStr(texte,i+1,Length(texte)); end; end; end; p := @texte; CopyTextToPanoramic(integer(p),0,out); result := 0; end;
Ce n'est pas gros, n'est-ce pas ? En encore - on peut optimiser. J'ai privilégié la clarté d'écriture. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: Re Lun 17 Fév 2014 - 2:37 | |
| Je vais regarder tout ça de près...de très près... | |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Ven 21 Fév 2014 - 1:14 | |
| J'ai enfin réussi à prendre le temps de faire un vrai teste de coloration d'un source. Apparemment il n'y a pas d'erreur. Pour celui-ci moins de 4 secondes pour 150 lignes (sur un picture) - Spoiler:
- Code:
-
' Teste de coloration syntaxique avec le masque de la dll de KLAUS
label colore_precedent , calcul_suite :' , traitement_guillemets dim g$ , t$ , x% , y% , clic% , cmd$ , rem% cmd$ = " FOR TO NEXT PRINT IF THEN ELSE END_IF REM DIM CHR$ WIDTH SCREEN_X SCREEN_Y FONT_NAME FONT_SIZE FONT_BOLD EDIT HEIGHT LEFT TOP RIGHT RIGHT_POS$ INSTR INSTR_POS FORM FULL_SPACE ":' CMD$ = cmd$ + "MEMO LIST PICTURE PARENT PRINT_TARGET_IS 2D_TARGET_IS DLL_ON COLOR END SUB END_SUB DIM_LOCAL TEXT TEXT$ STRING LEN DLL_CALL6 ADR" cmd$ = cmd$ + " HIDE TO_FOREGROUND 2D_FILL_COLOR FONT_COLOR PRINT_LOCATE MESSAGE STR$ SHOW REPEAT UNTIL EXIT_REPEAT EXIT_FOR MID£ INSTR ASC UPPER$" cmd$ = cmd$ + " TRIM$ NUMERIC LEN SCANCODE OR AND BAR_BOTH " g$ = chr$(34) : t$ = chr$(13) width 0,screen_x : font_name 0,"Consolas" : font_size 0,10 : font_bold 0 edit 1 : width 1,width(0)-30 : height 1,30 edit 2 : width 2,width(1) : height 2,30 : top 2,30 edit 4 : width 4,width(1) : height 4,30 : top 4,60 memo 3 : top 3,90: width 3,width(1) : height 3,400 : file_load 3,"C:\MEMO\prg divers\colorise_code.bas" : bar_both 3 form 10 : height 10,screen_y : width 10,screen_x picture 11 : parent 11,10 : full_space 11 : font_size 11,10 : font_bold 11 : font_name 11,"Consolas" :height 11,3000 print_target_is 11 : 2d_target_is 11 :' color 11,195,140,121 memo 15 :bar_both 15: parent 15,10: left 15,700: width 15,width(10)-750: height 15,600: top 15,100 font_name 15,"Bitstream Vera Sans Mono" : font_bold 15 : font_size 15,10 : hide 15
dll_on "kgf.dll" teste() end ' ==================== sub teste() dim_local a$,separe$, separe2$ dim_local msk1$, msk2$, b$, res% , a% , quote$ msk1$ = "*" : msk2$ = "=" : quote$ = "*}" y% = 10 : x% = 10 separe2$ = " ,:<>='/*+-()" a$ = " For a% = 1 to 10 : print " + g$ + "fort de toute expérience" + g$ + " : next a%:if a%>=10 then a%=10: rem fin de la ligne" text 1,a$ for a% = 1 to 200 text 4,"" : color 4,255,255,255
b$ = string$(len(a$)," ") res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) text 4,b$ text 4,"" : color 4,255,255,0 b$ = string$(len(a$)," ") res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) text 4,b$ next a% color 4,255,255,255 hide 11 for a% = 1 to count(3) ' a% = 5 a$ = item_read$(3,a%)+" " if a$ <> "" then b$ = string$(len(a$)," "): else : b$ = " " : ' voir si ça débloque lorsque a$ = "" res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) colorise(a%,a$,b$) y% = y% +18 caption 10,a% next a% show 11
end_sub ' =========================================================== sub colorise(ligne%,a$,b$) to_foreground 10 dim_local v% , w%, c% , d$ , mot$ , rem% , j : j = 9 dim_local o$ x% = 40 :' décalage n° ligne rem 2d_fill_color 230,230,230 font_color 11,187,153,143: print_locate 0,y% : print right$(" "+str$(ligne%),4) if a$ <> "" repeat v% = instr(b$,"*") if v% > 0 d$ = mid$(a$,v%,1) if v%> 1 mot$ = left$(a$,v%-1) :' " " gosub colore_precedent end_if ' maintenant depuis v% if d$ = " " mot$ = " " gosub calcul_suite else if instr(",<>=/*+-",d$) > 0 mot$ = d$ font_color 11,0,47,8 gosub calcul_suite else if instr(":()",d$) > 0 mot$ = d$ font_color 11,0,0,0 o$ = o$ + "98 " gosub calcul_suite else if d$ = "'" mot$ = a$ font_color 11,233,15,233 gosub calcul_suite v% = 0 : a$ = "" else if d$ = g$ font_color 11,10,134,31 d$ = g$ :print_locate x%,y% : print g$ : x%=x% + j w% = instr(b$,"}") mot$ = mid$(a$,v%+1,w%-v%) print_locate x%,y% : print mot$ x% = x% + (len(mot$)*j) a$ = right_pos$(a$,w%+1) : b$ = right_pos$(b$,w%+1) else font_color 11,0,0,0 end_if end_if end_if end_if end_if end_if until v% = 0 or scancode = 27 if a$ <> "" then mot$ = a$ :gosub colore_precedent end_if
end_sub ' ============================== colore_precedent: ' appel depuis une sub, donc récupère les variables locales if instr(cmd$ , " "+upper$(mot$)+" ") > 0 font_color 11,0,0,255 print_locate x%, y% : print mot$ x% = x% + (len(mot$) * j) if upper$( trim$(mot$)) = "REM" font_color 11,233,15,233: mot$ = right_pos$(a$,v%):print_locate x%,y% : print mot$ : a$ ="" : v%=0 end_if else if numeric(mot$) = 1 font_color 11,255,0,0 print_locate x%, y% : print mot$ x% = x% + (len(mot$) * j) else font_color 11,0,0,0 print_locate x%, y% : print mot$ x% = x% + (len(mot$) * j) end_if end_if
return
calcul_suite: ' appel depuis une sub, donc récupère les variables locales print_locate x%, y% : print mot$ x% = x% + (len(mot$) * j) a$ = right_pos$(a$,v%+1) b$ = right_pos$(b$,v%+1) return
EDIT: Plus pensé, il faut mettre le chemin d'un programme dans le memo 3, en ligne 14. J'avais oublié ce détail, et en ligne 21, l'adresse de kgf. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Ven 21 Fév 2014 - 1:25 | |
| | |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Ven 21 Fév 2014 - 1:32 | |
| Oui, j'arrivais pas à me décider à aller jusqu'au bout. Par contre il y a une liste limitée de mots-clés, et qui ne concerne que ce programme. Mais le but n'était pas de coloriser sur un picture, mais de voir le résultat.
Il me tarde de pouvoir sortir de mes préoccupations du moment qui sont multiples. Je laisse le temps au temps!
J'ajoute que pour coloriser une seule ligne: 4000/150 = 26.centièmes de seconde soit 1000/25 donne près de 40 frappes par seconde. Donc on peut coloriser en temps réel |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 23 Fév 2014 - 1:42 | |
| Bonsoir, Il y a une chose que je ne comprend pas. J'essaye d'adapter petit à petit la colorisation d'un source pour du html, en rapport à mon programme de site. J'ai ajouté le WB, mais depuis j'ai annulé celui-ci. Je n'ai plus de retour du masque , le dernier paramètre, et je ne vois pas pourquoi. - Spoiler:
- Code:
-
' Teste de coloration syntaxique avec le masque de la dll de KLAUS label colore_precedent , calcul_suite :' , traitement_guillemets dim g$ , t$ , x% , y% , clic% , cmd$ , rem% , retour$ , lettre$ , a$ , a% dim url$ ,hnd% , res% : url$ = "file:///z:/SITE/sujet.html" cmd$ = " FOR TO NEXT PRINT IF THEN ELSE END_IF REM DIM CHR$ WIDTH SCREEN_X SCREEN_Y FONT_NAME FONT_SIZE FONT_BOLD EDIT HEIGHT LEFT TOP RIGHT RIGHT_POS$ INSTR INSTR_POS FORM FULL_SPACE ":' CMD$ = cmd$ + "MEMO LIST PICTURE PARENT PRINT_TARGET_IS 2D_TARGET_IS DLL_ON COLOR END SUB END_SUB DIM_LOCAL TEXT TEXT$ STRING LEN DLL_CALL6 ADR" cmd$ = cmd$ + " HIDE TO_FOREGROUND 2D_FILL_COLOR FONT_COLOR PRINT_LOCATE MESSAGE STR$ SHOW REPEAT UNTIL EXIT_REPEAT EXIT_FOR MID£ INSTR ASC UPPER$" cmd$ = cmd$ + " TRIM$ NUMERIC LEN SCANCODE OR AND BAR_BOTH FILE_LOAD LABEL ERROR_FRENCH PICTURE" rem pour remplacer les lettres accentées ou autre pour html lettre$ = chr$(34) + "&€<£¤|§¨ ª« ¯°±²³´µ¶¸»¼½¾ÀÁÄÆÇÈÉÊËÌÍÎÏ×ØÙÚÛÜßàâãäåæçèéêëìíîòóôö÷øùúû>" dlist 3:for a% = 1 to len(lettre$):read a$ : item_add 3,a$ : next a% g$ = chr$(34) : t$ = chr$(13) width 0,screen_x : font_name 0,"Consolas" : font_size 0,10 : font_bold 0 edit 1 : width 1,width(0)-30 : height 1,30 edit 2 : width 2,width(1) : height 2,30 : top 2,30 ' edit 3 : width 3,width(1) : height 3,30 : top 3,60 memo 399 : top 399,90: width 399,width(1) : height 399,400 : file_load 399,"C:\MEMO\icone-aligne_texte.bas" : bar_both 399 :hint 399,399 form 10 : height 10,screen_y : width 10,screen_x : hnd% = handle(10) picture 11 : parent 11,10 : full_space 11 : font_size 11,10 : font_bold 11 : font_name 11,"Consolas" :height 11,3000 print_target_is 11 : 2d_target_is 11 :' color 11,195,140,121 memo 15 :bar_both 15: parent 15,10: left 15,700: width 15,width(10)-750: height 15,600: top 15,100 font_name 15,"Bitstream Vera Sans Mono" : font_bold 15 : font_size 15,10 : hide 15 : hide 11 : hide 15 dlist 4 dll_on "C:\PANO\DLL\DLLs\kgf.dll" teste() end data ""","&","€","‹","£","¤","&bvrbar;","§","¨","©","ª","«","®","amasr;","°" data "±","²","³","´","µ","¶","¸","»","¼","½","¾","À","Á","Ä" data "&Aelig","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","×","Ø","Ù","Ú" data "Û","Ü","ß","à","â","ã","ä","å","æ","ç","è","é","ê","ë" data "ì","í","î","ò","ó","ô","ö","÷","ø","ù","ú","û","›" ' ==================== sub teste() dim_local a$,separe$, separe2$ dim_local msk1$, msk2$, b$ , a% , quote$ : ' dll_() msk1$ = "*" : msk2$ = "=" : quote$ = "*}" y% = 10 : x% = 10 separe2$ = " ,:<>='/*+-()" ' message "" hide 11 item_add 15,"<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>" item_add 15,"<html>" item_add 15,"<HEAD> <link rel='stylesheet' href='style.css' type='text/css' />" item_add 15,"<style> body font-size : 16px;</style>" item_add 15,"</HEAD><BODY>" item_add 4,"<pre><b><span class='fontBIG'>Code:</span></b></pre>" item_add 4,"<h4 class='code_fixe'><pre>" soulage() for a% = 1 to count(399) a$ = item_read$(399,a%)+" " ' if a$ <> "" then b$ = string$(len(a$)," "): else : b$ = " " : ' voir si ça débloque lorsque a$ = "" res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) message a$ + t$ + b$ : stop colorise(a%,a$,b$) y% = y% +18 caption 10,a% next a% item_add 15,"<br /><br />" item_add 15," </body>" item_add 15,"</HTML>" file_save 15,"Z:\SITE\teste.html" url$ = "file:///z:/SITE/teste.html" ' res% = dll_call1("WBUrl",adr(url$)) show 11 ' beep :message "fini" end_sub ' =========================================================== sub colorise(ligne%,a$,b$) to_foreground 10 dim_local v% , w%, c% , d$ , mot$ , rem% , j : j = 9 dim_local o$ x% = 40 :' décalage n° ligne rem 2d_fill_color 230,230,230 font_color 11,187,153,143: print_locate 0,y% : print right$(" "+str$(ligne%),4) if a$ <> "" repeat v% = instr(b$,"*") if v% > 0 d$ = mid$(a$,v%,1) if v%> 1 mot$ = left$(a$,v%-1) :' " " gosub colore_precedent end_if ' maintenant depuis v% if d$ = " " mot$ = " " gosub calcul_suite item_add 4," " else if instr(",<>=/*+-",d$) > 0 mot$ = d$ font_color 11,0,47,8 formater(mot$) : item_add 4,"<span class='Ec'>" + retour$ + "</span>" gosub calcul_suite else if instr(":()",d$) > 0 mot$ = d$ font_color 11,0,0,0 formater(mot$) : item_add 4,"<span class='En'>" + retour$ + "</span>" gosub calcul_suite else if d$ = "'" mot$ = a$ font_color 11,233,15,233 formater(mot$) : item_add 4,"<span class='Ex'>" + retour$ + "</span>" gosub calcul_suite v% = 0 : a$ = "" else if d$ = g$ font_color 11,10,134,31 d$ = g$ :print_locate x%,y% : print g$ : x%=x% + j formater(g$) : item_add 4,"<span class='Ev'>" + retour$ w% = instr(b$,"}") if w% >0 mot$ = mid$(a$,v%+1,w%-v%) else mot$ = right_pos$(a$,v%+1) : v% = 0: a$ = "" end_if print_locate x%,y% : print mot$ formater(mot$) : item_add 4, retour$ + "</span>" x% = x% + (len(mot$)*j) +1 a$ = right_pos$(a$,w%+1) : b$ = right_pos$(b$,w%+1) else font_color 11,0,0,0 end_if end_if end_if end_if end_if end_if until v% = 0 or scancode = 27 if a$ <> "" then mot$ = a$ :gosub colore_precedent end_if soulage() end_sub ' ============================== colore_precedent: ' appel depuis une sub, donc récupère les variables locales if instr(cmd$ , " "+upper$(mot$)+" ") > 0 font_color 11,0,0,255 print_locate x%, y% : print mot$ item_add 4,"<span class='Ec'>" + upper$(mot$) +"</span>" x% = x% + (len(mot$) * j) +1 if upper$( trim$(mot$)) = "REM" font_color 11,233,15,233: mot$ = right_pos$(a$,v%):print_locate x%,y% : print mot$ : a$ ="" : v%=0 item_add 4,"<span class='Ex'>" +mot$ + "</span>" end_if else if numeric(mot$) = 1 font_color 11,255,0,0 print_locate x%, y% : print mot$ item_add 4,"<span class='Er'>" + mot$ + "</span>" x% = x% + (len(mot$) * j) +1 else font_color 11,0,0,0 print_locate x%, y% : print mot$ formater(mot$) : item_add 4,"<span class='En'>" + retour$ + "</span>" x% = x% + (len(mot$) * j) +1 end_if end_if return calcul_suite: ' appel depuis une sub, donc récupère les variables locales print_locate x%, y% : print mot$ x% = x% + (len(mot$) * j) +1 a$ = right_pos$(a$,v%+1) b$ = right_pos$(b$,v%+1) return sub dll_() ' res%=dll_call1("WBCreate",hnd%) ' res%=dll_call4("WBLocate",0, 20,width(10),height(10)-70) :' 20,10,10):' ' res% = dll_call1("WBUrl",adr(url$)) end_sub sub soulage() dim_local a$,a% if count(4) > 0 for a% = 1 to count(4) a$ = a$ + item_read$(4,a%) next a% end_if item_add 15, a$ : clear 4 end_sub sub formater(a$) dim_local a%,i$,c$ ,v% , code% code%=1 for a% = 1 to len(a$) i$ = mid$(a$,a%,1) v% = instr(lettre$,i$) if code% = 1 if i$ = " " c$ = c$ + " " :' " " else if v%>0 then c$ = c$+item_read$(3,v%):else: c$=c$+i$ end_if else if v%>0 then c$ = c$+item_read$(3,v%):else: c$=c$+i$ end_if next a% retour$ =c$ end_sub
Si il y a une interférence, j'ai annulé l'appel du WB, même en ignorant le handle(de la form). Dans le memo 399, on met l'adresse d'un source. En ligne 63, j'ai mis un message sur le contenu de a$ et b$. J'ai essayé de voir si il y avait pas un problème de dim_local avec b$. Bizarre. Les mots-clés sont limités, mais comme de toute façon il n'y a rien pour b$, cela ne donnera rien de toute façon. Je pense maintenant à vu que ça ne marche plus. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 23 Fév 2014 - 1:58 | |
| Difficile de tester ça. On n'a pas le fichier chargé en ligne 21, par exemple. Et je ne vois aucun appel de la fonction CreateMask, et je ne peux donc pas voir pourquoi il n'y a pas de retour... | |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 23 Fév 2014 - 7:49 | |
| Bonjour, Écoutes: Je me réveille, et avant de regarder mon ordi, je me demandais si la chaîne b$ était bien à la longueur de a$. Je regarde et je vois que j'avais mis la ligne en commentaire.
J'en ai marre de me traiter d'idiot, alors je suis un con!. Désolé du dérangement. |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 23 Fév 2014 - 8:54 | |
| Je viens de modifier mon programme, en enlevant tout ce qui est inutile. En suivant les indications dans les commentaires sur différent fichier, vous pouvez tester le programme. Ici il y a une limitation des mot-clés. Ce n'est que pour tester la colorisation sur une page html. - Spoiler:
- Code:
-
' Teste de coloration syntaxique avec le masque de la dll de KLAUS label colore_precedent , calcul_suite :' , traitement_guillemets dim g$ , t$ , cmd$ , rem% , retour$ , lettre$ , a$ , a% dim url$ ,hnd% , res% cmd$ = " FOR TO NEXT PRINT IF THEN ELSE END_IF REM DIM CHR$ WIDTH SCREEN_X SCREEN_Y FONT_NAME FONT_SIZE FONT_BOLD EDIT HEIGHT LEFT TOP RIGHT RIGHT_POS$ INSTR INSTR_POS FORM FULL_SPACE ":' CMD$ = cmd$ + "MEMO LIST PICTURE PARENT PRINT_TARGET_IS 2D_TARGET_IS DLL_ON COLOR END SUB END_SUB DIM_LOCAL TEXT TEXT$ STRING LEN DLL_CALL6 ADR" cmd$ = cmd$ + " HIDE TO_FOREGROUND 2D_FILL_COLOR FONT_COLOR PRINT_LOCATE MESSAGE STR$ SHOW REPEAT UNTIL EXIT_REPEAT EXIT_FOR MID£ INSTR ASC UPPER$" cmd$ = cmd$ + " TRIM$ NUMERIC LEN SCANCODE OR AND BAR_BOTH FILE_LOAD LABEL ERROR_FRENCH PICTURE" rem pour remplacer les lettres accentées ou autre pour html lettre$ = chr$(34) + "'&€<£¤§¨ ª« ¯°±²³´µ¶¸»¼½¾ÀÁÄÆÇÈÉÊËÌÍÎÏ×ØÙÚÛÜßàâãäåæçèéêëìíîòóôö÷øùúû>" dlist 3:for a% = 1 to len(lettre$):read a$ : item_add 3,a$ : next a% g$ = chr$(34) : t$ = chr$(13) width 0,screen_x : font_name 0,"Consolas" : font_size 0,10 : font_bold 0 dlist 399 file_load 399,"C:\MEMO\installation_SITE.bas" :' n'importe fiochier panoramic : *.bas pour tester form 10 : height 10,screen_y : width 10,screen_x : hnd% = handle(10) :' form sur laquel le brother est créé. dlist 15 dlist 4 dll_on "C:\PANO\DLL\DLLs\kgf.dll" : ' à adapter teste() end data ""","'","&","€","‹","£","¤","§","¨","©","ª","«","®","—","°" data "±","²","³","´","µ","¶","¸","»","¼","½","¾","À","Á","Ä" data "&Aelig","Ç","È","É","Ê","Ë","Ì","Í","Î","Ï","×","Ø","Ù","Ú" data "Û","Ü","ß","à","â","ã","ä","å","æ","ç","è","é","ê","ë" data "ì","í","î","ò","ó","ô","ö","÷","ø","ù","ú","û","›" ' ==================== sub teste() dim_local a$, separe2$ dim_local msk1$, msk2$, b$ , a% , quote$ : dll_() msk1$ = "*" : msk2$ = "=" : quote$ = "*}" separe2$ = " ,:<>='/*+-()" item_add 15,"<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>" item_add 15,"<html>" item_add 15,"<HEAD> <link rel='stylesheet' href='style.css' type='text/css' />" ' ^^^^^^^^^ if 1=2 ' faire un fichier portant le nom: "style.css" avec dedans: body{ font-size: 70%; font-family : "Courier New",'bitstream Vera Sans Mono';font-weight:bold;} .Eb{color:blue; } .Er{color:red; } .Ev{color:green;} .Ec{color:darkred; } .Ex{color:magenta;} .En{color:black;} ' faire une copie des lignes commençant par body{ et les coller dans le bloc-notes. ' à mettre dans un dossier par exemple "C:\temp\style.css" . Il faudra que l'adresse de url$ soit dans le même dossier ' ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ end_if item_add 15,"<style> body font-size : 16px;</style>" item_add 15,"</HEAD><BODY>" item_add 4,"<pre>" ' item_add 4,"<pre><b><span class='fontBIG'>Code:</span></b></pre>" ' item_add 4,"<h4 class='code_fixe'><pre>" soulage() for a% = 1 to count(399) a$ = item_read$(399,a%)+" " if a$ <> "" then b$ = string$(len(a$)," "): else : b$ = " " : ' voir si ça débloque lorsque a$ = "" res% = dll_call6("GenerateMask",adr(a$),adr(separe2$),adr(msk1$),adr(msk2$),adr(quote$),adr(b$)) colorise(a%,a$,b$) caption 10,a% next a% item_add 15,"<br /><br />" item_add 15," </body>" item_add 15,"</HTML>" ' ------------------------------------------------------------------ ' mettre l'adresse dans le même dossier que le fichier : "style.css" file_save 15,"C:\temp\teste.html" :' modifier le chemin url$ = "file:///c:/temp/teste.html" :' modifier la partie chemin: ici c:/temp/teste.html en rapport avec ligne précédente ' ------------------------------------------------------------------ res% = dll_call1("WBUrl",adr(url$)) ' beep :message "fini" end_sub ' =========================================================== sub colorise(ligne%,a$,b$) to_foreground 10 dim_local v% , w%, c% , d$ , mot$ , rem% if a$ <> "" repeat v% = instr(b$,"*") if v% > 0 d$ = mid$(a$,v%,1) if v%> 1 mot$ = left$(a$,v%-1) gosub colore_precedent end_if ' maintenant depuis v% if d$ = " " mot$ = " " gosub calcul_suite item_add 4," " else if instr(",<>=/*+-",d$) > 0 mot$ = d$ formater(mot$) : item_add 4,"<span class='Ec'>" + retour$ + "</span>" gosub calcul_suite else if instr(":()",d$) > 0 mot$ = d$ formater(mot$) : item_add 4,"<span class='En'>" + retour$ + "</span>" gosub calcul_suite else if d$ = "'" mot$ = a$ formater(mot$) : item_add 4,"<span class='Ex'>" + retour$ + "</span>" gosub calcul_suite v% = 0 : a$ = "" else if d$ = g$ d$ = g$ formater(g$) : item_add 4,"<span class='Ev'>" + retour$ w% = instr(b$,"}") if w% >0 mot$ = mid$(a$,v%+1,w%-v%) else mot$ = right_pos$(a$,v%+1) : v% = 0: a$ = "" end_if formater(mot$) : item_add 4, retour$ + "</span>" a$ = right_pos$(a$,w%+1) : b$ = right_pos$(b$,w%+1) else end_if end_if end_if end_if end_if end_if until v% = 0 or scancode = 27 if a$ <> "" then mot$ = a$ :gosub colore_precedent end_if soulage() end_sub ' ============================== colore_precedent: ' appel depuis une sub, donc récupère les variables locales if instr(cmd$ , " "+upper$(mot$)+" ") > 0 item_add 4,"<span class='Eb'>" + upper$(mot$) +"</span>" if upper$( trim$(mot$)) = "REM" mot$ = right_pos$(a$,v%) : a$ ="" : v%=0 item_add 4,"<span class='Ex'>" +mot$ + "</span>" end_if else if numeric(mot$) = 1 item_add 4,"<span class='Er'>" + mot$ + "</span>" else formater(mot$) : item_add 4,"<span class='En'>" + retour$ + "</span>" end_if end_if return calcul_suite: ' appel depuis une sub, donc récupère les variables locales a$ = right_pos$(a$,v%+1) b$ = right_pos$(b$,v%+1) return sub dll_() res%=dll_call1("WBCreate",hnd%) res%=dll_call4("WBLocate",0, 10,width(10)-20,height(10)-70) end_sub sub soulage() dim_local a$,a% if count(4) > 0 for a% = 1 to count(4) a$ = a$ + item_read$(4,a%) next a% end_if item_add 15, a$ : clear 4 end_sub sub formater(a$) dim_local a%,i$,c$ ,v% , code% code%=1 for a% = 1 to len(a$) i$ = mid$(a$,a%,1) v% = instr(lettre$,i$) if code% = 1 if i$ = " " c$ = c$ + " " :' " " else if v%>0 then c$ = c$+item_read$(3,v%):else: c$=c$+i$ end_if else if v%>0 then c$ = c$+item_read$(3,v%):else: c$=c$+i$ end_if next a% retour$ =c$ end_sub
Si dants les data vous avec: DATA """, il faut le remplacer par: data """. Apparemment le source ici n'est pas respecté.
Dernière édition par cosmos70 le Dim 23 Fév 2014 - 10:39, édité 1 fois |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 23 Fév 2014 - 10:30 | |
| Super boulot Cosmos. Je n'ai pas encore testé, mais j'ai regardé le code et la réalisation est super intéressante | |
| | | Invité Invité
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask Dim 23 Fév 2014 - 10:43 | |
| Merci bien.
Je viens d'apporter une modification dans les datas. Il y avait une erreur sur un caractère, et j'ai remarqué qu'en première ligne, le guillemet était interprété sur le forum. Il faut le remplacer par DATA """ à la pace de DATA """ si c'est bien le cas chez-vous. |
| | | Contenu sponsorisé
| Sujet: Re: V2.83 du 15/02/2014 - ajout fonction CreateMask | |
| |
| | | | V2.83 du 15/02/2014 - ajout fonction CreateMask | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |