Page 2 sur 2

Publié : mar. 19/mai/2009 23:08
par TazNormand
en effet, la barre est très haute !!! je suis hors jeu

néanmoins, merci pour le source, il y a moyen de faire des trucs sympa.

il me semble que tout ça vient d'un poste appelé "mini intro" non ?

une demande de JB13 même, je dirai ?

Publié : mer. 20/mai/2009 0:35
par case
mon message requester a moi :) j'ai voulu faire un truc comme en gfa basic sur atari pour les connaisseurs ^^

enregistrez cette image dans le répertoire ou vous compilez l'exemple
Image
ou commentez la ligne pour charger l'image
ou utilisez votre propre image XD

Code : Tout sélectionner

;----------------------------------------------------------------------
;boite de dialogue comme en gfa sur atari st
;syntaxe : requester(titre$,texte$,reponses$[,image])
;le titre de la fenetre est une chaine de caractere normale
;le texte est multiligne les lignes sont séparées par le caractere |
;le nombre de reponses possible est illimité (sauf par la taille de l'ecran)
;chaque bouton est delimité par le caractere |
;il est posible de specifier une image comme icone elle sera positionée en haut a gauche de la fenetre
;---------------------------------------------------------------------
;auteur Case,forums pure basic.  domaine public
Procedure requester(req_title$,req_txt$,req_reply$,req_icon=0)
  req_lines=CountString(req_txt$,"|")+1
  req_winheight=req_lines*16
  ; verifie la plus grande longueur de chaine dans le résumé
  For req_a=1 To req_lines
    req_l=Len(StringField(req_txt$,req_a,"|"))
    If req_mx<req_l
      req_mx=req_l
    EndIf
  Next
  ;verrifie si le contenu des boutons au total est plus grand que laplus grande des chaines
  If req_mx<Len(req_reply$)+2
    req_mx=Len(req_reply$)+2
  EndIf
  ;verifie la presence d'une image en tant qu'icone et modifie la taille de la fenetre en focntion
  If req_icon<>0
    req_icon_h=ImageHeight(req_icon)+4
    req_icon_w=ImageWidth(req_icon)+4
    If req_winheight<req_icon_h
      req_winheight=req_icon_h
    EndIf
  Else
    req_icon_h=0
    req_icon_w=0
  EndIf
  ;ouvre la fenetre
  req_main=OpenWindow(#PB_Any,0,0,req_mx*6+req_icon_w,req_winheight+20,req_title$,#PB_Window_TitleBar| #PB_Window_ScreenCentered)
  ;ecrit les lignes de texte
  For req_a=0 To req_lines-1
    TextGadget(#PB_Any,req_icon_w,req_a*16,req_mx*6,16,StringField(req_txt$,req_a+1,"|"))
  Next
  ;cree les boutons
  req_nb_b=CountString(req_reply$,"|")+1
  NewList req_buttons()
  req_butsize=(WindowWidth(req_main))/req_nb_b
  For req_a=1 To req_nb_b
    AddElement(req_buttons())
    req_buttons()=ButtonGadget(#PB_Any,(req_a-1)*req_butsize,req_winheight,req_butsize,20,StringField(req_reply$,req_a,"|"))
  Next

  Repeat
    If req_icon<>0
      StartDrawing(WindowOutput(req_main))
      DrawImage(ImageID(req_icon),0,0)
      StopDrawing() 
    EndIf
    req_ev=WaitWindowEvent()
  Until req_ev=#PB_Event_Gadget
  ForEach req_buttons()
    If req_buttons()=EventGadget()    
       req_ret=ListIndex(req_buttons())
       ClearList(req_buttons())
       CloseWindow(req_main)
      ProcedureReturn  req_ret+1 ; pour eviter de renvoyer un zero
    EndIf
  Next
      ProcedureReturn 0 ; erreur
EndProcedure
  ; exemple d'utilisation
  UsePNGImageDecoder()
  img=LoadImage(#PB_Any,"Image2.png") ; charger une image pour l'exemple
  ;
  reply=requester("boite d'alerte GFA like","enorme j'en ai révé|c'est a ma portée enfin|et super flexible","ok|mitho|lol")
  Select reply
  Case 1
    requester("fin du programme","jeul savais","ok",img)
  Case 2 
    requester("Mitho","comment ca mitho ?","je m'excuse",img)
  Case 3
    requester("lol ?", "rien d'amusant la dedans","pas drole",img)
  EndSelect

Publié : mer. 20/mai/2009 8:36
par Backup
manque un endif quelque part ... :?

purée non !!

c'est le pluggin de Erix14 qui merdoie !!! sorry !!


bon je viens d'essayer ton requester !

ben c'est tout simplement excellent !! :) j'adopte :)

encore un code qui devrai etre integré dans le Purebasic !!

a proposer a Fred !! :)

Publié : mer. 20/mai/2009 12:22
par case
la taille de la fenêtre est calculée en multipliant le nombre de caractères par une valeur arbitraire, 6 horizontalement et 16 verticalement, ce qui si l'on a pas la même police de caractère ni la même taille de police est imprécis.

je n'ai pas trouvé le moyen de calculer la taille exacte en pixel des textes
textwidth() et textheight() nécessite un écran d'ouvert ou une fenêtre, ceci dit je n'ouvre la fenêtre qu'une fois sa taille calculée... donc je ne peux pas connaitre a l'avance la taille exact du texte utilisé par le requester

si quelqu'un a une idée ,)

dobro il s'enflamme il vois déjà mon code intégré a pb ;)

Publié : mer. 20/mai/2009 12:38
par TazNormand
Peut-être que l'API GetTextExtentPoint32() peut t'aider.

je peux pas t'en dire plus ni tester, je suis en version Demo de PB :cry:

doc de l'API ici : GetTextExtentPoint32

Publié : mer. 20/mai/2009 13:07
par gnozal
Pour TextWidth() comme pour GetTextExtentPoint32_(), il faut un contexte (hdc).
On peut cacher la fenêtre, faire les calculs, redimensionner les gadgets et/ou la fenêtre), puis afficher la fenêtre.
Exemple rapide :

Code : Tout sélectionner

Procedure GadgetTextWidth(Gagdet, GagdetText.s)
  Protected Size.Size, hdc, hFontOld
  hdc = GetDC_(GadgetID(Gagdet)) 
  hFontOld = SelectObject_(hdc, GetGadgetFont(Gagdet)) 
  GetTextExtentPoint32_(hdc, @GagdetText, Len(GagdetText), @Size) 
  SelectObject_(hdc, hFontOld) 
  ReleaseDC_(GadgetID(Gagdet), hdc)
  ProcedureReturn Size\cx
EndProcedure

If OpenWindow(0, 450, 200, 380, 104, "Largeur en fonction du texte", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_Invisible)
  
  Texte.s = "Texte du bouton (essayez différentes longueurs !)"
  
  ButtonGadget(0, 0, 32, 0, 36, Texte)
  SetGadgetFont(0, LoadFont(0, "Arial", 10))
  ResizeGadget(0, #PB_Ignore, #PB_Ignore, GadgetTextWidth(0, Texte) + GetSystemMetrics_(#SM_CXEDGE) * 2, #PB_Ignore)
  ResizeWindow(0, #PB_Ignore, #PB_Ignore, GadgetWidth(0), #PB_Ignore)
  HideWindow(0, #False)
  
  Repeat
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
  
EndIf

Publié : mer. 20/mai/2009 13:25
par Backup
case a écrit : dobro il s'enflamme il vois déjà mon code intégré a pb ;)
et pourquoi pas !!.??

comme je l'ai suggeré sur le forum anglais
on peut tres bein faire avancer le langage, en y mettant nos contributions

cela permetrai d'enrichire les bibliotheques , sans avoir a recourir a des lib externe !!

de plus cela donnerai de la motivation de la part des membres !!

bien sur ce serai du "boulot" benevole , sans rémunerations , mais notre rémuneration, serai que le langage Purebasic serai a notre image !! :)

ptete pas si con mon idée non ?

Publié : mer. 20/mai/2009 19:25
par case
jamais dit que c'était con :)

Publié : jeu. 21/mai/2009 0:59
par Geo Trouvpatou
Salut.

Hummmm!!!! ça sent bon part ici, je vois que case a concocté une bonne petite mixture.

Comme je disait dans mon 3ème post ici, j'avais trouvé un petit code sympa pour faire un messageRequester perso.
Mais j'aurais eu pas mal de boulot pour supprimer tout ce qui était inutile pour moi.

Tu utilises un peu le même principe que lui, pour le système des séparateurs qui détermine chaque lignes de texte et chaque boutons.

Sauf que ton code est juste ce qu'il faut pour ma pomme.
A première vue, il n'y a pas d'Api Windows, donc no problemo sous Linux :D

Si tu vas voir mon post, tu verras que Dobro a filé une super combine (pour windows) pour ce qui est des sons d'avertissements.

Merci d'avance, tu m'as mâché le travail.

Bye.

[EDIT] C'était plus fort que moi, j'ai donc testé sous Linux et cela se comporte bien.
Par contre de petits problèmes d'apparence à cause d'une police trop grosse, mais bon je pense que je réussirais à m'en sortir, le code n'est pas trop complexe.

Petit défaut aussi, on ne peut pas mettre de long mot sur les boutons.
Ex : Annuler.
Mais bon, pas trop dur de mon côté à trouver l'astuce, puisqu'il n'y aura que les noms de bouton habituel d'un messageRequester classique.
Donc à chaque mot je determinerais une taille qui sera OK chez Win et Nux.

Publié : jeu. 21/mai/2009 1:39
par case
oO

comment ca pas de long mots dans les boutons ?

j'ai essayé avec anticonstitutionnellement et ca passe :)

Image

ou alors je comprend pas ce qui ne vas pas

comme je l'ai dit, mon problème est en cas de police différente il faut bidouiller ton source pour trouver le bon multiplicateur et ca devrais rouler

Publié : jeu. 21/mai/2009 2:05
par Geo Trouvpatou
Tiens essaies ça :

Code : Tout sélectionner

reply=requester("boite d'alerte GFA like","enorme j'en ai révé|c'est a ma portée enfin|et super flexible","j'ai essayé avec anticonstitutionnellement et ca passe|aagggggggggggggggggggggggggggggggggggggaa|ca passe") 
Bon ok le mot "aagggggggggggggggggggggggggggggggggggggaa" ne se trouve pas dans le dico, mais il y a peut-être cause d'un potentiel bug.

Et pour tout ce que j'ai dit dans mon EDIT, cela se passe sous Linux.

Et comme dit dans mon précédent message, t'inquiètes je vais réussir à adapter :wink:
C'est juste ce qu'il me fallait, tu as dû lire dans mes pensées.

Bye.