Invité Invité
| Sujet: Un pseudo objet: grid_memo Sam 23 Juil 2016 - 0:19 | |
| Il s'agit d'un besoin que j'ai eu pour un autre programme. Cela ressemble à un grid mais chaque cellule s'assimile à un memo. Suivre les commentaires pour les réglages. Ce programme fonctionne tel_quelle, mais peut être intégré dans un autre, en prenant l'ensemble du code, et l'insérer juste avant le END d'un autre. Le lancer, puis cliquez sur une cellule. Le contenu se copie dans un vrai memo qui permet de remplir celle-ci, ou de le modifier. Pour voir le memo, ou agir sur ses besoins, il faut faire un clic droit sur la vue des cellules pour montrer un menu contextuel. L’intérêt de ce programme a été pour moi de pouvoir entrer des paramètres, aussi les cellules doivent être dimensionnées selon le nombre paramètres qu'on a besoin, car je n'ai pas prévu de scrolling dans chaque pseudo cellule. - Code:
-
' organigramme "C:\PANO\temp\réflexion\pour_tester\SUB_organigrame1.bas"
' Ici fin de la déclaration du programme. Ce module se place dans son ensemble avant le END ' permettant ainsi le fonctionnement du GRID_MEMO (pas de TIMER, pas de LABEL)
rem "==============================================================" rem "*** Création d'un pseudo-objet: GRID_MEMO *** par cosmos70 ***" rem "*** 22 juillet 2016 ***" rem "=============================================================="
full_space 0 if variable("a$") = 0 then dim a$ :' pour aider à comprendre le montage rem "=============Module Grid_memo==========================================================================" dim form_recoit% , grid_memo$ , grid_memo% , h% , blocage_grid_memo% , x , y ' form récepteur, N° objet départ , NB de ligne,Nb de colonne , marge, width , height ,left , top ' 0 , 995...1000 , 11 , 5 , 2 , 200 , 100 , 000 , 200
grid_memo$ = "10," : ' form de réception du module, peut-être aussi "0," grid_memo$=grid_memo$ + "995," : ' N° de départ pour Pseudo Grid_memo (995 + 6 autres) grid_memo$=grid_memo$ + "11," : ' Nombre de lignes, ou plutôt nombre de pseudo memos verticales grid_memo$=grid_memo$ + "5," : ' Nombre de colonnes, soit nombre de cellules horiz. grid_memo$=grid_memo$ + "2," : ' Largeur d'une marge (si on en veut une entre chaque cellule) grid_memo$=grid_memo$ + "200," : ' Largeur d'une cellule grid_memo$=grid_memo$ + "100," : ' hauteur d'une cellule grid_memo$=grid_memo$ + "0," : ' left, soit de la form si création, ou du panel si la form existe déjà grid_memo$=grid_memo$ + "200" : ' top, idem
' OU grid_memo$ = "10,995,11,5,10,200,100,100,200" :' en variable pour garder en mémoire ' appel à la conception du grid_memo grid_memo(0) rem "==============================================================FIN======================================" ' cette partie est nécessaire et est placée avant le END du programme dans lequel on insère celui-ci repeat pause 100 if blocage_grid_memo% = 0 :' pour annuler l'exploitation if mouse_right_down(grid_memo%+1) = 1 then grid_memo(1) :' clic contextuel sur les cellules ET SHOW memo if mouse_right_down(0) = 1 then show form_recoit% : to_foreground form_recoit% if mouse_left_down(grid_memo%+1) = 1 then grid_memo(0):' clic sur un module pour reporter le texte dans le memo. ' if mouse_left_down(grid_memo%+4) = 1 then grid_memo(2) :' clic bouton "écrire" end_if until scancode = 19 :' touche PAUSE
hide grid_memo% :' panel de gril memo (pour le cas on veut seulement sortir du grid_memo) ' Dans ce cas supprimer terminate terminate :' à retirer si on veut seulement annuler le module et continuer normalement
END :' <-------------------------------------------------- ' ==============================================================================
SUB grid_memo(cde%) dim_local colonne%,ligne%,a$, no% , a%,b% ,l%,t% , exist% ,tx$ , separ_texte$ dim_local column%,row%,marge%,col%,lig% , v% , j% , x , y , b$ , nb_caract dim_local r1%,v1%,b1% , r2%,v2%,b2% , r3%,v3%,b3% :' préparer les couleurs
r1%=255:v1%=255:b1%=190 : ' couleur de fond des cellules vides r2%=255:v2%=255:b2%=0 : ' cellule cliquée r3%=220:v3%=230:b3%=250 : ' cellule avec contenue separ_texte$ = chr$(1) ' ----------------------------- a$ = trim$(grid_memo$) : if right$(a$,1) <> "," then a$ = a$+"," j% = 1 repeat v% = instr(a$,",") select j% case 1 : form_recoit% = val(trim$(left$(a$,v%-1))) case 2 : grid_memo% = val(trim$(left$(a$,v%-1))) case 3 : row% = val(trim$(left$(a$,v%-1))) case 4 : column% = val(trim$(left$(a$,v%-1))) case 5 : marge% = val(trim$(left$(a$,v%-1))) case 6 : col% = val(trim$(left$(a$,v%-1))) case 7 : lig% = val(trim$(left$(a$,v%-1))) case 8 : l% = val(trim$(left$(a$,v%-1))) case 9 : t% = val(trim$(left$(a$,v%-1))) end_select j% = j%+1 : a$ = right_pos$(a$,v%+1) until v% = 0 or j% = 10 or scancode = 27 ' ======================================== if cde% = 0 if variable( "pp%") = 0 dim pp% , texte_grid_memo$(column%,row%) , memoire$ , fichier_grid_memo$ ' .................................................................. ' PARTIE DE L'OBJET GRID_MEMO if form_recoit% > 0 if object_exists(form_recoit%) = 0 :' DONC création du FORM form form_recoit%:left form_recoit%,l% width form_recoit%,column%*col%+40 : height form_recoit%,row%*lig%+50 top form_recoit%,t%:left form_recoit%,l% : exist% = 1 end_if end_if
no% = grid_memo% :' 1 panel + 1 picture pour faire le GRID_MEMO, + 1 panel avec memo,bouton caché pour traitement texte panel no%:parent no%,form_recoit% :width no%,column%*col%+10 :height no%,row%*lig%+10 :' GRID_MEMO% ¤¤¤ ' si form_recoit% = 0 ok pour left et top. Si création du form, alors le panel position: 0,0 if exist% = 0 then top no%,t% : left no%,l%:' si le form n'est pas créé pour, on déplace le panel selon la demande ' dans le cas contraire (on créé le FORM, alors c'est ce dernier qui est placé.
no%=no%+1 picture no%:parent no%,no%-1:width no%,column%*col%+1: height no%,row%*lig%+1 :' grid_memo% + 1 font_name no%,"Consolas":font_size no%,9 : font_bold no% 2d_target_is no% : print_target_is no% : font_size no%,9 for a% = 0 to column% -1 for b% = 0 to row%-1 2d_fill_color 255,255,255 : 2d_pen_width 1 : 2d_pen_color 220,220,220 :' cellules en entier sans marges 2d_rectangle a%*col% , b%*lig% , (a%+1)*col% , (b%+1)*lig% 2d_fill_color r1%,v1%,b1% : 2d_pen_color 0,0,0 :if marge% > 1 then 2d_pen_width 2 2d_rectangle a%*col%+marge% , b%*lig%+marge% , (a%+1)*col%-marge%, (b%+1)*lig% -marge% next b% next a% ' .................................................................. ' PARTIE OU ON TRAVAIL LES TEXTES dans un memo :' on créé un panel HIDE, avec 1memo + boutons s'appellant par clic_droit
no% = no%+1 :' parent no%,form_recoit% remplacer le panel par form form no% : left no%,l%: width no%,320:height no%,200 :border_small no% :' grid_memo% + 2 caption no%,"Saisie de texte" no% = no% +1 memo no%:parent no%,no%-1:width no%,300:height no%,150 :bar_both no% :' grid_memo% + 3 no% = no%+1 ' button no% : parent no%,no%-2:left no%,310:caption no%,"écrire":width no%,120 :' grid_memo% + 4 ' annuler, reporté dans le menu contextuel ' ------------------------------------------------------------------------ hide grid_memo%+2 ' ------------------------------------------------------------------------ rem " faire un panel avec picture pour un menu contextuel no%=no%+1 PANEL no%:parent no%,grid_memo% : left no%,100:top no%,250:width no%,160:height no%,210 :' grid_memo% + 5 hide no% : font_size no%,10 : no%=no%+1 PICTURE no%:parent no%,no%-1:full_space no% : color no%,255,255,0 :' grid_memo% + 6 ' ^__ pourquoi jaune? ELSE ' ------------ variable pp% déclarée ------------------------------------------------------------------------ ' parcourt dans le module print_target_is grid_memo%+1 nb_caract = (text_width("WWWWWWWWWW",grid_memo%+1))/10 nb_caract = int((col%-(marge%*2-10)) / nb_caract) -2
' il faut en premier, rétablir la couleur normale sur la case cliquée avant if texte_grid_memo$(0,0) <> "" colonne% = val(texte_grid_memo$(0,0)) : ligne% = val(texte_grid_memo$(0,1)) : 2d_target_is grid_memo%+1
if texte_grid_memo$(colonne%,ligne%) <> "" then 2d_fill_color r3%,v3%,b3% : else :2d_fill_color r1%,v1%,b1% 2d_fill_on :rem "LIGNE SUIVANTE : +10 ET -10 2d_rectangle (colonne%-1)*col%+marge% , (ligne%-1)*lig% +marge% , (colonne%)*col%-marge% , (ligne%)*lig%-marge% if texte_grid_memo$(colonne%,ligne%) <> "" a% = 1 : a$ = texte_grid_memo$(colonne%,ligne%) repeat v% = instr(a$,separ_texte$) if v% > 0 print_locate (colonne%-1)*col%+marge%+2 , (ligne%-1)*lig%+marge% + (a%-1)*17 +3 b$ = left$(a$,v%-1) : print left$(b$,nb_caract) a$ = right_pos$(a$,v%+1) end_if a% = a% +1 until v%=0 or a$="" end_if end_if
' cellule cliquée ensuite x = mouse_x_position(grid_memo%+1) : y= mouse_y_position(grid_memo%+1) colonne% = x/col%+.5 : ligne% = y/lig% +.5 : caption 0, "ligne%="+str$(ligne%)+ " colonne%="+str$(colonne%) if colonne% <= column% and ligne% <= row% texte_grid_memo$(0,0) = str$(colonne%) : texte_grid_memo$(0,1) = str$(ligne%)
rem " IL FAUT MONTRER LA ZONE DE CLIC
2d_fill_color r2%,v2%,b2% : 2d_fill_on :rem "LIGNE SUIVANTE : +10 ET -10 2d_rectangle (colonne%-1)*col%+marge% , (ligne%-1)*lig% +marge% , (colonne%)*col%-marge% , (ligne%)*lig%-marge%
clear grid_memo% +3 :' memo a$ = texte_grid_memo$(colonne%,ligne%) : b% = 0 if colonne% > 0 and ligne% > 0 repeat if a$ <> "" a% = 1 repeat v% = instr(a$,separ_texte$) if v% > 0 item_add grid_memo%+3,left$(a$,v%-1) : b$ = left$(a$,v%-1) print_locate (colonne%-1)*col%+marge%+2 , (ligne%-1)*lig%+marge% + (a%-1)*17 +3 print left$(b$,nb_caract) a$ = right_pos$(a$,v%+1) else if a$ <> "" then item_add grid_memo%+3,a$ : a$ = "" end_if a% = a%+1 until a$ = "" or scancode = 27 end_if until a$ = "" if show(grid_memo%+2) = 1 then set_focus grid_memo%+3 :' memo end_if ' --------------------------------------------------------------------------------------------------------------- else colonne% = 0 : ligne% = 0 :' on a cliqué en dehors, et cela évite les erreurs pour la suite end_if end_if end_if :' cde%=0 ' --------------------- nb_caract = (text_width("WWWWWWWWWW",grid_memo%+1))/10 nb_caract = int((col%-(marge%*2-10)) / nb_caract) -2 ' --------------------- if cde% = 1 :' menu textuel sur les cellules
if texte_grid_memo$(0,0) <> "" then colonne% = val( texte_grid_memo$(0,0)) if texte_grid_memo$(0,1) <> "" then ligne% = val( texte_grid_memo$(0,1))
show grid_memo%+5 :' menu contextuel 2d_target_is grid_memo%+6 :' picture sur menu contextuel 2d_clear : print_target_is grid_memo%+6 color grid_memo%+6, 240,240,240 tx$ = "Glisser avant de relâcher|Annulation|Montrer le memo|Cacher le memo|ÉCRIRE DANS LA CELLULE|Effacer la cellule|Annuler efface|Enregistrer|Lire|" v% = 0 : a% = 0 a$ = tx$ 2d_fill_color 255,0,0 : font_color grid_memo%+6, 255,255,0 repeat v%= instr(a$,"|") if v% > 0 if a% = 1 then 2d_fill_color 240,240,240 : font_color grid_memo%+6, 0,0,0 print_locate 5,a%*20+2 : print left$(a$,v%-1) a$ = right_pos$(a$,v%+1) a% = a%+1 end_if until v% = 0 or a$ = "" ' ....placement du menu...... Tant qu'on ne relève pas le doigt droit, on peut déplacer le menu. repeat x = mouse_x_position(grid_memo%+1)+10 : y = mouse_y_position(grid_memo%+1) left grid_memo%+5,x top grid_memo%+5,y caption 0,scancode until scancode = 0
' on réécrit dans une boucle en tenant compte de la souris pour montrer la ligne j%=1 repeat y = int((mouse_y_position(grid_memo%+6)+8)/20 -1 +.5) v% = 0 : a% = 0 : a$ = tx$ repeat v%= instr(a$,"|") if v% > 0 if a% = 0 print_locate 5,2 : 2d_fill_color 0,0,0 : font_color grid_memo%+6, 255,255,255 print "....... Sélectionnez ........." 2d_fill_color 240,240,240 : font_color grid_memo%+6, 0,0,0 else ' -------------------------- ' si il y a modification de ligne, il faut modifier les couleurs if y <> j% and a% = j% :' on rétabli la ligne précédente 2d_fill_color 240,240,240 : font_color grid_memo%+6, 0,0,0 print_locate 5,a%*20+2 : print left$(a$,v%-1) end_if if y <> j% and a% = y :' la ligne du curseur est surlignée 2d_fill_color 0,110,255 : font_color grid_memo%+6, 255,255,255 print_locate 5,a%*20+2 : print left$(a$,v%-1) end_if ' -------------------------- end_if a$ = right_pos$(a$,v%+1) : a% = a%+1 end_if until v% = 0 or a$ = "" or scancode = 27 j% = y until mouse_left_down(grid_memo%+6) = 1 or scancode = 27:if scancode = 27 then j%=1 hide grid_memo%+5 : repeat : pause 100 : until scancode = 0
select j%+1 case 2 : hide grid_memo%+5 : ' annulation case 3 : show grid_memo%+2 : set_focus grid_memo%+3 :' montrer le panel avec memo ... case 4 : hide grid_memo%+2 : ' cacher """"" case 5 : cde%=2 : ' écrire case 6 : ' effacer la cellule memoire$ = "" : 2d_target_is grid_memo%+1 if count(grid_memo%+3) > 0 for a% = 1 to count(grid_memo%+3) memoire$ = memoire$+item_read$(grid_memo%+3,a%)+separ_texte$ next a% :' pour récupération si erreur end_if texte_grid_memo$(colonne%,ligne%)="" : clear grid_memo%+3 2d_fill_color r1%,v1%,b1% 2d_rectangle (colonne%-1)*col%+marge% , (ligne%-1)*lig% +marge% , (colonne%)*col%-marge% , (ligne%)*lig%-marge% case 7 : ' annuler efface a$ = memoire$ : 2d_target_is grid_memo%+1 : a% = 1 2d_fill_color r3%,v3%,b3% 2d_rectangle (colonne%-1)*col%+marge% , (ligne%-1)*lig% +marge% , (colonne%)*col%-marge% , (ligne%)*lig%-marge% repeat v%= instr(a$,separ_texte$) if v% > 0 item_add grid_memo%+3,left$(a$,v%-1) : b$ = left$(a$,v%-1) print_locate (colonne%-1)*col%+marge%+2 , (ligne%-1)*lig%+marge% + (a%-1)*17 +3 print left$(b$,nb_caract) a$ = right_pos$(a$,v%+1) end_if a% = a%+1 until v%=0 or a$ = "" texte_grid_memo$(colonne%,ligne%)= memoire$ case 8 : ' enregistrer
for v% = 9999 to 1 step -1 : ' créer un objet open_dialog if object_exists(v%) = 0 then open_dialog v% : exit_for next a% filter v%,"Enregistrement|*.g-m" fichier_grid_memo$ = file_name$(v%) if fichier_grid_memo$ <> "" if file_extract_extension$(fichier_grid_memo$) = "" then fichier_grid_memo$ = fichier_grid_memo$ + "g-m" file_open_write 1, fichier_grid_memo$ file_writeln 1,row% : file_writeln 1,column% for a% = 1 to row% for b% = 1 to column% file_writeln 1,texte_grid_memo$(b%,a%) next b% next a% file_close 1 end_if delete v% case 9 : ' lire : for v% = 9999 to 1 step -1 :' créer un objet open_dialog if object_exists(v%) = 0 then open_dialog v% : exit_for next a% filter v%,"Lecture|*.g-m" fichier_grid_memo$ = file_name$(v%) delete v% if fichier_grid_memo$ <> "_" file_open_read 1,fichier_grid_memo$ file_readln 1,row% : file_readln 1,column% for a% = 1 to row% for b% = 1 to column% file_readln 1,texte_grid_memo$(b%,a%) next b% next a% file_close 1 ' ------------- refaire le grid avec le texte. 2d_target_is grid_memo%+1 : print_target_is grid_memo%+1 : 2d_clear : 2d_fill_on for a% = 0 to column% -1 for b% = 0 to row%-1 2d_fill_color 255,255,255 : 2d_pen_width 1 : 2d_pen_color 220,220,220 :' cellules en entier sans marges 2d_rectangle a%*col% , b%*lig% , (a%+1)*col% , (b%+1)*lig% 2d_pen_color 0,0,0 :if marge% > 1 then 2d_pen_width 2 if trim$(texte_grid_memo$(a%,b%)) = "" 2d_fill_color r1%,v1%,b1% else 2d_fill_color r3%,v3%,b3% end_if 2d_rectangle a%*col%+marge% , b%*lig%+marge% , (a%+1)*col%-marge%, (b%+1)*lig% -marge% ' on décompose le texte a$ = texte_grid_memo$(a%,b%) : j% = 1 if a$ <> "" repeat v% = instr(a$,separ_texte$) if v% > 0 b$ = left$(a$,v%-1) print_locate (a%-1)*col%+marge%+2 , (b%-1)*lig%+marge% + (j%-1)*17 +3 print left$(b$,nb_caract) a$ = right_pos$(a$,v%+1) end_if j% = j%+1 until v% = 0 or a$ = "" end_if next b% next a% end_if end_select 2d_target_is grid_memo%+1 : print_target_is grid_memo%+1 end_if : ' cde% = 1
' =================================================================
if cde% = 2 : ' écrire le contenu du memo
if texte_grid_memo$(0,0) <> "" then colonne% = val( texte_grid_memo$(0,0)) if texte_grid_memo$(0,1) <> "" then ligne% = val( texte_grid_memo$(0,1))
2d_target_is grid_memo%+1 : print_target_is grid_memo%+1 ' ......................................................
IF colonne% > 0 and ligne% > 0 2d_fill_color r3%,v3%,b3% : 2d_fill_on :rem "LIGNE SUIVANTE : +10 ET -10 2d_rectangle (colonne%-1)*col%+marge% , (ligne%-1)*lig% +marge% , (colonne%)*col%-marge% , (ligne%)*lig%-marge%
if count(grid_memo%+3) > 0 for a% = count(grid_memo%+3) to 1 step -1 : ' suppression des dernières lignes vides a$ = item_read$(grid_memo%+3,a%) if a$ = "" item_delete grid_memo%+3,a%:' pour reprendre coloriage cellule vide else exit_for end_if next a% for a% = 1 to count(grid_memo%+3) a$ = item_read$(grid_memo%+3,a%) : b$ = b$ + a$+ separ_texte$ print_locate (colonne%-1)*col%+marge%+2 , (ligne%-1)*lig%+marge% + (a%-1)*17 +3 print left$(a$,nb_caract) next a% texte_grid_memo$(colonne%,ligne%) = b$ else 2d_fill_color r1%,v1%,b1% : 2d_pen_width 2 : 2d_pen_color 0,0,0 2d_rectangle (colonne%-1)*col%+marge% , (ligne%-1)*lig% +marge% , (colonne%)*col%-marge% , (ligne%)*lig%-marge% end_if cde%=0 END_IF end_if end_sub
Juste une pensé comme cela à propos des timers. Pensez-vous pas qu'un timer qui est une interruption, devrait rétablir les paramètres, telqu'ils étaient avant l'appel, comme le ferait une vrai interruption. Il y a une commande qui est TIMER_OFF_ALL, ne pouvait-il y avoir une commande qui rétabli ces derniers comme ils étaient avant l'appel de timer_off all. Cela résoudrait l'ajout d'include qui ne connaît pas les timers qui sont actifs, et pour quelle raisons. |
|