Page 1 sur 1

Revenir à la ligne automatiquement.

Publié : mer. 06/févr./2008 18:05
par Ar-S
Salut à tous,

Voilà, je galère pour créer une tite procédure qui vous fera sourire...
J'ai un texte source$, je voudrais que

Ce que je cherche :
- Lorsque le texte arrive à N caractères, on y place un chr(34) pour que le retour à la ligne soit automatique.
Mais (car il y a un toujours un mais), il ne faut pas qu'un mot soit coupé ! Donc le programme doit compter le nombre de caractères et le nombre de mots que forme ces N caractères.

Donc que Si le Nième caractère n'est pas un espace, alors N=N-1 jusqu'à ce qu'il trouve un espace.

J'arrive donc à peu près à écrire le comportement de la procédure mais je n'arrive pas à la PBifier :?

Le pire c'est que j'ai déjà du voir ça 15 fois mais voilà, j'oublie vite quand je passe à d'autres choses

Merci de votre aide !

Publié : mer. 06/févr./2008 18:28
par case
petit code vite fait :)

Code : Tout sélectionner


Procedure.S autoreturn(t$,lenmax)
sp=0
Repeat
	If Len(t$)>=lenmax
		osp=sp+1
		sp=FindString(t$," ",osp)
		If sp>=osp
			If sp<=lenmax
				cut=sp-1
			Else
				ex=1
			EndIf
		Else
			ex=1
		EndIf
	Else
		cut=Len(t$)
		ex=1
	EndIf
Until ex=1
ProcedureReturn Left(t$,cut)
EndProcedure 
Debug "'"+autoreturn("ceci est un test",5)+"'"
Debug "'"+autoreturn("ceci est un test",50)+"'"
Debug "'"+autoreturn("ceci est un test",12)+"'"
petite procedure qui coupe la phrase a l'espace le plus proche de ta limite tout en y restant inferieur.

a toi de modifier le code pour coller a tes besoins :)

Publié : mer. 06/févr./2008 19:34
par Ar-S
(petit code vite fait :twisted: )

Merci Case, je vais étudier ça de prés, raz le bol de coincer avec de simples boucles.

en tout cas ce petit code va me servir moults fois ! ça va bien finir par rentrer :P

Publié : mer. 06/févr./2008 20:10
par case
si si vite fait :P

posté a 18h28 finissant le taf a 18h00 j'ai fait vite :) ça me surprend même :mrgreen:


en relisant tu devrais modifier

Code : Tout sélectionner

 If Len(t$)>=lenmax 
par

Code : Tout sélectionner

 If Len(t$)>lenmax 
en effet si la chaine est egal a la longueur maxi on a pas besoin de la traiter

Publié : mer. 06/févr./2008 21:37
par Ar-S
hum, j'ai 2 soucis à l'affichage,

- Si je lui demande de tronquer le nbr de caractères à 190, il n'affiche que les 190 1ers caractères et pas le reste.
- Il ne tiens pas compte des retours à la ligne. il faudrait que autoreturn vérifie 190 par ligne..

En fait ma source$ est une page web .rss que je récupère et dont je ne garde que le texte (pas le code). Donc c'est assez volumineux.

