Page 2 sur 2

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 11:06
par Le Soldat Inconnu
le plus propre serais d'utiliser un timer. Et d'utiliser directement le contenu de la listview sans passer par des variables textes. Voici un petit exemple que je laisse prendre soin d'étudier

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
;
; Explication du programme :
; Mémoriser le contenu du presse papier

#Element_NombreMaxi = 10

Enumeration ; On énumère les fenêtres
	#Fenetre
EndEnumeration
Enumeration ; On énumère les gadgets
	#Liste
	#Copier
EndEnumeration

; Création de la fenêtre et de la GadgetList
If OpenWindow(#Fenetre, 0, 0, 300, 300, "Presse-Papier", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

AddWindowTimer(#Fenetre, 1, 50) ; On ajoute un timer qui déclenche toute les 50ms

ListViewGadget(#Liste, 0, 0, 300, 270)
ButtonGadget(#Copier, 0, 270, 300, 30, "Copier")

Repeat
  Event = WaitWindowEvent()
  
  Select Event
		Case #PB_Event_Timer
      Select EventTimer() ; Timer
				Case 1
					Texte.s = GetClipboardText()
					If Texte <> ""
						; On regarde si le texte existe déjà
						NombreElement = CountGadgetItems(#Liste)
						TexteExistant = 0
						For i = 0 To NombreElement - 1
							If GetGadgetItemText(#Liste, i) = Texte
								TexteExistant = 1
							EndIf
						Next
						; Si il n'existe pas, on l'ajoute
						If TexteExistant = 0
							If NombreElement = #Element_NombreMaxi
								; On retire le dernier élément
								RemoveGadgetItem(#Liste, NombreElement - 1)
							EndIf
							; On ajoute au début, donc position 0
							AddGadgetItem(#Liste, 0, Texte)
						EndIf
						
					EndIf
			EndSelect
      
		Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
				Case #Copier
					Selection = GetGadgetState(#Liste)
					If Selection >= 0 ; Si on a sélectionné qlq chose
						SetClipboardText(GetGadgetItemText(#Liste, Selection))
					EndIf
			EndSelect
	EndSelect
  
Until Event = #PB_Event_CloseWindow

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 12:08
par swolf
merci beaucoup, ce code est beaucoup plus clair
je vais tout de suite adapter le mien!! :mrgreen:

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 12:13
par swolf
par contre il y a deux choses que je n'ai pas compris:

1/ dans le passage

Code : Tout sélectionner

Selection = GetGadgetState(#Liste)
               If Selection >= 0 ; Si on a sélectionné qlq chose
                  SetClipboardText(GetGadgetItemText(#Liste, Selection))
               EndIf
je n'ai pas compris pourquoi tu n'as pas directement récupéré dans ta variable Selection le texte de l'élément sélectionné comme ceci:

Code : Tout sélectionner

selection$ = getGadgetText(#liste)
               If selection$ >= "" ; Si on a sélectionné qlq chose
                  SetClipboardText(selection$)
               EndIf
2/ le timer sert a faire la verification toutes les 50ms, mais c'est pour alleger les programme ou pour eviter les bugs du type de celui de mon premier post?

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 13:03
par Backup
swolf a écrit : If selection$ >= "" ; Si on a sélectionné qlq chose


oula !

ne serait-ce pas plutot ?
swolf a écrit : If selection$ <> "" ; Si on a sélectionné qlq chose

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 13:30
par Le Soldat Inconnu
le timer, oui, c'est pour alléger le code en ressource, et ça éviteras une surcharge dans la liste des évènements à cause d'une boucle pas assez rapide.

Pour info, on ne met jamais, je dis bien jamais, de delay dans la boucle d'évènement.
pour mettre un delay, il faut le coder comme ceci :

Code : Tout sélectionner

Repeat
  Repeat
    Event = WindowEvent()
    ; Gestion des évènements à mettre ici
  Until Event = 0
  Delay(1)
  ; Le code qui dois tourner quand on ne traite pas d'évènement, il peut-être lent (mais pas trop quand même)
Until ....

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 13:31
par swolf
@dobro ah oui... désolé!! :oops:

@LSI d'accord merci j'y penserai la prochaine fois

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 13:37
par Ar-S
swolf a écrit :par contre il y a deux choses que je n'ai pas compris:

1/ dans le passage

Code : Tout sélectionner

Selection = GetGadgetState(#Liste)
               If Selection >= 0 ; Si on a sélectionné qlq chose
                  SetClipboardText(GetGadgetItemText(#Liste, Selection))
               EndIf
je n'ai pas compris pourquoi tu n'as pas directement récupéré dans ta variable Selection le texte de l'élément sélectionné comme ceci:

Code : Tout sélectionner

selection$ = getGadgetText(#liste)
               If selection$ <> "" ; Si on a sélectionné qlq chose
                  SetClipboardText(selection$)
               EndIf
même résultat, même nombre de ligne... :)

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 13:44
par swolf
:mrgreen: ouai mais je me demandais si une solution était préférable a l'autre question légèreté etc...

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 13:48
par Backup
ben le traitement des chaines est toujours plus long je crois ;)

Re: programme de gestionnaire de presse papier

Publié : dim. 29/août/2010 15:46
par Le Soldat Inconnu
mais tu verras jamais la différence ... sauf dans un code de traitement monstrueux qui dure plusieurs secondes, ou qui doit être répété avec une période très faible. (ce qui est assez rare).
Dans ton cas, tu choisis selon ta préférence.

Re: programme de gestionnaire de presse papier

Publié : ven. 03/sept./2010 14:53
par swolf
re!
toujours dans le cadre de mon programme d' historique de presse papier, j'ai voulu gerer la copie d'images...
malheureusement, je rencontre un probleme au moment de la comparaison de l'image active avec les precedente servant a ne pas copier l'image presente dans le presse papier une infinité de fois: j'utilise ImageID(image courante) que je compare avec imageID(nomre d'elements - i) ou i est la variable d'incrementation de ma boucle de comparaison... (pfiiiou :P )
mais étant donné que imageID génère 2 identifiants différents pour 2 images identique, ben ma condition qui teste si l'image existe deja (euh vous suivez toujours???) est toujours fausse est donc mon element est infiniment ajouté a ma liste! :cry:

bon je vous donne e code pour plus de clarté :mrgreen:

code présent dans la boucle évènementielle, avec o = 1 en début de programme

Code : Tout sélectionner

               GetClipboardImage(1)
               If IsImage(1) 
                             
                 GetClipboardImage(o)
                 ID=ImageID(o)
                 nombreimages = CountGadgetItems(#list2)
                 imageexistante = 0
                 texte2$ = "image n°" + o
                 If nombreimages <> 0
                 
                  For i = 0 To nombreimages - 1
                  
                    i2 = ImageID(CountGadgetItems(#list2)-i)
                    If ID = i2
                     imageexistante=1
                    EndIf
                    
                  Next
                  
                  If imageexistante = 0
                    AddGadgetItem(#list2, 0, texte2$)
                    o = o+1
                  EndIf
                  
                 Else 
                   AddGadgetItem(#list2, 0, texte2$)
                   o = o+1
                 EndIf                  

              EndIf
il y a surement d'autres problèmes dans le code mais pour l'instant je n'ai cerné que celui-la

p-s désolé si l'explication est embrouillé mais j'ai eu du mal a formuler mon problème

Re: programme de gestionnaire de presse papier

Publié : ven. 10/sept./2010 19:46
par swolf
quelqu'un a-t-il une réponse svp?