Page 1 sur 2

UserLib RequesterPlus

Publié : dim. 09/mai/2004 3:33
par Flype
Je vous présente ma nouvelle UserLib "RequesterPlus".
Concue pour vous apporter de nouvelles requête utilisateur...

Cette libs n'en est qu'à ses débuts, elle va grossir
avec pleins d'autres type de requester dans le futur :P

Nb: Compilé avec TailBite 1.1 PR 10 et PureBasic 3.90

Vous pouvez la télécharger ici :

http://www.serveurperso.com/~flype/Pure ... erPlus.zip

Image

Publié : dim. 09/mai/2004 6:09
par Flype
J'ai ajouté deux nouvelles fonctions :

Code : Tout sélectionner

TextRequester(WindowID.l, Title.s, Message.s, Text.s)
TextBox(WindowID.l, Title.s, Message.s, Text.s)

Hello

Publié : dim. 09/mai/2004 13:20
par DominiqueB
Merci pour ton code, cool.

J'ai fait quelques essais:
a) la fonction textbox() est repportée comme inexistante dans ta librairie, j'ai donc recompilé le source avec tailbite, ca marche à nouveau.
b) dans l'exemple Requesterplusdemo le nombre de paramètres est incorrect, les 2 derniers ne correspondent pas à la description dans l'aide et lors de la compilation l'editeur le signale "incorrect number of parameters".
c) le Aboutshellrequester dans l'exemple "RequesterPlus_AboutShell.pb" plante sur le 2ème appel. Je pensse que c'est le "CatchExeBigIcon()" qui coince, car le 1er appel marche impec.

En tout cas, beau travail ! Je penses qu'on va aller loing avec cet utilitaire "Tailbite" . . .
Merci.

Publié : dim. 09/mai/2004 13:33
par Flype
je devrais pas je sais mais j'ai fais un example qui
utilise mon autre lib ( CatchExeIcon ) alors si tu l'as installé ca pose pb c sûr...

j'ai recompiler mon archive et enlever les petits desagréments...

merci

oops

Publié : dim. 09/mai/2004 16:17
par DominiqueB
Tout marche parfaitement à présent, sauf . . .
Décidément le 2ème appel à AboutShellRequester () coince, mais après des tests il semble que ce soit la fonction CatchExeBigIcon() qui ait un problème.
a) ne faut-il pas que cette fonction ne soit exécutée que depuis un exécutable, pas en mode debug depuis l'éditeur ?
b) Le zip de la librairie CatchExeIcon fonctionne lorsqu'on lance l'exécutable que tu as joint, mais dès que je compile le source fournit il y a plantage ! L'icone fournie est-elle bien celle que tu as utilisée pour compiler ton exe ? Est-ce qu'elle ne devrait pas contenir 2 icones: une petite et une grande, qui puissent être récupérées par tes fonctions ?
Moi je n'en voit qu'une, est-ce normal ?

A+

Publié : dim. 09/mai/2004 16:39
par Flype
c'est vrai qu'il n'y a qu'une icone dans mon icone ( la plus petite )
mais chez moi la grande est comment dire "zoomée" sur XP...
je pensais que ca marcherait chez tout le monde :roll:
t'as quel Windows ?

je v regarder de + pres

Et un petit CalendarRequester ?

Publié : dim. 09/mai/2004 16:52
par DominiqueB
J'ai aussi XP pro, donc ya un blème ?

Une proposition de code pour ta lib: un DateRequester() ?

Code : Tout sélectionner

