silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: memo + numero de ligne, synchronisé Mer 24 Fév 2016 - 19:28 | |
| Bonjour à tous ça a été difficile, mais j'y suis enfin arrivé. Pour les besoins d'un projet, j'ai créé un prototype qui permet d'afficher du texte et des numéros de ligne, avec le défilement synchronisé ainsi que le dimensionnement en temps réel. Ce que j'ai trouvé sur le forum ne me convenais pas, d'ou cette version. - Code:
-
' Panoramic 0.9.27i5
' ============================================================== ' = Title : fenetre_client ' = ' = Author : Silverman ' = ' = Date : Février 2016 ' = ' = Version: 1.0 ' ============================================================== ' Comments : Redimensionne automatiquement et synchronise 2 ' : memos, avec affichage des numéros de ligne ' ==============================================================
dim my_file$,max_article ' dim i,j,tmp$ dim font$,font_sz%,H_font_size_in_pixels,W_font_size_in_pixels,SPC_font_size_in_pixels dim null%,result% dim check_scroll_bar0,resize0
label TIMER_MAITRE,check_scroll_bar,resize,fini
' données pour la dll 'user32' : curseur + gestion scrollbar dim EM_GETFIRSTVISIBLELINE,GETFIRSTVISIBLELINE EM_GETFIRSTVISIBLELINE = 206 ' dim scrollinfo% ,structure_scrollinfo$ ' dim EM_LINESCROLL EM_LINESCROLL = 182 ' dim SB_HORZ,SB_VERT,cbSize,fMask,SIF_ALL,sb_max,sb_page,sb_pos SB_HORZ = 0 SB_VERT = 1 cbSize = 28 SIF_ALL = 31 fMask = SIF_ALL ' ' crée une structure pour recevoir les données(gestion scrollbar + curseur), de 7*4 octets de longueur structure_scrollinfo$=string$(28,chr$(0)) GET_BUFFER_PTR(adr(scrollinfo%),adr(structure_scrollinfo$)) POKE4(scrollinfo%,0,cbSize) POKE4(scrollinfo%,1,fMask)
' quitte sans bug on_close 0,fini
' container pour les memos panel 1 parent 1,0 full_space 1
' dll_on "user32"
' choix entre un fichier ou du texte aléatoire open_dialog 2 my_file$=file_name$(2) ' max_article= nb de ligne de texte qui va être généré aléatoirement pour remplir le memo 'texte' max_article=100 ' font$="dejavu sans mono" font_sz%=10 ' renvoi en pixels, la hauteur de la fonte dans la variable 'H_font_size_in_pixels' ' la largeur dans la variable 'W_font_size_in_pixels' ' ainsi que largeur de " " dans la variable: 'SPC_font_size_in_pixels' FONT_SIZE_TO_PIXELS(font$,font_sz%)
' memo 'numero de ligne' memo 11 : hide 11 width 11,(W_font_size_in_pixels*7)+16 : height 11,429 :' largeur en fonction de la fonte utilisé color 11,248,248,248 font_name 11,font$ : font_size 11,font_sz%
' memo texte memo 12 : hide 12 : bar_both 12 left 12,width(11)-2 : width 12,522 : height 12,446 :' acollé au memo 'numero de ligne' color 12,240,240,240 font_name 12,font$ : font_size 12,font_sz% ' le remplir if my_file$="_" ' avec du texte aléatoire for j=1 to max_article tmp$="" for i=1 to int(1+rnd(100)) tmp$=tmp$+chr$(int(32+rnd(223))) next i item_add 12,str$(j)+"/"+tmp$ next j else ' ou un fichier file_load 12,my_file$ end_if select_text 12,1,1 parent 12,1
' remplir le memo 'numero de ligne' avec des numeros for i=1 to count(12)+1 j=int((W_font_size_in_pixels/SPC_font_size_in_pixels)*((7-len(str$(i))))) :' aligne à droite item_add 11,string$(j," ")+str$(i) next i parent 11,1 ' lecture seule(pas possible de l'éditer) inactive 11
' affiche les memos show 11 show 12
' crée un timer pour gérer le rafraichissement timer 5 : timer_off 5 timer_interval 5,25 : on_timer 5,TIMER_MAITRE ' ' crée des tickers pour rafraichir l'affichage check_scroll_bar0=3 : alpha check_scroll_bar0 : on_click check_scroll_bar0,check_scroll_bar : ticker(1): ticker_interval(1,25) resize0=4 : alpha resize0 : on_click resize0,resize : ticker(2): ticker_interval(2,50) ' ' active le timer maitre timer_on 5
END ' ############################################################################## ' # # ' # Les SUBs # ' # # ' ##############################################################################
' ############################################################################## ' retrouve l'adresse d'un pointeur de 'string' sub GET_BUFFER_PTR(adr_destination%,adr_source%) poke adr_destination%,peek(adr_source%) poke adr_destination%+1,peek(adr_source%+1) poke adr_destination%+2,peek(adr_source%+2) poke adr_destination%+3,peek(adr_source%+3) end_sub
' copie 'value%' à l'adresse: 'adr_source%'+'4*offset%' sub POKE4(adr_source%,offset%,value%) poke (4*offset%)+adr_source%,peek(adr(value%)) poke (4*offset%)+adr_source%+1,peek(adr(value%)+1) poke (4*offset%)+adr_source%+2,peek(adr(value%)+2) poke (4*offset%)+adr_source%+3,peek(adr(value%)+3) end_sub
' retourne dans 'result%' le contenu stocké à l'adresse: 'adr_source%'+'4*offset%' sub PEEK4(adr_source%,offset%) poke adr(result%),peek((4*offset%)+adr_source%) poke adr(result%)+1,peek((4*offset%)+adr_source%+1) poke adr(result%)+2,peek((4*offset%)+adr_source%+2) poke adr(result%)+3,peek((4*offset%)+adr_source%+3) end_sub
' retrouve la taille en pixel d'un caractere sub FONT_SIZE_TO_PIXELS(f$,t%) dim_local N,L repeat N=N+1 until object_exists(N)=0 alpha N : hide N : font_name N,f$ : font_size N,t% H_font_size_in_pixels = text_height("0",N) W_font_size_in_pixels = text_width("0",N) SPC_font_size_in_pixels = text_width(" ",N) ' delete N end_sub
' gestion de TICKER(chronomètre) sub TICKER(N%) if variable("memorise_tickers")=0 dim memorise_tickers ' un tableau pour gérer le tickers dim mem_TICKER(255,3) end_if if N%<1 or N%>255 then message "Le numéro de TICKER doit être compris entre 1 et 255" : terminate if mem_TICKER(0,0)=0 mem_TICKER(0,0)=NUMBER_TICKS end_if mem_TICKER(N%,0)=1000 mem_TICKER(N%,1)=0 mem_TICKER(N%,2)=mem_TICKER(0,0) mem_TICKER(N%,3)=1 end_sub
' sub TICKER_INTERVAL(N%,delai%) if mem_TICKER(N%,3)=0 then message "Le TICKER n°"+str$(N%)+" n'existe pas" : terminate if N%<1 or N%>255 then message "Le numéro de TICKER doit être compris entre 1 et 255" : terminate if delai%<1 then message "TICKER n°"+str$(N%)+": Délai nul ou négatif" : terminate mem_TICKER(N%,0)=delai% mem_TICKER(N%,2)=delai%-mod(mem_TICKER(N%,2)-mem_TICKER(0,0),delai%)+mem_TICKER(N%,2) end_sub
' sub ON_TICKER(N%,object%) if mem_TICKER(N%,3)=0 then message "Le TICKER n°"+str$(N%)+" n'existe pas" : terminate if N%<1 or N%>255 then message "Le numéro de TICKER doit être compris entre 1 et 255" : terminate if mem_TICKER(0,1)=0 mem_TICKER(0,1)=N% else if mem_TICKER(0,1)=N% then mem_TICKER(0,0)=NUMBER_TICKS end_if if mem_TICKER(0,0)>=mem_TICKER(N%,2) mem_TICKER(N%,2)=mem_TICKER(N%,0)-mod(mem_TICKER(N%,2)-mem_TICKER(0,0),mem_TICKER(N%,0))+mem_TICKER(N%,2) if mem_TICKER(N%,1)=0 then trigger_click object% end_if end_sub
' sub TICKER_ON(N%) if mem_TICKER(N%,3)=0 then message "Le TICKER n°"+str$(N%)+" n'existe pas" : terminate if N%<1 or N%>255 then message "Le numéro de TICKER doit être compris entre 1 et 255" : terminate mem_TICKER(N%,1)=0 end_sub
' sub TICKER_OFF(N%) if mem_TICKER(N%,3)=0 then message "Le TICKER n°"+str$(N%)+" n'existe pas" : terminate if N%<1 or N%>255 then message "Le numéro de TICKER doit être compris entre 1 et 255" : terminate mem_TICKER(N%,1)=1 end_sub
' ############################################################################## ' # # ' # Les EVENTs # ' # # ' ##############################################################################
' ############################################################################## ' TIMER_MAITRE: timer_off 5 ' on_ticker(1,check_scroll_bar0) on_ticker(2,resize0) ' timer_on 5 return
' synchronise les mémos check_scroll_bar: timer_off 5 ' ' récupère les infos de la scroll_bar VERTICALE dans le memo 'texte' GET_BUFFER_PTR(adr(scrollinfo%),adr(structure_scrollinfo$)) :' le pointeur de la structure change dynamiquement, il faut le rechercher à chaque fois, sinon erreur 'ACCESS VIOLATION' aléatoire null%=dll_call3("GetScrollInfo",handle(12),1,scrollinfo%) :' 'GetScrollInfo' peut renvoyer des valeurs supérieur à 2^16(fonction adapté aux memos de très grande taille) PEEK4(scrollinfo%,4) : sb_page=result% PEEK4(scrollinfo%,5) : sb_pos=result% :' = index du premier numero de ligne visible dans le memo 'texte'
' index du premier numero de ligne visible dans le memo 'numero de ligne' GETFIRSTVISIBLELINE=dll_call4("SendMessageA",handle(11),EM_GETFIRSTVISIBLELINE,0,0) ' une routine pour ajuster le nombre de ligne dans le memo 'numero de ligne' if (sb_pos+sb_page)>count(11) for i=count(11)+1 to (sb_pos+sb_page) j=int((W_font_size_in_pixels/SPC_font_size_in_pixels)*((7-len(str$(i))))) :' aligne à gauche tmp$=item_read$(11,count(11)) item_insert 11,count(11),string$(j," ")+str$(i) : item_delete 11,count(11) : item_insert 11,count(11),tmp$ next i end_if ' fait défiler les numéro de lignes dans le memo 'numero de ligne' null%=dll_call4("SendMessageA",handle(11),EM_LINESCROLL,0,sb_pos-GETFIRSTVISIBLELINE)
' timer_on 5 return
' redimensionne les memos resize: timer_off 5 ' width 12,width(1)-left(12)-0 height 12,height(1)-0 height 11,height(1)-17 ' timer_on 5 return
' quitte fini: timer_off 5 :' pas nécessaire, mais on garde l'habitude dll_off terminate ' end
Dernière édition par silverman le Lun 7 Mar 2016 - 18:18, édité 2 fois | |
|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: memo + numero de ligne, synchronisé Mer 24 Fév 2016 - 20:54 | |
| C'est très chouette. Un petit bug selon moi: Quand tu dois choisir ton fichier, si tu annule, il ne devrait rien faire alors que là, il t'ouvre un texte fictif pseudo aléatoire... Rien de grave, mais je te le signale. | |
|
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: memo + numero de ligne, synchronisé Jeu 25 Fév 2016 - 6:04 | |
| @Jicehel ce n'est pas un bug, c'est voulu; c'est pour afficher qq chose si on ne sélectionne pas de fichier, juste pour la démo.
@Minibug oui, je sais, mais je voulais un code en natif. Je cherche à coder le plus possible en panoramic, à sortir des chose représentatives du langage, c'est plus intéressant de cette façon là. | |
|