Publié : mer. 06/févr./2008 22:01
par Le Soldat Inconnu
Amuse toi bien : (j'ai fait ca en 20 minutes)

Le code renvoie à la ligne un texte en fonction d'une longueur en Pixel (facilement modifiable pour faire avec des caractères)

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; 

Procedure.s CreationTexte(Texte.s, Longueur.l, FontID)
  Protected NewList Ligne.s()
  Protected Image.l, Coupe.s, Caractere.s
  ; Pour compliquer, je ne limite pas en caractère mais en pixel
  ; Pour cela, j'utilise TextWidth( donc il faut un drawing
  
  Image = CreateImage(#PB_Any, 10, 10)
  StartDrawing(ImageOutput(Image))
    
    DrawingFont(FontID)
    
    ; On commence la première ligne
    AddElement(Ligne())
    
    For n = 1 To Len(Texte) ; Pour tous les caractères
      Caractere.s = Mid(Texte, n, 1)
      Select Caractere
        Case Chr(13) 
          ; Je fais rien avec ca, un passage de ligne d'un éditeur de texte, c'est chr(13) + chr(10)
        Case Chr(10) ; donc je m'occupe que du chr(10)
          AddElement(Ligne()) ; on passe à la ligne suivante
        Default ; Sinon, pour les autres caractères
          Ligne() + Caractere ; J'ajoute le caractere à la ligne
          If TextWidth(Ligne()) > Longueur ; Si le texte est trop long
            
            For nn = Len(Ligne()) To 1 Step -1 ; On remonte au dernier espace
              Caractere.s = Mid(Ligne(), nn, 1)
              
              If Caractere = " " ; au premier espace
                Coupe.s = Right(Ligne(), Len(Ligne()) - nn)
                Ligne() = Left(Ligne(), nn)
                AddElement(Ligne()) ; on passe à la ligne suivante
                Ligne() = Coupe
                Break
              EndIf
              
              If nn = 1 ; On n'a pas trouvé d'espace, donc le mot est trop long et ne rentre pas dans la ligne, donc on met un tiret
                Caractere = Right(Ligne(), 1) ; on récupère le dernier caractère
                Ligne() = Left(Ligne(), Len(Ligne()) - 1) + "-" ; on le remplace par un -
                AddElement(Ligne()) ; on passe à la ligne suivante
                Ligne() = Caractere
              EndIf
              
            Next
            
          EndIf
          
      EndSelect
    Next
    
  StopDrawing()
  FreeImage(Image)
  
  ; On regroupe le texte
  Texte = ""
  ForEach Ligne()
    If Texte <> ""
      Texte + Chr(10) ; Le séparateur de ligne ici
    EndIf
    Texte + Ligne()
  Next
  
  ProcedureReturn Texte
EndProcedure

;- Début du programme

Restore ExempleDeTexte
For n = 1 To 7
  Read Ligne.s
  Texte.s + Ligne + Chr(10)
Next

;- Police par défaut de windows
FontID = GetStockObject_(#DEFAULT_GUI_FONT)

Texte = CreationTexte(Texte, 200, FontID)

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 320, 320, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0 Or CreateGadgetList(WindowID(0)) = 0
  End
EndIf

EditorGadget(0, 10, 10, 300, 300) ; une zone de texte

SetGadgetText(0, Texte)

Repeat
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Menu
      Select EventMenu() ; Menus
          
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
          
      EndSelect
  EndSelect
  
Until Event = #PB_Event_CloseWindow

End

DataSection
  ExempleDeTexte:
  Data.s "PureBasic est un langage de programmation basé sur les règles du langage BASIC. Ses caractéristiques majeures sont :"
  Data.s ""
  Data.s "- Portabilité: PureBasic fonctionne actuellement pleinement sous Windows, AmigaOS et Linux."
  Data.s "- Rapidité: PureBasic est un véritable compilateur qui produit des exécutables compacts et optimisés."
  Data.s "- Simplicité: PureBasic utilise la syntaxe du langage BASIC, très répandue et simple à apprendre."
  Data.s ""
  Data.s "PureBasic a été conçu aussi bien pour les débutants que pour les programmeurs expérimentés. Nous avons consacré beaucoup de temps et d'efforts pour vous proposer un langage rapide, fiable et convivial. Malgré sa syntaxe de base simple et rapidement assimilable, les possibilités de PureBasic sont infinies, grâce à de nombreuses caractéristiques évoluées comme, entre autres, les pointeurs, structures, procédures, listes dynamiques, etc. Le programmeur expérimenté n'aura aucune difficulté à accéder aux structures du système d'exploitation et aux API's."
EndDataSection

Publié : mer. 06/févr./2008 22:39
par Ar-S
(20mn... mais vous faites un concours de vitesse ou bien c'est à celui qui m'humilie le plus vite :))

rolalala prendre les pixels comme limitation c'est superbe ! Merci LSI !

je n'ai plus qu'à le décortiquer et à l'insérer dans mon code (si j'y arrive..)
mais pour ce soir je bloque, mon cerveau n'est plus assez fonctionnel.

besoinnn dormirrrrrr :wink:

Merci de votre aide à tous les 2, je vais garder ces codes tel une tique gardant sa petite tête dans la chaire ! (faut vraiment que je me couche...)

A plus, je vous tiens au courant.

Publié : jeu. 07/févr./2008 2:01
par case
mon code coupe la ligne au nombre de caractere que tu desire et renvoi la partie coupée.

comme je te l'ai dit a toi d'adapter le code a tes besoins :)

ceci dit

Code : Tout sélectionner

Procedure.S autoreturn(t$,lenmax)
sp=0
Repeat
   If Len(t$)>=lenmax
      osp=sp+1
      sp=FindString(t$," ",osp)
      If sp>=osp
         If sp<=lenmax
            cut=sp-1
         Else
            ex=1
         EndIf
      Else
         ex=1
      EndIf
   Else
      cut=Len(t$)
      ex=1
   EndIf
Until ex=1
ProcedureReturn Left(t$,cut)
EndProcedure
mystring$          ="ceci est un exemple de phrase que je veux decouper "
mystring$=mystring$+"en petit morceaux et y inserer plein de retour a la "
mystring$=mystring$+"ligne pour faire chouette comme vous pouvez le constater"
mystring$=mystring$+" je n'ai pas specialement d'idées pour ecrire cette super"
mystring$=mystring$+" longue phrase et comme je n'ai pas le texte RSS de ARS je"
mystring$=mystring$+" dois donc improviser bien sur je peux aussi copier coller"
mystring$=mystring$+" le texte en entier comme ca j'aurais un super gros texte... c'est ce que je vais faire "
mystring$=mystring$+mystring$
mystring$=mystring$+mystring$
mystring$=mystring$+mystring$
mystring$=mystring$+mystring$
;---------
Repeat
	out$=autoreturn(mystring$,50)								; on met dans out$ la partie de la chaine correspondant a la taille voulue
	Debug out$
	mystring$=Trim(Right(mystring$,Len(mystring$)-Len(out$)))	; on enleve a la chaine originale ainsi que les espace de debut et de fin	
	montext$=montext$+out$+Chr(34)								; on ajoute la chaine de la bonne taille au texte resultat et un retour a la ligne chr(34) ??? 
																; je ne vois pas le raport avec un retour a la ligne avec le chr34 mais cela depend sans doute de l'encodage
																; utilisé par notre cher ami ARS
Until mystring$=""
;---------
Debug montext$

Publié : jeu. 07/févr./2008 14:29
par Ar-S
Me voilà de retour,

J'ai dit chr(34) pour le retour à la ligne, je voulais évidement dire chr(10). Comme je vous l'ai dit, hier soir j'étais HS..

Je vais donc étudier vos 2 codes (mon précieux) et je vous dits ce qu'il en est.

Merci encore les potos.