FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Calculus
par JL35 Aujourd'hui à 15:43

» plus de caractères avec chr$()
par Marc Aujourd'hui à 14:59

» Animations : Livres et leçons sur le français
par papydall Aujourd'hui à 3:22

» Animations FLASH pour différentes branches de la Science
par papydall Aujourd'hui à 2:54

» @ Jack : lapsus clavis
par Marc Hier à 19:19

» Question ?
par papydall Hier à 14:00

» Quelques nouvelles ...
par Ouf_ca_passe Ven 19 Jan 2018 - 18:07

» Mah-Jong français
par Jicehel Ven 19 Jan 2018 - 11:10

» Rotation d'une image d'un angle quelconque
par JL35 Jeu 18 Jan 2018 - 16:09

» StratégoV8 et V9
par Jean Claude Jeu 18 Jan 2018 - 14:22

» GRID_LOAD
par Jean Claude Mer 17 Jan 2018 - 21:04

» HVIEWER
par Yannick Mer 17 Jan 2018 - 20:31

» KGF_dll - nouvelles versions
par Klaus Mar 16 Jan 2018 - 21:28

» Déformation d'image en trapèze
par mindstorm Mar 16 Jan 2018 - 21:06

» Mah-Jong américain
par Jean Claude Lun 15 Jan 2018 - 19:37

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Janvier 2018
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
293031    
CalendrierCalendrier

Partagez | 
 

 memo + numero de ligne, synchronisé

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
silverman

avatar

Nombre de messages : 483
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: memo + numero de ligne, synchronisé   Mer 24 Fév 2016 - 21: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 - 20:18, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5877
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: memo + numero de ligne, synchronisé   Mer 24 Fév 2016 - 22: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Minibug

avatar

Nombre de messages : 2489
Age : 51
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: memo + numero de ligne, synchronisé   Mer 24 Fév 2016 - 23:30

Excellent silverman !

C'est toujours un plaisir de lire tes codes tous aussi surprenants les uns que les autres...

Sinon tu as Synedit dans les fonction KGF.dll de Klaus qui produit la même chose et plus encore !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://gpp.panoramic.free.fr
silverman

avatar

Nombre de messages : 483
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: memo + numero de ligne, synchronisé   Jeu 25 Fév 2016 - 8: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à.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5877
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: memo + numero de ligne, synchronisé   Jeu 25 Fév 2016 - 8:57

Ah ok, désolé Silverman... Ca m'avait échappé, mais de toute façon c'est chouette et utilisable pour d'autres mémos
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5139
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: memo + numero de ligne, synchronisé   Jeu 25 Fév 2016 - 10:55

Belle réussite Sylverman,

MEMO redimensionné automatiquement et synchronisation avec un autre MEMO.
J'entrevois les débuts d'un éditeur pour Panoramic... Very Happy

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: memo + numero de ligne, synchronisé   

Revenir en haut Aller en bas
 
memo + numero de ligne, synchronisé
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Ft m'a coupé ma ligne
» Déménagement : n° de ligne FT inactif => création de ligne ?
» Mon n° de ligne support a disparu...
» portabilte dartybox thd vers ideo numero fixe non reconnu
» Comboost : un diaporama hébergé en ligne

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: