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
» TourD Version 2
par Minibug Aujourd'hui à 1:50

» La métamatière et le peuple
par JL35 Hier à 21:18

» Capture d'une zone de l'écran total
par JL35 Hier à 18:41

» Logiciel de soutien scolaire en langues.
par Pedro Alvarez Hier à 11:49

» qui peut résoudre mon prb
par pascal10000 Jeu 16 Nov 2017 - 17:30

» évènements et objets système : listage automatique
par Jean Claude Jeu 16 Nov 2017 - 11:15

» Panoramic et la reconnaissance vocale.
par papydall Jeu 16 Nov 2017 - 3:45

» Bizzarerie dans Edge
par Marc 37 Mer 15 Nov 2017 - 17:45

» KGF_dll - nouvelles versions
par Klaus Mer 15 Nov 2017 - 2:08

» Analyser un code Panoramic
par JL35 Lun 13 Nov 2017 - 18:38

» Un bonjour en passant...
par Minibug Dim 12 Nov 2017 - 19:57

» mise a jour calculatrice
par joeeee2017 Dim 12 Nov 2017 - 4:20

» comment accèder à l'heure et à la date d'un fichier
par Klaus Sam 11 Nov 2017 - 0:53

» Compilateur FBPano
par Jicehel Mer 8 Nov 2017 - 15:22

» Mon adresse e-mail
par treehouse Mer 8 Nov 2017 - 14:36

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2017
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
27282930   
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 : 469
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 : 5859
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 : 2357
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 : 469
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 : 5859
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 : 5056
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

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: