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
» Logiciel de planétarium.
memo + numero de ligne, synchronisé Emptypar Pedro Aujourd'hui à 10:37

» Un autre pense-bête...
memo + numero de ligne, synchronisé Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
memo + numero de ligne, synchronisé Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
memo + numero de ligne, synchronisé Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
memo + numero de ligne, synchronisé Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
memo + numero de ligne, synchronisé Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
memo + numero de ligne, synchronisé Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
memo + numero de ligne, synchronisé Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
memo + numero de ligne, synchronisé Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
memo + numero de ligne, synchronisé Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
memo + numero de ligne, synchronisé Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
memo + numero de ligne, synchronisé Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
memo + numero de ligne, synchronisé Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
memo + numero de ligne, synchronisé Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
memo + numero de ligne, synchronisé Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment :
Boutique Nike : -25% dès 50€ sur TOUT le ...
Voir le deal

 

 memo + numero de ligne, synchronisé

Aller en bas 
4 participants
AuteurMessage
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

memo + numero de ligne, synchronisé Empty
MessageSujet: memo + numero de ligne, synchronisé   memo + numero de ligne, synchronisé EmptyMer 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
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

memo + numero de ligne, synchronisé Empty
MessageSujet: Re: memo + numero de ligne, synchronisé   memo + numero de ligne, synchronisé EmptyMer 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.
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

memo + numero de ligne, synchronisé Empty
MessageSujet: Re: memo + numero de ligne, synchronisé   memo + numero de ligne, synchronisé EmptyMer 24 Fév 2016 - 21: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
http://gpp.panoramic.free.fr
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

memo + numero de ligne, synchronisé Empty
MessageSujet: Re: memo + numero de ligne, synchronisé   memo + numero de ligne, synchronisé EmptyJeu 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à.
Revenir en haut Aller en bas
Jicehel

Jicehel


Nombre de messages : 5947
Age : 52
Localisation : 77500
Date d'inscription : 18/04/2011

memo + numero de ligne, synchronisé Empty
MessageSujet: Re: memo + numero de ligne, synchronisé   memo + numero de ligne, synchronisé EmptyJeu 25 Fév 2016 - 6: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
Jean Claude

Jean Claude


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

memo + numero de ligne, synchronisé Empty
MessageSujet: Re: memo + numero de ligne, synchronisé   memo + numero de ligne, synchronisé EmptyJeu 25 Fév 2016 - 8: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
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
memo + numero de ligne, synchronisé
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» PANORAMIC V 1
» saut de ligne sur la dernière ligne
» Numéro de version
» Clé de contrôle du numéro SS
» Numéro d'objet existe ?

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: