FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» select intégrés
Fonctions Chaine et variables locales Emptypar jjn4 Hier à 18:33

» Aide de PANORAMIC
Fonctions Chaine et variables locales Emptypar leclode Hier à 18:23

» PANORAMIC V 1
Fonctions Chaine et variables locales Emptypar Klaus Hier à 9:53

» Je teste PANORAMIC V 1 beta 1
Fonctions Chaine et variables locales Emptypar Klaus Hier à 9:52

» bouton dans autre form que 0
Fonctions Chaine et variables locales Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
Fonctions Chaine et variables locales Emptypar Klaus Lun 6 Mai 2024 - 11:41

» Gestion d'un système client-serveur.
Fonctions Chaine et variables locales Emptypar Klaus Lun 6 Mai 2024 - 10:23

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Fonctions Chaine et variables locales Emptypar Froggy One Jeu 2 Mai 2024 - 11:16

» @Jack
Fonctions Chaine et variables locales Emptypar Jack Mar 30 Avr 2024 - 20:40

» trop de fichiers en cours
Fonctions Chaine et variables locales Emptypar papydall Lun 29 Avr 2024 - 23:39

» Une calculatrice en une ligne de programme
Fonctions Chaine et variables locales Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Fonctions Chaine et variables locales Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Fonctions Chaine et variables locales Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Fonctions Chaine et variables locales Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Fonctions Chaine et variables locales Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le Deal du moment :
Jeux, jouets et Lego : le deuxième à ...
Voir le deal

 

 Fonctions Chaine et variables locales

Aller en bas 
AuteurMessage
Invité
Invité




Fonctions Chaine et variables locales Empty
MessageSujet: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptySam 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
end

ces 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 :

Fonctions Chaine et variables locales Listechaine

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
Revenir en haut Aller en bas
dragonno




Nombre de messages : 341
Localisation : Près de Toulouse
Date d'inscription : 22/01/2009

Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptySam 4 Déc 2010 - 19:02

Dans ton image, pourquoi tu as une ligne vide entre poireau et le reste ?
Revenir en haut Aller en bas
Invité
Invité




Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptySam 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.
Revenir en haut Aller en bas
Invité
Invité




Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptySam 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.
Revenir en haut Aller en bas
Invité
Invité




Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptyDim 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.
Revenir en haut Aller en bas
dragonno




Nombre de messages : 341
Localisation : Près de Toulouse
Date d'inscription : 22/01/2009

Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptyDim 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 Wink
Revenir en haut Aller en bas
Invité
Invité




Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptyJeu 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)

Revenir en haut Aller en bas
dragonno




Nombre de messages : 341
Localisation : Près de Toulouse
Date d'inscription : 22/01/2009

Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales EmptyJeu 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é.
Revenir en haut Aller en bas
Contenu sponsorisé





Fonctions Chaine et variables locales Empty
MessageSujet: Re: Fonctions Chaine et variables locales   Fonctions Chaine et variables locales Empty

Revenir en haut Aller en bas
 
Fonctions Chaine et variables locales
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Variables locales et DIM dynamique
» Gestion de chaine
» bug SEVERE fnc+sub n°4: pb n°2 avec variables locales
» sur les SUB: vérification avec les variables locales.
» les sous-programmes, les variables globales et locales

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: