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 |
|
|
| Fonctions Chaine et variables locales | |
| | Auteur | Message |
---|
Invité Invité
| Sujet: Fonctions Chaine et variables locales Sam 4 Déc 2010 - 18:16 | |
| Je reprend ici le programme que j'avais fait pour les variables locales et globales. Il y a un apport de fonctions et il n'est pas certain que cela convienne à tout le monde. Ceci est une version provisoire. Il y a encore plein de choses à faire, mais voir ce qui a été fait peut permettre de réfléchir et si un problème particulier est à revoir, ou que j'ai pris une mauvaise direction. Cela permet de se faire une idée. je vais d'abord mettre le programme teste, le commenter - Code:
-
' programme d'essai Panoramic "C:\TESTE\teste_chaine.bas" clipboard_string_copy "C:\TESTE\teste_chaine.bas" : label fin EXECUTE "C:\TESTE\PROCEDURE\DIM_Global_Local\Dim_global_local.exe" rem ce programme s'arrète après execute, car c'est celui d'exécute qui prend la relève! wait 1500:goto fin end
dim a$,b$,chaine$ hide 0
a$="je suis ici et je suis là" b$="par là" :b%=4 @chaine(a$) @remplace(b%,"par là") message chaine$ b%=4 @del(b%,2) @CHAINE("lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche|") b$="|" :b%=2:' pour tester @TROUVE le séparateur @trouve(b%,b$) @INDEX(b$) @CHAINE("poireau/pomme de terre/chou/radis/salade/betterave") @INDEX("/") c%=6 @INDEX_REPERE(c%) message "@INDEX_REPERE(6)="+chaine_txt$
@INDEX_MODIFIE(2,b$) @INDEX_REPERE(2) message "@INDEX_REPERE(2)="+chaine_txt$
@INDEX_LISTE(200,300) @INDEX_LISTE(center) message chaine$ end ' restera le traitement des index del insert trouve ' nombre numerique dans une chaine ' =============================================================================================== fin: terminate
les lignes suivantes permettent de lancer (après sauvegarde du programme, si il y a eu des modifications) le "chargeur" le "loader" (je ne sais pas comment l'appeler (je ne sais pas si préprocesseur est aussi le mot qui convient) ' programme d'essai Panoramic "C:\TESTE\teste_chaine.bas" clipboard_string_copy "C:\TESTE\teste_chaine.bas" : label fin EXECUTE "C:\TESTE\PROCEDURE\DIM_Global_Local\Dim_global_local.exe" rem ce programme s'arrète après execute, car c'est celui d'exécute qui prend la relève! wait 1500:goto fin endces lignes ouvre le programme que j'ai fait (pas celui-là évidemment) et charge le programme. Ces lignes ne sont pas recopiées, elles ne servent que d'ouverture). D'ailleurs le programme que j'ai nommé ici teste_chaine_bas va disparaitre puisqu'il va directement à terminate. Il n'a plus d'utilité pour l'instant. attention: le programme teste est le vrai programme sur lequel on fait son travail, mais il ne sert qu'à faire le programme. Les ajouts et les transformation se font avec celui-ci. Ensuite c'est le chargeur qui s'occupe de tout. Si vous voulez voir, ce qu'il devient maintenant, voilà: - Code:
-
' programme qui s'inclut dans le programme bas pour ajouter les fonctions chaines dim ligne$,chaine_l$,chaine_m$,ligne%,chaine$,chaine_l%,chaine_marque$,chaine_Fonction$,chaine_r$,chaine_r%,variable$,chaine_index%,chaine_txt$,chaine_index$,chaine_trouve$,chaine_copie$,v%,chaine_choix%,chaine_txt%,i% dll_on "C:\TESTE\KGF\KGF.dll" label label_list1, label_list2 form 9948:hide 9948:width 9948,300:height 9948,160:border_small 9948 list 9949:parent 9949,9948:width 9949,200:width 9948,300:left 9949,70:font_size 9949,9:color 9949,238,232,170 font_color 9949,0,0,200 container_option 9947:parent 9947,9948:width 9947,65:height 9947,100:option 9946:parent 9946,9947:top 9946,10:caption 9946, "supprime" :height 9946,8:width 9946,60 option 9945:parent 9945,9947:top 9945,20:caption 9945, "insert" :width 9945,60 option 9944:parent 9944,9947:top 9944,35:caption 9944, "ajouter" :width 9944,60 option 9943:parent 9943,9947:top 9943,50:caption 9943, "modifie" : width 9943,60 option 9942:parent 9942,9947:top 9942,80:caption 9942, "rien" :width 9942,60 button 9941:parent 9941,9948:top 9941,100:caption 9941, "ok" : width 9941,30 edit 9940:parent 9940,9948 :top 9940,100:left 9940,70:width 9940,200:font_size 9940,10 button 9939:parent 9939,9948:top 9939,100:caption 9939,"exit": width 9939,30 :left 9939,35 ' button 9937:parent 9937,9948:top 9937,105:left 9937,273:width 9937,18:height 9937,20:caption 9937,"X" label chaine_index_repere , chaine_index_modifie,chaine_liste_go ,chaine_liste_choix ,chaine_liste_ferme label chaine_superpose ,chaine_del,chaine_trouve,chaine_index,chaine_liste,go_end on_click 9941,chaine_liste_go :on_click 9949,chaine_liste_choix :' on_click 9937,chaine_liste_cache ON_CLOSE 9948,chaine_liste_ferme i% = DLL_call6( "WindowRectangleHole" , handle(9948) , 1 , 280 , 0 , 20 , 160 ) :' 160 aulieu de 120 sans le bouton X on_click 9939,chaine_liste_ferme : timer 9938:on_timer 9938,go_end:timer_on 9938:end go_end: timer_off 9938:delete 9938 dim a$ , b$ , b% , c%
hide 0 a$="je suis ici et je suis là" b$="par là" :b%=4 chaine$ = a$ :rem @chaine(a$) chaine_l%=b% : chaine_r$= "par là" : gosub chaine_superpose : ' @remplace(b%,"par là") message chaine$ b%=4 chaine_l%=b% : chaine_r%=2 : gosub chaine_del :' @del(b%,2) chaine$= "lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche|" :rem @CHAINE("lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche|") b$="|" :b%=2:' pour tester @TROUVE le séparateur chaine_index%=-1:chaine_l%=b% : chaine_txt$=b$ : gosub chaine_trouve chaine_txt%=-1:chaine_txt$=b$ : gosub chaine_index :' @INDEX(b$) chaine$= "poireau/pomme de terre/chou/radis/salade/betterave" :rem @CHAINE("poireau/pomme de terre/chou/radis/salade/betterave") chaine_txt$= "/" : gosub chaine_index :' @INDEX("/") c%=6 chaine_index%=c% : gosub chaine_index_repere : ' @INDEX_REPERE(c%) message "@INDEX_REPERE(6)="+chaine_txt$ chaine_index%=2 : chaine_txt$=b$ : gosub chaine_index_modifie :' @INDEX_MODIFIE(2,b$) chaine_index%=2 : gosub chaine_index_repere : ' @INDEX_REPERE(2) message "@INDEX_REPERE(2)="+chaine_txt$ left 9948,200 : top 9948,300 :show 9948 :on_click 9948,label_list1 :on_click 9939,label_list1:end :label_list1: if clicked(9939)=1 or clicked(9948)=1 then gosub chaine_liste_ferme left 9948,screen_x/2-150:top 9948,screen_y/2-80:show 9948:to_foreground 9948:on_click 9948,label_list2 :on_click 9939,label_list2:end :label_list2: if clicked(9939)=1 or clicked(9948)=1 then gosub chaine_liste_ferme message chaine$ end ' restera le traitement des index del insert trouve ' nombre numerique dans une chaine ' ===================================================================== fin: terminate
' ===================================================================== ' SUB-ROUTINES de CHAINES ' les DIM et LABEL sont inclus par le programme DIM_GLOBAL_LOCAL.bas chaine_superpose: rem l'instruction @REMPLACE(10,"texte") met le texte en superposition de l'ancien' rem =>> @REMPLACE$(10,"texte") => texte est le texte de substitution if chaine_l%>0 if chaine_l%=1 if len(chaine$)> len(chaine_r$) chaine$=chaine_r$+mid$(chaine$,len(chaine_r$)+1,900) else chaine$=chaine_r$ end_if else if chaine_l% + len(chaine_r$) => len(chaine$) chaine$=left$(chaine$,chaine_l%)+chaine_r$ else chaine$=left$(chaine$,chaine_l%-1) + chaine_r$ + mid$(chaine$,chaine_l%+len(chaine_r$)+1,900) end_if end_if else message "erreur, impossible de remplacer le texte, la position doit-être supérieur à zéro" end_if return ' ===================================================================== chaine_del: rem supprime x caractères depuis la position @DEL(10,2) 10=position 2: 2 caractères à enlevés if len(chaine$)>chaine_l%+chaine_r% if chaine_l%>0 and chaine_r%>0 chaine$=left$(chaine$,chaine_l%-1)+mid$(chaine$, chaine_l% + chaine_r% ,900) else if chaine_l%>0 chaine$=left$(chaine$,chaine_l%) else message "erreur premier paramètre plus petit que 1":stop end_if end_if else if chaine_l%>len(chaine$) then message "erreur, les caractères à supprimer hors limite de la chaine":' on laisse end_if return ' ===================================================================== chaine_trouve: rem chaine_index%=3 : chaine_txt%=-1:chaine_txt$= "|" : gosub chaine_trouve if chaine_index%>-1 :' index nombre comme 3 chaine_l%=chaine_index% else chaine_index%= chaine_l% end_if ' partie séparateur récupérée rem on commence la recherche chaine_copie$=chaine$ :chaine_choix%=0 repeat v%=instr(chaine_copie$,chaine_txt$) if v%>0 then chaine_trouve$=left$(chaine_copie$,v%-1):chaine_choix%=chaine_choix%+1: chaine_copie$=mid$(chaine_copie$,v%+1,900)
if chaine_choix%=chaine_index% then exit_repeat message str$(chaine_choix%)+chr$(13)+chaine_trouve$ :' repeat:until scancode=32 or scancode=27:wait 200 until v%=0 or scancode=27 or chaine_copie$="" if chaine_copie$="" then message "dépassement d'index dans la fonction:"+chr$(13) +str$(chaine_l%)+" par rapport à "+str$(chaine_choix%) :chaine_trouve$="" message chaine_trouve$ rem information de retour est: chaine_trouve$ return ' ===================================================================== chaine_index: ' dlist 9949 pour indexé (mettre une list horizontal, verticalement) clear 9949 :chaine_copie$=chaine$ if chaine$<>"" if instr(chaine$,chaine_txt$)=0 item_add 9949,chaine$ else repeat v%=instr(chaine_copie$,chaine_txt$) if v%>0 chaine_trouve$=left$(chaine_copie$,v%-1): chaine_copie$=mid$(chaine_copie$,v%+1,900) item_add 9949,chaine_trouve$ end_if until v%=0 or chaine_copie$="" or scancode=27 if chaine_copie$<>"" then item_add 9949,chaine_copie$ end_if end_if chaine_marque$=chaine_txt$: ' récupération du séparateur pour refaire chaine une fois la liste modifiée return ' ==================================================================== chaine_index_repere: if chaine_index%<1 or chaine_index%> count(9949) then message "erreur, valeur index:"+str$(chaine_index%)+" nombre éléments:"+str$(count(9949)):stop chaine_txt$=item_read$(9949,chaine_index%) return ' ==================================================================== chaine_index_modifie: rem @INDEX_MODIFIE(2,"abricot") chaine_index%,chaine_txt$ if chaine_index%>0 and chaine_index%<=count(9949) item_delete 9949,chaine_index% item_insert 9949,chaine_index%,text$(9940) end_if return ' ==================================================================== chaine_liste_choix: chaine_index%=item_index(9949):text 9940,item_index$(9949) return chaine_liste_go: if chaine_index%>0 and chaine_index%<=count(9949) and checked(9945)=1 then item_insert 9949,chaine_index%,text$(9940) if chaine_index%>0 and chaine_index%<=count(9949) and checked(9944)=1 then item_add 9949,text$(9940) if chaine_index%>0 and chaine_index%<=count(9949) and checked(9946)=1 then item_delete 9949,chaine_index% if chaine_index%>0 and chaine_index%<=count(9949) and checked(9943)=1 item_delete 9949,chaine_index% :item_insert 9949,chaine_index%,text$(9940) end_if mark_on 9942 :chaine_l%=0:chaine_r%=0 if left$(chaine$,1)=chaine_marque$ then chaine_l%=1 if right$(chaine$,1)=chaine_marque$ then chaine_r%=1 chaine$="":if chaine_l%=1 then chaine$=chaine_marque$ for v%=1 to count(9949):chaine$=chaine$+item_read$(9949,v%) if v%<count(9949) then chaine$=chaine$+chaine_marque$ next v%:if chaine_r%=1 then chaine$=chaine$+chaine_marque$ return ' ==================================================================== chaine_liste:
return ' ==================================================================== chaine_liste_ferme: message "on ferme" : hide 9948 :active 0 return ' ==================================================================== ' ====================================================================
si vous les listez tous les deux, vous verrez que ce n'est pas la même chose. ensuite sur ce programme de teste: - Code:
-
dim a$,b$,chaine$ hide 0
a$="je suis ici et je suis là" b$="par là" :b%=4 @chaine(a$) @remplace(b%,"par là") message chaine$ b%=4 @del(b%,2) @CHAINE("lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche|") b$="|" :b%=2:' pour tester @TROUVE le séparateur @trouve(b%,b$) @INDEX(b$) @CHAINE("poireau/pomme de terre/chou/radis/salade/betterave") @INDEX("/") c%=6 @INDEX_REPERE(c%) message "@INDEX_REPERE(6)="+chaine_txt$
@INDEX_MODIFIE(2,b$) @INDEX_REPERE(2) message "@INDEX_REPERE(2)="+chaine_txt$
@INDEX_LISTE(200,300) @INDEX_LISTE(center) message chaine$ end ' restera le traitement des index del insert trouve ' nombre numerique dans une chaine ' ==================================================================== fin: terminate C'est la partie programme. Je n'est fait que lister des fonctions pour les mettre au point au fur et à mesure. @Chaine(a$ ) sert à prendre en considération la variable a$. Dorénavant chaine$ devient a$, et le restera jusqu'à une nouvelle instruction @chaine. Remarque on peux écrire: @CHAINE(a$) ou @CHAINE("ceci est un texte"). Les instructions s'écrivent en majuscule ou minuscule, mais surtout: une seule instruction par ligne car chaque ligne d'instruction va être effacée, et remplacée. @remplace(b%,"par là") @REMPLACE(b%,"par là" ) C'est n'importe quoi, ce ne sont que des testes. B% est la position de texte par rapport à celui de chaine$ (on peut mettre une variable ou un nombre) , et le texte remplacera celui qui est en dessous. @del( b%,2 ) enlève à partir de la position b%, 2 caractères. (franchement, je ne suis pas sur qu'il s'agit d'un mot-clé important. @CHAINE("lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche|") b$="|" :b%=2:' pour tester @TROUVE le séparateur on redéfini une chaine, et on dit que b$="|". Il va servir de séparateur. Ceci a été fait pour remplacer instr() qui n'a pas le décalage pour aller au séparateur suivant. Et j'ai fais plus, vu qu'il suffit de donner un numéro, et on prend l'élément complet entre deux séparateurs. dans le cas présent: l'élément 1 est "lund", l'élément 5 est "vendredi". Une chose pour cette instruction, il faut que je fasse un teste d'erreur, lorsque le nombre est supérieur aux élément (comme count()). @INDEX( b$ ) a pour fonction de mettre en liste chaine$, et chaque élément est définit par le séparateur qui est ici b$, mais qui peur aussi être "|", une chaine. @INDEX_REPERE( c% ) retrouve le ème élément de la chaine qui est devenu une liste. @INDEX_MODIFIE(2,b$) remplace le 2ème élément par le nouveau @INDEX_LISTE(200,300) et @INDEX_LISTE(center) montre une fenêtre avec la liste et des commandes : Il ne reste plus que le programme. Celui-ci devra avec Panoramic est éxécutable, et le chemin devra être mis dans le programme teste en haut, et pour les nouveaux: (pas de nom avec des espaces dans les dossiers et celui du programme: EXECUTE ne fonctionnerait pas. - Code:
-
' Programme outils permettant de programmer avec de variables dynamiques et aussi locales ' hide 0 form 10:width 10,500:height 10,100:left 10,screen_x/2-250:top 10,screen_y/2-50 ALPHA 29:parent 29,10:font_size 29,10:top 29,20:left 29,30:font_bold 29 ' -----------------------------------------------------------------------------------+ dim f$,fichier_include$ ,fichier_aide$ :' | fichier_include$="C:\TESTE\PROCEDURE\DIM_Global_Local\FONCTIONS-CHAINE.bas":' | le chemin include f$ = clipboard_string_paste$ :' | récupère chemin prg.bas fichier_aide$ = "C:\TESTE\AIDE_PANORAMIQUE\liste_des_fiches.txt" :' | vient du lien de Jack :' | ' ----------------------------------------------------------------------------------+
' Pour les includes width 0,600:height 0,420 :top 0,000 :caption 0,"Dépileur d'include"
error_french dim a%,b%,c%,d%,g%,a$,b$,c$,d$,v% ,pref$ ,lig_b% ,flag_efface%, lig_a% ,mot$,local$, nb% ,A ,B ,C ,D ,E ,F ,G ,H dim caption_form$ , clear_dim% , ligne% ,ligne$,instruction$,separe$,a1$,v1% ,flag_prg% dim flag_guil% ,prefix$ , chaine$ ,chaine_r% dim Fonction_chaine% , chaine_l$ , chaine_r$ , chaine_m$ , chaine_l% ,result$ ,result dim e$,chaine_Fonction$ ,variable$ ,double_cote$ ,cote_chaine$, cote_simple$ , chaine_index$ ,chaine_txt$,chaine_txt% dim g_open$ : g_open$=" "+chr$(34) dim g_close$ : g_close$= chr$(34) +" " dim handll% , res% ,etiquette$ ,etiq% etiquette$="label " double_cote$=" "+chr$(34)+chr$(34)+" " :cote_chaine$=" "+chr$(34)+"chaine$"+chr$(34)+" " :cote_simple$=" "+chr$(34)+" "
label control , control0 ,controlform0 , sort_repeat , sort_next , chaine ,chaine_liste label chaine_superpose , controle_variables ,sortie_fin , chaine_del , chaine_trouve, chaine_index label chaine_index_modifie , chaine_index_repere data Un,Deux,Trois,Quatre,Cinq,Six,Sept,Huit,Neuf,Dix
separe$=" <>=,:/*-+()"+chr$(34) : prefix$="²" A=21 : B=22 : C=23 : D=24 : E=25 : F=26 : G=27 : H=28 : ' numéro pour être repris dans un autre programme memo A: width A,screen_x-400:height A,860:font_size A,12 :font_name A,"Bistream Vera Sans Mono" memo B:hide B memo H:hide H :' width H,screen_x/2-10:height H,560:font_size H,12:left H,screen_x/2 dlist C
file_load A, f$ :' c'est le fichier du presse papier, mais pour la mise au point, et éviter de faire un ' exécutable à chaque modification, je charge le fichier teste_chaine.bas à la ligne 47 ' qui est un programme ayant les instructions de FONCTION CHAINE ' file_load A,"C:\TESTE\M_au _P_TRACE\teste prg.bas" :' sert pour les testes en direct ' file_load A,"C:\TESTE\PROCEDURE\DIM_Global_Local\teste prg.bas" ""
' file_load A,"C:\TESTE\teste_chaine.bas" :' pour les essais du programme caption 29,"Patientez! re-définition des variables" for a%=1 to 10:read a$:item_add C,a$:next a% dlist E:' top E,570:height E,300:left E,screen_x-250:width E,240 :font_size E,10 dlist F:' top F,570:height F,300:left F,screen_x-400 :width F,140 :font_size F,10 dlist G memo 2:bar_horizontal 2 :full_space 2 memo 3:bar_horizontal 3 :width 3, width(0)-30:font_size 3,12:top 3,100 memo 5:full_space 5:font_size 5,12:font_bold 5 bar_horizontal A:bar_horizontal B dll_on "C:\TESTE\KGF\KGF.dll" res% = dll_call2("WindowTopMost",handle(0),1) :' me permet de voir l'état des variables pendant la mise au pt. a%=1 :nb%=0 :' en ayant une petite fenètre ouverte par dessus.
' ------------------------------------------------------- ' on retire les lignes du programme qui chargent celui-ci (VOIR LES INSTRUCTIONS) repeat a$=upper$(trim$(item_read$(A,1))) item_delete A,1 a%=a%+1 until a$="END" or a%>8 if a%>9 then message "on stop, ne trouve pas de 'end' dans les premières lignes":terminate ' ------------------------------------------------------- dlist 1:file_load 1,fichier_aide$ :' vient du lien que Jack avait fourni (les fiches) for a%=1 to count(1) : b$=item_read$(1,a%) ' on retire la fin si il y a des parenthèses, autrement la fonction est prise pour une variable ' nota, les dernières instructions ne sont pas dedans if instr(b$,"(")>0 then b$=left$( b$, instr(b$,"(") -1):item_delete 1,a%:item_insert 1,a%,b$ next a% for a%=1 to count(1) instruction$=instruction$+ item_read$(1,a%)+" " next a% ' rajout des instructions qui ne sont pas fichées. instruction$=instruction$+"INCLUDE FICHE TO LOCAL CHAINE( REMPLACE(" :' on rajoute ici les instructions qui manquent
' DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT DEBUT ligne%=1 : nb%=0 repeat a$=item_read$(A,ligne%) :a$=rtrim$(a$) if instr(trim$(a$),"LOCAL>") > 0 a$=trim$(a$) :flag_efface%=1 caption_form$=mid$( trim$(a$) ,instr(a$ ,"LOCAL>")+6,100):caption_form$=left$(caption_form$, len(caption_form$)-1) if left$(caption_form$,1)=chr$(34) then caption_form$= mid$(caption_form$,2,300) if right$(caption_form$,1)=chr$(34) then caption_form$=left$(caption_form$,len(caption_form$)-1) item_delete C,1:item_insert C,1,caption_form$ goto sort_repeat end_if ' --------------------------------------------- if left$(trim$( upper$(a$)) ,8) ="#INCLUDE" ' INCLUDE INCLUDE INCLUDE INCLUDE INCLUDE INCLUDE INCLUDE INCLUDE INCLUDE INCLUDE local$="" :clear_dim%=0 : nb%=nb%+1 v%=instr( upper$(a$),"#INCLUDE") c$=mid$( a$,v% +9,80 ) :c$=trim$(c$) :' chemin complet de l'include if left$(c$,1)=chr$(34) then c$=mid$(c$,2,80) item_add B,"' #" + str$(nb%) + " dépilé: " + trim$(a$) lig_b% = count(B) : lig_a% = ligne% item_delete A,lig_a% file_add B,c$ :' on rajoute le fichier include après avoir détruit #INCLUDE chemin\prg.bas
while lig_b%<=count(B) a$=item_read$(B,lig_b%) : gosub control if flag_efface%=0 then item_insert A,lig_a%,a$ :lig_a%=lig_a%+1 :' supprime les commandes sup item_delete B,lig_b% :' avec flag_efface%=1 end_while local$="" :caption_form$=item_read$(C,1) :' on récupère le préfixe du programme normal else ' PROGRAMME PROGRAMME PROGRAMME PROGRAMME PROGRAMME PROGRAMME PROGRAMME PROGRAMME clear_dim%=0 : gosub controlform0 sort_repeat: item_delete A , ligne% :if flag_efface%=1 then ligne%=ligne%-1 if flag_efface%=0 then item_insert A,ligne%,a$ flag_efface%=0 end_if ligne%=ligne%+1 local$="" until ligne%> count(A) ' ///////////////////////////////////////////////////// ' fin de traitement. On insert tous les dim(s)
if count(E)>0 a$="dim " : b%=2 :' b%= ligne d'insertion dans A , on insert en ligne 2 au départ for g%=1 to count(E) a$=a$+item_read$(E,g%) if g%/8=int(g%/8) item_insert A,b%,a$:a$="":b%=b%+1:if g%<count(E) then a$="dim " else a$=a$+" , " end_if next g%:if a$<>"" then a$=left$(a$,len(a$)-2) if a$<>"dim " and a$<>"" then item_insert A,b%,a$:b%=b%+1
end_if
if count(F)>0 a$="dim " for g%=1 to count(F) a$=a$+item_read$(F,g%) if g%/8=int(g%/8) item_insert A,b%,a$:a$="":b%=b%+1:if g%<count(F) then a$="dim " else a$=a$+" , " end_if next g%:if a$<>"" then a$=left$(a$,len(a$)-2) if a$<>"dim " and a$<>"" then item_insert A,b%,a$ end_if
if Fonction_chaine%=1 ' -------------------------------------+ file_load B,fichier_include$ :' | ' -------------------------------------+ lig_a%=1 for a%=1 to count(B) if a%<23 item_insert A,lig_a%,item_read$(B,a%):lig_a%=lig_a%+1 else item_add A,item_read$(B,a%) end_if next a%
if right$(etiquette$,1)="," then etiquette$=left$(etiquette$,len(etiquette$)-1):item_insert A,3,etiquette$ clear B:item_add B,"a$":item_add B,"b$":item_add B,"ligne$":item_add B,"chaine_l$" item_add B,"chaine_m$":item_add B,"ligne%":item_add B,"chaine$":item_add B,"chaine_l%":item_add B,"chaine_marque$" item_add B,"chaine_Fonction$":item_add B,"chaine_r$":item_add B,"chaine_r%":item_add B,"variable$" item_add B,"chaine_index%":item_add B,"chaine_txt$":item_add B,"chaine_index$":item_add B,"chaine_trouve$" item_add B,"chaine_copie$":item_add B,"v%":item_add B,"chaine_choix%":item_add B,"chaine_txt%":item_add B,"i%"
for a%=1 to count(B) : a$=item_read$(B,a%) for b%=1 to count(E):if item_read$(E,b%)=a$ then exit_for next b% if b%> count(E) then item_add F,a$ next a% a$="dim " for a%=1 to count(F):a$=a$+item_read$(F,a%) if a%<count(F) then a$=a$ +"," next a% item_insert A,2,a$ end_if
hide 10 ' stop file_save A,"C:\temp\Panoramic.bas" :' pour récupérer le programme décodé file_save E,"C:\temp\dim.txt" :' pour voir toutes les variables chain "C:\temp\Panoramic.bas" dll_off stop END ' ==================================================================== ' END END END END END END END END END END END END END END END END END END END END END ' END END END END END END END END END END END END END END END END END END END END END
controlform0: ' pour la forme 0 pref$=caption_form$ flag_prg%=0 goto control0 return ' ==================================================================== control: flag_efface%=0 :flag_prg%=1 pref$=item_read$(C,nb%) :clear G control0: ' partie recherche dim et variables globales if instr(trim$(a$),"PREFIXE>")> 0 a$=trim$(a$) :flag_efface%=1 prefix$= mid$( a$,instr( a$,"PREFIXE>")+8,1) if instr("²^°~&§|{}[]",prefix$)=0 message "préfixe choisi interdit! "+prefix$+chr$(13)+"seule les préfixes suivants sont possible: ² ^ ° ~ & § | { } [ ]"+chr$(13)+"arrêt du programme pour le modifier!":terminate end_if a$="" end_if
if left$(pref$,1)="|" then pref$=upper$( mid$( pref$,2,1)) + lower$( mid$( pref$,3,100)) ligne$=trim$(a$) if left$(a$,1)<> " " then a$=" "+a$
if instr( a$ , "FICHE>" ) > 0 and instr( a$ , "FICHE><" ) =0 b$=mid$( a$, instr(a$,"FICHE>")+6,100) local$=left$( b$,instr(b$,"<")-1) if left$(local$,1)="|" local$= upper$( mid$( local$,2,1)) + lower$( mid$( local$,3,100) ) else local$="_"+local$:if local$="_" then local$="" end_if a$="" :flag_efface%=1 ligne$="" end_if
' ========== if left$(ligne$,1)="@" ' -------------------------------- if upper$(left$(ligne$,8))="@CHAINE(" Fonction_chaine%=1 :rem pour inclure au programme la partie décodage des chaines, à la fin ' on rajoutera cette procédure à la fin pour éviter de la visiter le temps du décodage gosub chaine :goto sortie_fin end_if ' -------------------------------- if upper$(left$(ligne$,10))="@REMPLACE(" gosub chaine_superpose :goto sortie_fin end_if ' -------------------------------- if upper$(left$(ligne$,5))="@DEL(" gosub chaine_del :goto sortie_fin end_if ' -------------------------------- if upper$(left$(ligne$,8))="@TROUVE(" gosub chaine_trouve:goto sortie_fin end_if ' -------------------------------- if upper$(left$(ligne$,14))="@INDEX_REPERE(" gosub chaine_index_repere:goto sortie_fin end_if ' -------------------------------- if upper$(left$(ligne$,15))="@INDEX_MODIFIE(" gosub chaine_index_modifie: goto sortie_fin end_if ' --------------------------------
if upper$(left$(ligne$,13))="@INDEX_LISTE(" gosub chaine_liste:goto sortie_fin end_if ' -------------------------------- if upper$(left$(ligne$,6 ))="@INDEX" gosub chaine_index:goto sortie_fin end_if ' -------------------------------- ' -------------------------------- end_if ' ========== if ligne$<>"" repeat v%=instr(ligne$,chr$(34)) if v%>0 a1$=mid$(ligne$,v%+1,500) v1%=instr(a1$,chr$(34)) if len(a1$)>v1% ligne$=left$(ligne$,v%-1)+mid$(a1$,v1%+1,300) else ligne$=left$(ligne$,v%-1):if right$(ligne$,1)=":" then ligne$=left$(ligne$,len(ligne$)-1):' c'est pas un label end_if end_if until v%=0 or scancode=27 :if scancode=27 then end
' on retire les rem, on sait que maintenant elles ne sont plus dans les chaines, vu que retirées. if instr(ligne$,"'")>0 then ligne$=left$(ligne$,instr(ligne$,"'")-1) :if right$(trim$(ligne$),1)=":" then ligne$=left$(trim$(ligne$),len(trim$(ligne$))-1) if instr(upper$(ligne$),"REM")>0 then ligne$=left$(ligne$,instr(upper$(ligne$),"REM")-1)
' reste à retirer les labels
if len(ligne$)>1 b$=left$(trim$(ligne$),len(trim$(ligne$))-1) if trim$(right$(ligne$,1))=":" if instr( b$,":")=0
' c'est un label ou alors erreur, mais ici c'est pas le problème pas d'analyse! ligne$="" else for a%=len(ligne$)-1 to 1 step -1: if mid$(ligne$,a%,1)=":" then ligne$=left$(ligne$,a%-1):exit_for next a% ligne$=left$(ligne$,a%-1) end_if end_if end_if ' il reste les goto et les gosub if instr(upper$(ligne$),"GOSUB")>0 then ligne$=left$(ligne$ ,instr( upper$(ligne$),"GOSUB")-1) if instr(upper$(ligne$),"GOTO")>0 then ligne$=left$(ligne$ ,instr( upper$(ligne$),"GOTO")-1)
' reste les lignes label:
if instr(upper$(ligne$),"LABEL ") >0 v%=instr( upper$( ligne$),"LABEL"):b$=mid$( ligne$,v%+7,300):v1%=instr(ligne$,":") if v1%>0 b$=mid$(b$,v1%+1,300) if v%>1 then ligne$=left$(ligne$,v%-1):else :ligne$="" else b$="" if v%>1 ligne$=left$(ligne$,v%-1) else ligne$="" end_if end_if ligne$=ligne$+b$ end_if
' reste dim if instr(upper$(ligne$),"DIM ") >0 v%=instr( upper$( ligne$),"DIM"):b$=mid$( ligne$,v%+5,300):v1%=instr(ligne$,":") if v1%>0 b$=mid$(b$,v1%+1,300) if v%>1 then ligne$=left$(ligne$,v%-1):else :ligne$="" else b$="" if v%>1 ligne$=left$(ligne$,v%-1) else ligne$="" end_if end_if ligne$=b$ if flag_prg%=0 item_delete A,ligne%:item_insert A,ligne%,ligne$:a$=ligne$ else item_delete B,lig_B%:item_insert B,lig_B%,ligne$:a$=ligne$:lig_B%=lig_B%+1 end_if end_if ' -----pour éviter qu'un ON_CLIK ON_CHANGE ON_TIMER qui ont un label soient pris comme variable----- if instr(upper$(ligne$),"ON_")>0 b$=mid$(ligne$,instr(upper$(ligne$),"ON_"),300):b$=mid$(b$,instr(b$,",")+1,300) for a%=1 to len(b$): if instr(separe$, mid$(b$,a%,1))>0 then exit_for next a% ligne$=left$( ligne$,instr(upper$(ligne$),"ON_")-1) + mid$(b$,a%,300) end_if ' --------------------DATA------------------------------------------------- if left$(upper$(ligne$),5)="DATA " then ligne$="" ' ----------RECHERCHE DES VARIABLES QUI SONT LE RESTE APRES AVOIR ENLEVER LES INSTRUCTIONS----------
repeat for a%=1 to len(ligne$) b$=mid$(ligne$,a%,1) : v%= instr(separe$ , b$) if v%>0 b$=mid$(separe$,v%,1) v%=instr(ligne$,b$) c$=trim$(left$(ligne$,v%-1)) if instr(prefix$+"#",left$(c$,1))=0 if numeric(trim$(c$))=0 :' on évite les nombres ' apparemment ça marche mais je ne suis pas sur que l'espace soit logique pour tous les cas? b%=instr(instruction$," "+upper$(c$)) :item_add H,upper$(c$) + " b%="+str$(b%) if b%=0 if c$<>"" and left$(c$,1)<>"|" if count(E)>0 for b%=1 to count(E) : if c$=item_read$(E,b%) then exit_for next b% if b%>count(E) then item_add E,c$ else item_add E,c$ end_if end_if end_if end_if end_if exit_for end_if next a% if v%+1<len(ligne$) then ligne$=trim$(mid$(ligne$,v%+1,500)) :else :exit_repeat until v%=0 or scancode=27
' ' partie dépileur d'include et traitement des variables locales if instr(a$ , "FICHE_><")>0 then local$="" :flag_efface%=1 :' préfixe suplémentaire annulé if instr(a$ , "FICHE_CLEAR")>0 then local$="":flag_efface%=1 :' préfixe suplémentaire annulé ' ------------------------------------------------------------------------------------ if instr(a$,prefix$)>0 flag_guil%=0 for b%=len(a$) to 1 step -1 if b%>1 b$=mid$(a$,b%-1,1) else b$="" end_if
if b% >1 if mid$(a$,b%-1,2)=prefix$+prefix$ a$=left$(a$,b%-1)+ mid$(a$,b%+1,300):b%=b%-1:goto sort_next end_if end_if c$=mid$(a$,b%,1) if c$=prefix$ and instr(" :,(/*-+=<>"+chr$(34),b$) >0 :' séparateurs ouvrants
b$=mid$(a$,b%,300) :' message a$+chr$(13)+ b$ for c%=1 to len(b$) if instr(" :,)/*-+=<>"+chr$(34),mid$(b$,c%,1))>0 then exit_for next c% mot$= mid$(b$,2,c%-2) :' on récupère l'ancienne variable sans prefix$ b$=pref$+local$+"_" + mot$ if count(E)>0 for c%=1 to count(E) if b$=item_read$(E,c%) then exit_for next c% if c%> count(E) then item_add E,b$ else if flag_guil%=0 then item_add E,b$ end_if a$=left$(a$,b%-1)+ b$ + mid$(a$,len(mot$)+b%+1,200) end_if sort_next: next b% end_if end_if sortie_fin: return rem ============================================================= rem .============================================================= rem .===============================PARTIE FONCTION CHAINE============= rem .============================================================= rem .============================================================ chaine: clear 2 :variable$="" ligne$=trim$(a$) : b$=ligne$ ligne$=left$(ligne$,len(ligne$)-1):chaine$=mid$(ligne$,9,900) if right$(ligne$,1)=chr$(34) if right$(chaine$,1)=chr$(34) then chaine$=lef$(chaine$,len(chaine$)-1) a$="chaine$="+ g_open$ + chaine$ + g_close$ +" :rem "+b$ else if right$(chaine$,1)<>"$" then message "erreur dans: "+b$+chr$(13)+"variable incorrect":stop a$="chaine$ = " + chaine$ + " :rem "+b$ end_if return ' =================================================================== chaine_superpose: rem l'instruction @REMPLACE(10,"texte") met le texte en superposition de l'ancien' rem =>> @REMPLACE(10,"texte") => texte est le texte de substitution
chaine_l$=mid$(ligne$,11,900) : chaine_m$ = trim$(left$(chaine_l$, instr(chaine_l$,",")-1)) chaine_r$=mid$( chaine_l$, instr( chaine_l$,",")+1,900) chaine_r$=left$(chaine_r$, len(chaine_r$)-1) ' position du curseur: if numeric(chaine_m$)=1 :' nombre chaine_l$="chaine_l%="+ chaine_m$ :' semble bizarre, en réalité on va lire directement un nombre. else if right$(chaine_m$,1)="$" then message "erreur dans: "+ligne$+chr$(13)+"attente d'un nombre ou d'une variable numérique pour le 1er paramètre":stop chaine_l$="chaine_l%="+chaine_m$ :' en réalité chaine_m$ est le nom d'une variable numérique end_if ' partie texte ou variable texte chaine_txt$=mid$(ligne$, instr(ligne$,","),900) if instr(chaine_txt$,chr$(34))>0 chaine_txt$="chaine_r$="+g_open$ + chaine_r$ + g_close$ else if right$(chaine_r$,1)<>"$" then message "erreur dans "+ligne$+chr$(13)+"attente d'un texte ou d'une variable string dans le 2ème paramètre": top chaine_txt$="chaine_r$="+chaine_r$ end_if a$=chaine_l$+" : "+chaine_txt$ + " : gosub chaine_superpose : ' "+ligne$ return ' ==================================================================== chaine_del: rem @DEL(4,2) ' il faut voir le premier paramètre. ligne$=trim$(a$) :a$=ligne$: ligne$=left$(ligne$, len(ligne$)-1) chaine_l$=mid$(ligne$,6,100):chaine_l$=left$(chaine_l$,instr(chaine_l$,",")-1) chaine_r$=mid$(ligne$, instr(ligne$,",")+1,100)
rem paramètre de gauche, qui est la position de départ pour enlever if numeric(chaine_l$)=0 :' est une variable if right$(chaine_l$,1)="$" then message "erreur dans: "+a$+"+chr$(13)+"variable non valide 1er paramètre":stop end_if chaine_txt$="chaine_l%="+chaine_l$
rem paramète de droite, qui est le nombre de caractères à enlever if numeric(chaine_r$)=0 :' est une variable if right$(chaine_r$,1)="$" then message "erreur dans: "+a$+"+chr$(13)+"variable non valide 2ème paramètre":stop end_if chaine_txt$ = chaine_txt$ + " : chaine_r%="+chaine_r$ +" : gosub chaine_del :' " + a$ a$=chaine_txt$ return ' ==================================================================== ' variables:chaine$,chaine_l$,chaine_r$,chaine_m$,double_cote$,cote_chaine$,chaine_fonction$ ' ==================================================================== clear 5 ligne$=trim$(a$) :ligne$=left$(ligne$,len(ligne$)-1):chaine_r$=mid$(ligne$,instr(ligne$,",")+1,900):chaine_txt%=0 chaine_l$=mid$(ligne$, instr(ligne$,"(")+1,100):chaine_l$ =left$(chaine_l$,instr(chaine_l$,",")-1) ' --------------PARTIE INDEX--------------------------------------------------------------- ' d'abord le nb qui est l'index if numeric(chaine_l$)=1 chaine_index$="chaine_index%="+ chaine_l$ else if right$(chaine_l$,1)="$" then message "erreur dans:"+ligne$+"), "+chaine_l$+chr$(13)+" doit une une variable numerique":stop chaine_index$="chaine_index%=-1:chaine_l%="+chaine_l$ :' ok c'est bon end_if rem gosub controle_variables :stop ' --------------PARTIE TXT-------------------------------------------------------------------- if right$(ligne$,1)=chr$(34) then chaine_txt%=-1 ' maintenant le séparateur if chaine_txt%=-1 :' donc "|" chaine_txt$="chaine_txt%=-1:chaine_txt$="+ g_open$ + chaine_r$ + g_close$ else rem dans ce cas, on a une variable string ' est-ce que chaine_r$ est le nom de la variable? chaine_txt$="chaine_txt$="+chaine_r$ end_if a$=chaine_index$ +" : "+chaine_txt$ +" : gosub chaine_trouve" return ' ==================================================================== chaine_index: ligne$=trim$(a$):chaine_l$=trim$(mid$(ligne$,8,100)):chaine_l$=left$(chaine_l$,len(chaine_l$)-1) chaine_txt%=0: if instr(ligne$,chr$(34))>0 then chaine_txt%=-1 if chaine_txt%=-1 :' "|" chaine_txt$="chaine_txt$=" +g_open$ + chaine_l$ + g_close$ else if right$(chaine_r$,1) <>"$" then message "erreur dans: "+ligne$+chr$(13)+"nim de variable incorrect":stop chaine_txt$="chaine_txt%=-1:chaine_txt$="+ chaine_r$ end_if a$=chaine_txt$+" : gosub chaine_index :' "+ligne$ return ' ==================================================================== chaine_index_repere: rem @INDEX_REPERE(3) ligne$=trim$(a$) : ligne$=left$(ligne$,len(ligne$)-1):ligne$=mid$(ligne$, instr(ligne$,"(")+1,100) if numeric(ligne$)=0 and right$ (ligne$,1)="$" then message "erreur dans:"+a$+chr$(13)+"variable invalide ligne":stop chaine_txt$="chaine_index%="+ligne$+" : gosub chaine_index_repere : ' "+trim$(a$) a$= chaine_txt$ return ' ==================================================================== chaine_index_modifie: rem @INDEX_MODIFIE(b%,"texte" ligne$=trim$(a$) : ligne$=left$(ligne$,len(ligne$)-1):ligne$=mid$(ligne$, instr(ligne$,"(")+1,900) chaine_l$=left$(ligne$,instr(ligne$,",")-1) : chaine_r$=mid$(ligne$,instr(ligne$,",")+1,900) rem paramètre de gauche le numéro if numeric(chaine_l$)=0 and right$(chaine_l$,1)="$" then message "erreur dans:"+a$+chr$(13+"variable invalide 1er paramètre" if numeric(chaine_l$)=1 then if val(chaine_l$)<1 then message "erreur dans"+a$+chr$(13)+"variable invalide plus petite que 1":stop chaine_index$="chaine_index%=" + chaine_l$ rem 2ème paramètre, le texte if right$(chaine_r$,1)="$" chaine_txt$="chaine_txt$="+chaine_r$ else chaine_txt$ ="chaine_txt$=" + g_open$ + chaine_r$ + g_close$ end_if a$=chaine_index$+" : " + chaine_txt$ + " : gosub chaine_index_modifie :' "+a$ return ' ==================================================================== chaine_liste: rem @INDEX_LISTE(left,top) ou center ligne$=trim$(a$) :b$=ligne$: ligne$=left$(ligne$,len(ligne$)-1) : ligne$=mid$(ligne$,14,900) if instr( lower$(ligne$),"center")>0 a$="left 9948,screen_x/2-150:top 9948,screen_y/2-80:show 9948:to_foreground 9948" else chaine_l%=screen_x/2-150 : chaine_r%=screen_y/2-80: ' valeur par défaàut si erreur if instr(ligne$,",")>0 chaine_l$=left$(ligne$,instr(ligne$,",")-1):if numeric(chaine_l$)=1 then chaine_l%=val(chaine_l$) chaine_r$=mid$(ligne$,instr(ligne$,",")+1,100):if numeric(chaine_r$)=1 then chaine_r%=val(chaine_r$) a$="left 9948,"+str$(chaine_l%) + " : top 9948,"+ str$(chaine_r%)+" :show 9948 " end_if end_if etiq%=etiq%+1 a$=a$+":on_click 9948,label_list"+str$(etiq%)+ " :on_click 9939,label_list"+str$(etiq%)+":end :label_list"+str$(etiq%)+":" etiquette$=etiquette$+" label_list"+str$(etiq%)+"," item_insert A,ligne%+1, "if clicked(9939)=1 or clicked(9948)=1 then gosub chaine_liste_ferme" gosub controle_variables return ' ==================================================================== controle_variables: ' clear 5 item_add 5,"chaine_l$ chaine_m$ chaine$ chaine_l% chaine_Fonction$ chaine_r$ chaine-r% variable$ chaine_index% chaine_index$ chaine_modifie chaine_repere" item_add 5,"" item_add 5,"a$="+a$ item_add 5,"b$="+b$ item_add 5,"ligne$="+ligne$ item_add 5,"chaine_l$="+chaine_l$ +" len:"+str$( len(chaine_l$)) item_add 5,"chaine_r$="+chaine_r$ item_add 5,"chaine_r$, len:"+str$(len(chaine_r$)) item_add 5,"chaine_m$="+chaine_m$ item_add 5,"chaine$ ="+chaine$ item_add 5,"chaine_Fonction$="+chaine_Fonction$ item_add 5,"b$="+b$ item_add 5,"chaine_l%="+str$(chaine_l%) item_add 5,"chaine_txt$="+chaine_txt$ item_add 5,"chaine_txt%="+str$(chaine_txt%) item_add 5,"chaine_index$="+chaine_index$ if scancode=27 then stop return J'espère que cela va aller, je ne sais pas pourquoi, mais j'écris sur 2 fois la largeur d'écran, et je ne vois pas tout. J'espère que la présentation finale aura une autre allure. Il y a le fichier aide que j'ai mis sur l'autre poste, mais il y a aussi le programme de Klaus pour lister les commandes (en évitant les repère de début et les parenthèses. Si c'est nécessaire, je remettrais le fichier que j'ai mis pour variables locales et globales. A ce propos, pour l'instant les variables locales pour cette partie, ne sont pas visitées par le programme. Une difficultés à la fois! Désolé.
Dernière édition par cosmos70 le Dim 5 Déc 2010 - 19:47, édité 1 fois |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Fonctions Chaine et variables locales Sam 4 Déc 2010 - 19:02 | |
| Dans ton image, pourquoi tu as une ligne vide entre poireau et le reste ?
| |
| | | Invité Invité
| Sujet: Re: Fonctions Chaine et variables locales Sam 4 Déc 2010 - 20:14 | |
| Effectivement il y a un problème. Cela vient d'abord de ma façon de tester. A chaque fois je fais plusieurs appels. Un coup dans une commande, je mets une variable un coup je mets un texte, et je vais des aller/retour, sans me préoccuper de la logique. La seule chose que je regardais, était le code de retour, et non le programme. Cela dit, il y a peut-être un problème logique. Je regarderais un peu plus tard, en tout cas rapidement.
Moi la seul chose que je regardais c'était le code que le programme avait généré. Dans le cas présent, b$, s'set retrouvé avec "/" qui était un séparateur. Je faut quand même que vérifie.
Comment se fait-il que j'écris sur cette largeur, j'ai pourtant rien fait pour. |
| | | Invité Invité
| Sujet: Re: Fonctions Chaine et variables locales Sam 4 Déc 2010 - 22:47 | |
| Je ne peux pas modifier le programme plus haut, j'ai un message qui me dit que je dépasse la longueur autorisée. Donc Il y a un programme qui est un include, qui a été oublié. En réalité vous ne trouverez de mot-clé #include, chaque ligne est ajoutée ou insérée selon le cas dans le programme. De plus il manquait un bout de ligne: >text,9940, chaine_trouve$< dans un sous programme. Chose corrigée. - Code:
-
' programme qui s'inclut dans le programme bas pour ajouter les fonctions chaines dll_on "C:\TESTE\KGF\KGF.dll" form 9948:hide 9948:width 9948,300:height 9948,160:border_small 9948 list 9949:parent 9949,9948:width 9949,200:width 9948,300:left 9949,70:font_size 9949,9:color 9949,238,232,170 font_color 9949,0,0,200 container_option 9947:parent 9947,9948:width 9947,65:height 9947,100:option 9946:parent 9946,9947:top 9946,10:caption 9946, "supprime" :height 9946,8:width 9946,60 option 9945:parent 9945,9947:top 9945,20:caption 9945, "insert" :width 9945,60 option 9944:parent 9944,9947:top 9944,35:caption 9944, "ajouter" :width 9944,60 option 9943:parent 9943,9947:top 9943,50:caption 9943, "modifie" : width 9943,60 option 9942:parent 9942,9947:top 9942,80:caption 9942, "rien" :width 9942,60 button 9941:parent 9941,9948:top 9941,100:caption 9941, "ok" : width 9941,30 edit 9940:parent 9940,9948 :top 9940,100:left 9940,70:width 9940,200:font_size 9940,10 button 9939:parent 9939,9948:top 9939,100:caption 9939,"exit": width 9939,30 :left 9939,35 ' button 9937:parent 9937,9948:top 9937,105:left 9937,273:width 9937,18:height 9937,20:caption 9937,"X" label chaine_index_repere , chaine_index_modifie,chaine_liste_go ,chaine_liste_choix ,chaine_liste_ferme label chaine_superpose ,controle_variables,chaine_del,chaine_trouve,chaine_index,chaine_liste,go_end on_click 9941,chaine_liste_go :on_click 9949,chaine_liste_choix :' on_click 9937,chaine_liste_cache ON_CLOSE 9948,chaine_liste_ferme i% = DLL_call6( "WindowRectangleHole" , handle(9948) , 1 , 280 , 0 , 20 , 160 ) :' 160 aulieu de 120 sans le bouton X on_click 9939,chaine_liste_ferme : timer 9938:on_timer 9938,go_end:timer_on 9938:end go_end: timer_off 9938:delete 9938
' ================================================================================== ' SUB-ROUTINES de CHAINES ' les DIM et LABEL sont inclus par le programme DIM_GLOBAL_LOCAL.bas chaine_superpose: rem l'instruction @REMPLACE(10,"texte") met le texte en superposition de l'ancien' rem =>> @REMPLACE$(10,"texte") => texte est le texte de substitution if chaine_l%>0 if chaine_l%=1 if len(chaine$)> len(chaine_r$) chaine$=chaine_r$+mid$(chaine$,len(chaine_r$)+1,900) else chaine$=chaine_r$ end_if else if chaine_l% + len(chaine_r$) => len(chaine$) chaine$=left$(chaine$,chaine_l%)+chaine_r$ else chaine$=left$(chaine$,chaine_l%-1) + chaine_r$ + mid$(chaine$,chaine_l%+len(chaine_r$)+1,900) end_if end_if else message "erreur, impossible de remplacer le texte, la position doit-être supérieur à zéro" end_if return ' ========================================================================================================== chaine_del: rem supprime x caractères depuis la position @DEL(10,2) 10=position 2: 2 caractères à enlevés if len(chaine$)>chaine_l%+chaine_r% if chaine_l%>0 and chaine_r%>0 chaine$=left$(chaine$,chaine_l%-1)+mid$(chaine$, chaine_l% + chaine_r% ,900) else if chaine_l%>0 chaine$=left$(chaine$,chaine_l%) else message "erreur premier paramètre plus petit que 1":stop end_if end_if else if chaine_l%>len(chaine$) then message "erreur, les caractères à supprimer hors limite de la chaine":' on laisse end_if return ' =========================================================================================================== chaine_trouve: rem chaine_index%=3 : chaine_txt%=-1:chaine_txt$= "|" : gosub chaine_trouve if chaine_index%>-1 :' index nombre comme 3 chaine_l%=chaine_index% else chaine_index%= chaine_l% end_if ' partie séparateur récupérée rem on commence la recherche chaine_copie$=chaine$ :chaine_choix%=0 repeat v%=instr(chaine_copie$,chaine_txt$) if v%>0 then chaine_trouve$=left$(chaine_copie$,v%-1):chaine_choix%=chaine_choix%+1: chaine_copie$=mid$(chaine_copie$,v%+1,900) gosub controle_variables :repeat:until scancode=32:wait 200 if chaine_choix%=chaine_index% then exit_repeat message str$(chaine_choix%)+chr$(13)+chaine_trouve$ :' repeat:until scancode=32 or scancode=27:wait 200 until v%=0 or scancode=27 or chaine_copie$="" if chaine_copie$="" then message "dépassement d'index dans la fonction:"+chr$(13) +str$(chaine_l%)+" par rapport à "+str$(chaine_choix%) :chaine_trouve$="" message chaine_trouve$ rem information de retour est: chaine_trouve$ return ' =========================================================================================================== chaine_index: ' dlist 9949 pour indexé (mettre une list horizontal, verticalement) clear 9949 :chaine_copie$=chaine$ if chaine$<>"" if instr(chaine$,chaine_txt$)=0 item_add 9949,chaine$ else repeat v%=instr(chaine_copie$,chaine_txt$) if v%>0 chaine_trouve$=left$(chaine_copie$,v%-1): chaine_copie$=mid$(chaine_copie$,v%+1,900) item_add 9949,chaine_trouve$ :text 9940,chaine_trouve$ end_if until v%=0 or chaine_copie$="" or scancode=27 if chaine_copie$<>"" then item_add 9949,chaine_copie$ end_if end_if chaine_marque$=chaine_txt$: ' récupération du séparateur pour refaire chaine une fois la liste modifiée return ' =========================================================================================================== chaine_index_repere: if chaine_index%<1 or chaine_index%> count(9949) then message "erreur, valeur index:"+str$(chaine_index%)+" nombre éléments:"+str$(count(9949)):stop chaine_txt$=item_read$(9949,chaine_index%) return ' =========================================================================================================== chaine_index_modifie: rem @INDEX_MODIFIE(2,"abricot") chaine_index%,chaine_txt$ if chaine_index%>0 and chaine_index%<=count(9949) item_delete 9949,chaine_index% item_insert 9949,chaine_index%,text$(9940) end_if return ' =========================================================================================================== chaine_liste_choix: chaine_index%=item_index(9949):text 9940,item_index$(9949) return chaine_liste_go: if chaine_index%>0 and chaine_index%<=count(9949) and checked(9945)=1 then item_insert 9949,chaine_index%,text$(9940) if chaine_index%>0 and chaine_index%<=count(9949) and checked(9944)=1 then item_add 9949,text$(9940) if chaine_index%>0 and chaine_index%<=count(9949) and checked(9946)=1 then item_delete 9949,chaine_index% if chaine_index%>0 and chaine_index%<=count(9949) and checked(9943)=1 item_delete 9949,chaine_index% :item_insert 9949,chaine_index%,text$(9940) end_if mark_on 9942 :chaine_l%=0:chaine_r%=0 if left$(chaine$,1)=chaine_marque$ then chaine_l%=1 if right$(chaine$,1)=chaine_marque$ then chaine_r%=1 chaine$="":if chaine_l%=1 then chaine$=chaine_marque$ for v%=1 to count(9949):chaine$=chaine$+item_read$(9949,v%) if v%<count(9949) then chaine$=chaine$+chaine_marque$ next v%:if chaine_r%=1 then chaine$=chaine$+chaine_marque$ return ' =========================================================================================================== chaine_liste:
return ' =========================================================================================================== chaine_liste_ferme: message "on ferme" : to_background 9948 :active 0 return ' =========================================================================================================== ' ===========================================================================================================
controle_variables: clear 1 item_add 1,"a$="+a$ item_add 1,"b$="+b$ item_add 1,"ligne$="+ligne$ item_add 1,"chaine_l$="+chaine_l$ item_add 1,"chaine_m$="+chaine_m$ item_add 1,"chaine$ ="+chaine$ item_add 1,"chaine_r$="+chaine_r$ item_add 1,"chaine_Fonction$="+chaine_Fonction$ item_add 1,"chaine_l%="+str$(chaine_l%) item_add 1,"chaine_txt$="+chaine_txt$ item_add 1,"chaine_index$="+chaine_index$ item_add 1,"chaine_copie$="+chaine_copie$ item_add 1,"chaine_trouve$="+chaine_trouve$ item_add 1,"v%="+str$(v%) item_add 1,"chaine_choix%="+str$(chaine_choix%) return ' ===============================================================================================
Comme j'ai du mal à modifier le 1er poste, je ne modifie pas le programme qui a été généré. Normalement si vous soignez les chemins cela devrait fonctionner. N'hésiter pas à poser les problèmes éventuels. Je tiens à dire que ce programme n'est pas fini. Il y a encore des morceaux de contrôle, et une procédure controle_variables, qui une fois finie devront disparaître. Maintenant à vous, si le coeur vous en dit. Par contre, je ne suis pas content de mes mots-clés. J'aioublié de dire que j'ai utilisé la dll de Klaus, mais ce n'est pas une obligation.dans le programme général qui recréé un nouveau programme (celui qui est exécutable), cela n'avait comme fonction de laisser une fenêtre ouverte avec les variables affichées, et comprendre ce qu'il se passait. Par contre pour le programme généré, cela est en rapport avec TrapClose, la case de fermeture. Donc si vous ne la mettez pas, la form 9948, s'affiche entièrement, dans l'autre cas, la bordure droite est transparente. Chacun fait son choix, mais merci à Klaus. Je trouve ce système préférable que de mettre border hide. Au moins il y a un cadre, et la forme on peut la déplacer. |
| | | Invité Invité
| Sujet: Re: Fonctions Chaine et variables locales Dim 5 Déc 2010 - 11:41 | |
| Je sais que pas facile, et le comble pour ce programme difficile, est qu'il prend toute la largeur et ça ne facilite pas la compréhension. De plus dans le poste du haut, j'ai oublié un programme, qui a été rajouté plus bas, ne pouvant pas le faire dans le premier poste.
Aussi si il y a un problème, il faut le dire, que je puisse faire quelque chose. N'ayez crainte je conçois parfaitement que ce programme soit sans intérêt pour vous, mais je me dois de relancer pour être certain qu'il ne s'agit pas d'un problème technique.
Maintenant je repars bricoler. |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Fonctions Chaine et variables locales Dim 5 Déc 2010 - 13:59 | |
| Je trouve tes programmes toujours interessants quand je les survole mais je n'ai pas le temps de les analyser correctement et voir à les utiliser car je suis sur plein de trucs en ce moment, un jeu en ligne (spatial) qui avance pas faute de désign et de graphismes, un jeu stratégie/gestion pc en delphi objets (remake de gangsters I), une fourmi géante robot, voilà, donc ça fait du monde et je suis tout seul :/ Mais merci pour tes programmes, j'ai bien vu qu'ils peuvent être très utiles donc continue s'il te plaît | |
| | | Invité Invité
| Sujet: Re: Fonctions Chaine et variables locales Jeu 9 Déc 2010 - 14:49 | |
| Ce programme vu les commandes que Jack nous prépare, à un avenir compromit. Il est évident que je ne vais pas me plaindre des avancées de Jack, bien au contraire. J'essayais de contrecarrer le manque de possibilité de Panoramic, et tout le monde se réjouira de ce qui se prépare.
Pour autant, je me dois intellectuellement avancer un peu, et voir ce que cela va devenir. Deux choses ne me conviennent pas dans mon programme: La première est qu'elles nécessitent un schéma à suivre pour les intégrer, je veux dire qu'il faut les mettre dans un certain ordre. Pour ce faire, je regarde pour faire deux types de commandes: un type que je qualifierais de majeur comme @chaine(variable) qui peut aussi être @chaine("texte",s$) où s$ serait un séparateur entre chaque champ. Cette commande ne sépare non seulement horizontalement comme "lundi|mardi|mercredi...", mais en même temps verticalement, et de cette façon, rend inutile les commandes qui séparent et qui mettent en liste. Je regarde pour que la le maximum de fonction fonctionne ainsi. La deuxième est le manque de lisibilité des codes en retour qui ont remplacés le code départ. Ainsi @CHAINE(txt$,"/"), au retour j'aurai ceci: case%=1:gosub chaine_case:' ligne 10 @CHAINE(txt$,"/") et à la fin un sous programme: chaine_case: select case% case 1: les instructions case 2: idem end_select return
il restera des commandes ponctuelles, et ne sachant pas pour l'instant si elles auront encore un intérêt.
Tout ceci sais du baratin, mais ceux qui s'intéresse à ce sujet pour une raison ou une autre auront ma réponse
(Je fais des retour-chariot pour éviter que les lignes se poursuivent au delà de la page)
|
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: Fonctions Chaine et variables locales Jeu 9 Déc 2010 - 21:04 | |
| utile ou pas dans le futur, ça a fait en tous cas un sacré travail intellectuel non dénué d'utilité.
| |
| | | Contenu sponsorisé
| Sujet: Re: Fonctions Chaine et variables locales | |
| |
| | | | Fonctions Chaine et variables locales | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |