Page 1 sur 1

Simplifier le PB

Publié : sam. 08/août/2009 16:02
par KrisJNT
Bonjour à tous !
Avant tout, je souhaite dire : je connais le C++, mais je n'ai pas du tout envie de programmer avec... Trop rigoureux pour moi :)
Mais, par exemple, avec Qt, la programmation est bien plus simple, puisque Qt n'utilise que des classes.
Je me suis alors dit : pourquoi ne simplifier le langage PB en faisant pareil ?

J'ai alors débuté ce projet : L'include "Simplificator.pbi"
dont voici le début de code :

Code : Tout sélectionner

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;L'include débute ici
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;{
Macro _
  \hInterface\
EndMacro

Macro Assign
  \hInterface =
EndMacro

;--------------------------------- Windows

Interface iWindow
  Open(flags = #PB_Window_SystemMenu)
  SetTitle(title$)
  Geometric(x, y, w, h)
  SetSignal(signal, proc)
  Close()
  Wait()
EndInterface

Structure signals
  *close
EndStructure

Structure window
  hInterface.iWindow
  handle.l
  events.signals
EndStructure

Procedure Open(*self, flags=#PB_Window_SystemMenu)
  *struct.window = *self
  *struct\handle = OpenWindow(#PB_Any, 10, 10, 200, 100, "", flags)
EndProcedure

Procedure SetTitle(*self, title$)
  *struct.window = *self
  SetWindowTitle(*struct\handle, title$)
EndProcedure

Procedure Geometric(*self, x, y, w, h)
  *struct.window = *self
  ResizeWindow(*struct\handle, x, y, w, h)
EndProcedure

Procedure Close(*self)
  *struct.window = *self
  CloseWindow(*struct\handle)
EndProcedure

Structure thSignalStruct
  signal.l
  proc.l
EndStructure

Procedure thSignal(*struct)
  *rec.thSignalStruct = *struct
  Repeat
    If WaitWindowEvent() = *rec\signal
      CreateThread(*rec\proc, 0)
    EndIf
  ForEver
EndProcedure

Procedure SetSignal(*self, signal, proc)
  *struct.window = *self
  Select signal
    Case #WM_CLOSE : *struct\events\close = proc
  EndSelect
EndProcedure

Procedure Wait(*self)
  *struct.window = *self
  Repeat 
  Select WaitWindowEvent()
    Case #WM_CLOSE : CreateThread(*struct\events\close, 0)
  EndSelect
  ForEver
EndProcedure

;--------------------------------- Buttons

Interface iButton
  Create(flags = #WS_VISIBLE)
  Geometric(x, y, w, h)
  SetText(text$)
EndInterface

Structure button
  hInterface.iButton
  handle.l
EndStructure

Procedure createB(*self, flags)
  *struct.button = *self
  *struct\handle = ButtonGadget(#PB_Any, 0, 0, 100, 20, "")
EndProcedure

Procedure GeometricB(*self, x, y, w, h)
  *struct.button = *self
  ResizeGadget(*struct\handle, x, y, w, h)
EndProcedure

Procedure SetTextB(*self, title$)
  *struct.window = *self
  SetGadgetText(*struct\handle, title$)
EndProcedure

;--------------------------------- Misc

Procedure Msg(flags, title.s, msg.s)
  ProcedureReturn MessageRequester(title, msg, flags)
EndProcedure

DataSection
  windowProc:
    Data.l ?window
  window:
    Data.l @Open(), @SetTitle(), @Geometric(), @SetSignal(), @Close(), @Wait()
  buttonProc:
    Data.l ?button
  button:
    Data.l @CreateB(), @GeometricB(), @SetTextB()
EndDataSection
;}

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;L'exemple débute ici
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Global hello.window Assign ?windowProc
Global button1.button Assign ?buttonProc

Procedure closeHello(null)
  If Msg(#MB_ICONEXCLAMATION|#MB_YESNO, "Attention !", "Vous allez fermer le programme !") = #IDYES
    hello _ Close()
    End
  EndIf
EndProcedure

hello _ Open()
hello _ Geometric(50, 50, 150, 150)
hello _ SetTitle("Hello")
hello _ SetSignal(#WM_CLOSE, @closeHello())

button1 _ Create()
button1 _ Geometric(0, 0, 150, 150)
button1 _ SetText("Cliquez ici !")

hello _ Wait()

Que ceux qui souhaitent m'aider à faire ce projet... s'y mettent maintenant et postent ce code avec leurs fonctions en plus ! :P

Si vous avez des suggestions encore plus intéressantes, n'hésitez pas à me le dire.

Mine de rien c'est quand même plus clair (à mon goût) d'écrire :

Code : Tout sélectionner

Include "Simplificator.pbi"

Global hello.window Assign ?windowProc
Global button1.button Assign ?buttonProc

Procedure closeHello(null)
  If Msg(#MB_ICONEXCLAMATION|#MB_YESNO, "Attention !", "Vous allez fermer le programme !") = #IDYES
    hello _ Close()
    End
  EndIf
EndProcedure

hello _ Open()
hello _ Geometric(50, 50, 150, 150)
hello _ SetTitle("Hello")
hello _ SetSignal(#WM_CLOSE, @closeHello())

button1 _ Create()
button1 _ Geometric(0, 0, 150, 150)
button1 _ SetText("Cliquez ici !")

hello _ Wait()
au lieu de :

Code : Tout sélectionner

#hello = 0
#button1 = 0

OpenWindow(#hello, 50, 50, 150, 150, "Hello")
ButtonGadget(#button1, 0, 0, 150, 150, "Cliquez ici")

Repeat
  Select WaitWindowEvent()
  Case #PB_Event_CloseWindow
      If Msg(#MB_ICONEXCLAMATION|#MB_YESNO, "Attention !", "Vous allez fermer le programme !") = #IDYES
      CloseWindow(#hello)
      End
    EndIf
  EndSelect
ForEver
ou encore ça (projet) :

Code : Tout sélectionner

Include "Simplificator.pb"
Global comp.serialport Assign ?serialportProc
Global beep.sound Assign ?soundProc ; Utiliser BASS Audio ?
;Et même pourquoi pas Next-3D ?!

comp _ Open()
comp _ Write(@"Bienvenue !")
comp _ Close()

beep _ Create()
sineWave = sine(440, 500) ; Une fonction (fournie ou pas avec Simplificator) qui générerait un buffer audio d'une onde sinusoïdale de 440Hz pendant une demie seconde.
beep _ SetBuffer(sineWave)
beep _ Play(0)
beep _ Free()

Pas vrai ?
De plus, on pourrait même ajouter des fonctions à Simplificator comme window _ SetTransparent(color, alpha, flags) qui n'existent pas en PB, que l'on doit aller chercher sur la MSDN ou autre, parce que 'Aide Contextuelle non disponible'... :roll:

Bon travail ! Moi-même je continue de réfléchir là-dessus.

@ très bientôt

Kris :wink:

Re: Simplifier le PB

Publié : sam. 08/août/2009 18:43
par Backup
KrisJNT a écrit : Mine de rien c'est quand même plus clair (à mon goût) d'écrire :
1 Include "Simplificator.pbi"
2 Global hello.window Assign ?windowProc
3 Global button1.button Assign ?buttonProc
4 Procedure closeHello(null)
5 If Msg(#MB_ICONEXCLAMATION|#MB_YESNO, "Attention !", "Vous allez fermer le programme !") = #IDYES
6 hello _ Close()
7 End
8 EndIf
9 EndProcedure

10 hello _ Open()
11 hello _ Geometric(50, 50, 150, 150)
12 hello _ SetTitle("Hello")
13 hello _ SetSignal(#WM_CLOSE, @closeHello())

14 button1 _ Create()
15 button1 _ Geometric(0, 0, 150, 150)
16 button1 _ SetText("Cliquez ici !")

17 hello _ Wait()
au lieu de :
1 #hello = 0
2 #button1 = 0

3 OpenWindow(#hello, 50, 50, 150, 150, "Hello")
4 ButtonGadget(#button1, 0, 0, 150, 150, "Cliquez ici")

5 Repeat
6 Select WaitWindowEvent()
7 Case #PB_Event_CloseWindow
8 If Msg(#MB_ICONEXCLAMATION|#MB_YESNO, "Attention !", "Vous allez fermer le programme !") = #IDYES
9 CloseWindow(#hello)
10 End
11 EndIf
12 EndSelect
13 ForEver
:

que tu veuille faire ton propre langage qui reprends les fonctions de Purebasic
ma foix pourquoi pas ...(attention au droit..)

mais dans ton exemple le code original fait 13 lignes , contre 17 avec ton code "simplifié" ;)

perso je prefere le code Purebasic pour le coup !! :D

Publié : sam. 08/août/2009 21:44
par Le Soldat Inconnu

Code : Tout sélectionner

Procedure Wait(*self) 
 *struct.window = *self 
 Repeat  
 Select WaitWindowEvent() 
  Case #WM_CLOSE : CreateThread(*struct\events\close, 0) 
 EndSelect 
 ForEver 
EndProcedure 
Ne fonctionne pas avec plusieurs fenêtres

il faut tester eventwindow()

Publié : sam. 08/août/2009 23:37
par poshu
Il me manque une réponse type "Regarde du coté des précompilo POO" ou encore "M'en fou comme de l'an 40" au poll...

Publié : lun. 10/août/2009 9:45
par KrisJNT
@Dobro,
je suis d'accord avec toi sur le nombre de lignes, mais c'est surtout la clarté et l'aisance de programmation que je recherche :)

@LSI
en effet, j'ai pas encore réussi à faire plusieurs fenêtres et même plusieurs boutons. :?

Publié : lun. 10/août/2009 10:19
par Ar-S
J'attends de voir...
Même si la clarté est au rendez vous, cela me fait réapprendre une nouvelle syntaxe alors que j'ai déjà mis pas mal de temps (et c'est pas terminé) a apprendre celle de PB.. Et là je coince.

Publié : lun. 10/août/2009 19:20
par SpaceMan
je ne sais pas si on peut encore faire plus simple que PB mais tout comme Ar-S j'attends de voir... car j'ai essayé plusieurs langages appelés basic mais qui malgré leur mot clé et syntaxe sont vraiment répulsifs(du moins pour moi) Ibasic, Realbasic, visualBasic... PB, je l'ai essai essayé et je l'ai adopté parce que c'est simplement du Basic pur...