Procedure CalendarCallback(Window.l, message.l, wParam.l, lParam.l)
  Result = #PB_ProcessPureBasicEvents
  ;#MCN_SELECT = -746 ; MCN_SELECT = MCN_FIRST + 4
   
  Select message
    Case #WM_NOTIFY
      *hdrX.NMDATETIMECHANGE = lParam
      
      Select *hdrX\nmhdr\code
        Case  #MCN_SELECT
          
          SendMessage_(WindowID(0), #WM_CLOSE, 0, 0)
          Result = #True
        
      EndSelect
      
  EndSelect
  
  ProcedureReturn Result
EndProcedure


; Select a date with the Windows Calendar.
Procedure GetDate(DateInit.s)
;#MCM_SETCURSEL = $1002
;#MCM_GETCURSEL = $1001

dt.INIT_COMMON_CONTROLSEX\dwSize = SizeOf(INIT_COMMON_CONTROLSEX)
dt\dwICC = #ICC_DATE_CLASSES
InitCommonControlsEx_(@dt)

st.SYSTEMTIME\wYear = Val(Left(DateInit, 4))
st\wMonth = Val(Mid(DateInit, 5, 2))
st\wDay = Val(Right(DateInit, 2))

If OpenWindow(0, 165, 0, 196, 156, #PB_Window_WindowCentered | #PB_Window_Invisible, "Choisissez une date:")
  hndlCalendar.l = CreateWindowEx_(0, "SysMonthCal32", "DateTime", #WS_CHILD | #WS_VISIBLE | #WS_BORDER, 0, 0, 196, 156, WindowID(0), 0, GetModuleHandle_(0), 0)
  SendMessage_(hndlCalendar, #MCM_SETCURSEL, 0, @st)
  HideWindow(0, 0)
  
  SetWindowCallback(@CalendarCallback())
  
  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #PB_Event_CloseWindow And EventWindowID() = 0
  
  SendMessage_(hndlCalendar, #MCM_GETCURSEL, 0, @time.SYSTEMTIME)
  CloseWindow(0)
  ProcedureReturn Val(FormatDate("%yyyy%mm%dd", Date(time\wYear, time\wMonth, time\wDay, 0, 0, 0)))
EndIf

EndProcedure
Il faudra peut-être l'adapter pour l'inclure dans ta librairie, moi je l'utilise sous forme de dll. On peut même lui passer une date initiale en paramètre, et elle me retourne la date choisie par l'utilisateur sous la forme: "20040509" c'est le format dont j'avais besoin. On pourrait lui passer un 2ème paramètre qui serait soit une chaine vide, soit une chaine de format du genre: "AAAA/MM/JJ", ou "JJ-MM-AAAA", ou "JJ/MM/AA" il faudrait alors interprèter le format pour retourner la date dans le format choisi...
On appellerais alors: DateRequester("09/05/2004", "JJ/MM/AAAA")
Ca pourrait faire un bon DateRequester(), non ?

Publié : dim. 09/mai/2004 19:17
par Flype
j'ai presque finit l'implémentation :wink:

mais dis moi, comment tu détruit / libère le CalendarGadget
c indispensable pour ma librarie :?: avec DeleteObject_() ?

en attendant regarde le résultat :

Image

la beta donc :

http://www.serveurperso.com/~flype/Pure ... usBeta.zip

Bonne question ?

Publié : dim. 09/mai/2004 22:11
par DominiqueB
Cool, mais la je cale ! !

Il n'y a pas d'objet à libérer, le Calendar est une fenêtre donc elle est libérée par le closewindow()
Autrement j'avoue que j'ai une lacune sur ce point .
Après recherche, il semble qu'il faille un DestroyWindow_() avec le handle obtenu lors du CreateWindowEx(), mais n'est-ce pas ce que fait le closewindow() de Pure ?

La il nous faut de l'aide, j'utilise ce gadget sous forme de dll et si cela cause une perte de ressources alors il nous faut confirmation !

A+

Publié : dim. 09/mai/2004 22:31
par Flype
je suis bien d'accord :roll:

en tout cas moi je fais un DeleteObject_( hCalendar )
à priori j'ai pas relevé de problème
mais chui pas sûr du tout...

Publié : dim. 09/mai/2004 23:38
par Flype
réponse de freak sur le forum anglais :

http://purebasic.myforums.net/viewtopic.php?t=10821

C'est donc bien DestroyWindow_() qu'il faut utiliser :wink:

heu . .

Publié : dim. 09/mai/2004 23:48
par DominiqueB
heu oui et non, car si on détruit la fenêtre (ce qui est le cas car on fait un closewindow()) la fenêtre étant détruite, les resources du calendar sont aussi libérées ?
"The DeleteObject function deletes a logical pen, brush, font, bitmap, region, or palette, freeing all system resources associated with the object. After the object is deleted, the specified handle is no longer valid."
En tout cas ce n'est pas DeleteObject.

C'est vrai que l'aide francaise n'est pas très locace :(
Syntaxe

CloseWindow(#Fenetre)
Description

Ferme la #Fenetre spécifiée.

Mais je penche pour utiliser comme tu le dis DestroyWindow(), car la fenêtre est créée par une fonction windows en direct, et pas par une fonction pure, donc à moins que CloseWindow() ne soit une facade de DestroyWindow() il vaut mieux utiliser cette dernière ?
Fred, si tu lis qu'est ce qu'on doit utiliser dans ce cas ?


Enfin j'essaie de comprendre :)
on a probablement raison tous les deux ?

Re: heu . .

Publié : lun. 10/mai/2004 0:06
par Chris
DominiqueB a écrit :heu oui et non, car si on détruit la fenêtre (ce qui est le cas car on fait un closewindow()) la fenêtre étant détruite, les resources du calendar sont aussi libérées ?

Enfin j'essaie de comprendre :)
on a probablement raison tous les deux ?
Mon idée: c'est peut-être pas la bonne mais bon!!! :roll:
Ca sert à quoi, ce gadget?, sinon à récupérer ou à fournir une date!

Donc, à partir du moment ou tu as stocké les valeurs dont tu as besoin, qu'est-ce qui empèche de libérer les ressource?
Parce que, finalement, ce n'est ni plus ni moins qu'une boîte de dialogue un peu (beaucoup), améliorée.

Chris :)

Publié : mar. 18/mai/2004 19:40
par Bernard
J'essaie d'utiliser la version beta sous windows 2000 or j'obtiens une boite sans message à par une croix blanche sur un rond rouge.

Si j'essaie de recréer la librairie à partir du source avec Tailbite j'ai l'erreur suivante : Line 172: SetWinBackGroundImage() is not a function, an array or linked list le canal de communication a été fermé

Est-il necessaire d'ajouter une librairie supplémentaire ?

Je precise que la version standard fonctionne bien.

Merci de vos précisions

Publié : mar. 18/mai/2004 20:15
par Chris
Il me semble que c'est une fonction de PureTools.

Cherche sur le forum, l'adresse y est, il me semble.

Le lien sur le forum n'a plus l'air valide. Danilo a changé de version.
voila le nouveau lien :
http://danilo.purearea.net/PureTools_I_021.zip
Chris :)