Module geometrie

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Module geometrie

Message par Micoute »

Bonsoir à tous, j'ai fait ce petit module qui ne demande qu'a grandir, il suffit de le nourrir, pour montrer la facilité et la puissance des module et j'espère qu'il va plaire !

Code : Tout sélectionner

;Module géométrie

EnableExplicit

DeclareModule Police
  Global FontID1
  Global FontID2
  Global FontID3
  
EndDeclareModule

DeclareModule Verification
  
  Declare checkFloatInput(gadget)
  
EndDeclareModule

;carré
DeclareModule Carre
  
  Enumeration Fenetre
    #Fenetre_Carre = 1
  EndEnumeration
  
  Enumeration Gadgets
    #Str_cote_carre
    #Str_Surface_carre
    #Str_Diagonale_carre
    #Str_perimetre_carre
    #Carre
  EndEnumeration
  
  Structure ObjetCarre
    ID.i
    Cote.d
    Surface.d
    Diagonale.d
    Perimetre.d
  EndStructure
  
  Global.ObjetCarre *Carre
  
  Declare Ouvrir_Fenetre_Carre()
  Declare CreerCarre(ID, Co.d)
  
EndDeclareModule
;cercle
DeclareModule Cercle
  
  Enumeration Fenetre
    #Fenetre_Cercle = 2
  EndEnumeration
  
  Enumeration Gadgets
    #Str_perimetre_cercle = 5
    #Str_Rayon_cercle
    #Str_Surface_Cercle
    #Str_Diametre_Cercle
    #Cercle
  EndEnumeration
  
  Structure ObjetCercle
    ID.i
    Rayon.d
    Diametre.d    
    Perimetre.d
    Surface.d
  EndStructure
  
  Global.ObjetCercle *Cercle
  
  Declare Ouvrir_Fenetre_Cercle()
  Declare CreerCercle(ID, Rayon.d)
  
EndDeclareModule
;rectangle
DeclareModule Rectangle
  
  Enumeration Fenetre
    #Fenetre_Rectangle = 3
  EndEnumeration
  
  Enumeration Gadgets
    #Str_perimetre_Rectangle = 10
    #Str_Largeur_Rectangle
    #Str_Longueur_Rectangle
    #Str_Surface_rectangle
    #Str_Diagonale_rectangle
    #Rectangle
  EndEnumeration
  
  Structure ObjetRectangle
    Id.i
    Longueur.d
    Largeur.d
    Perimetre.d
    Surface.d
    Diagonale.d
  EndStructure
  
  Global.ObjetRectangle *Rectangle
  
  Declare Ouvrir_Fenetre_Rectangle()
  Declare CreerRectangle(Id, Longueur.d, Largeur.d)
  
EndDeclareModule
;anneau
DeclareModule Anneau
  
  Enumeration Fenetre
    #Fenetre_Anneau = 4
  EndEnumeration
  
  Enumeration gadgets
    #Str_DE = 16
    #Str_DI
    #Str_DIn
    #Str_La
    #Str_SU
    #Anneau
  EndEnumeration
  
  Structure ObjetAnneau
    ID.i
    DiametreInterne.d
    DiametreExterne.d
    DiametreIntermediaire.d
    Largeur.d
    Surface.d
  EndStructure
  
  Global.ObjetAnneau *Anneau
  
  Declare Ouvrir_Fenetre_Anneau()
  Declare CreerAnneau(ID, Di.d, De.d)
  
EndDeclareModule
;triangle rectangle
DeclareModule TriangleRectangle
  
  Enumeration Fenetre
    #Fenetre_TriangleR = 5
  EndEnumeration
  Enumeration Gadgets
    #Str_Base_TR = 22
    #Str_Hauteur_TR
    #Str_Hypothenuse_TR
    #Str_Perimetre_TR
    #Str_Surface_TR
    #TriangleRectangle
  EndEnumeration
  
  Structure ObjetTriangleRectangle
    ID.i
    Base.d
    Hauteur.d
    Hypothenuse.d
    Perimetre.d
    Surface.d
  EndStructure
  
  Global.ObjetTriangleRectangle *TriangleRectangle
  
  Declare Ouvrir_Fenetre_TriangleRectangle()
  Declare CreerTriangleRectangle(Id, Base.d, Hauteur.d)
  
EndDeclareModule  
;losange
DeclareModule Losange
  
  Enumeration Fenetre
    #Fenetre_Losange = 6
  EndEnumeration
  
  Enumeration Gadgets
    #Str_Cote_Losange = 28
    #Str_Surface_Losange
    #Str_Perimetre_Losange
    #Losange
  EndEnumeration
  
  Structure ObjetLosange
    ID.i
    Cote_Losange.d
    Surface_Losange.d
    Perimetre_Losange.d
  EndStructure
  
  Global.ObjetLosange *Losange
  
  Declare Ouvrir_Fenetre_Losange()
  Declare CreerLosange(ID, Cote_Losange.d)
  
EndDeclareModule
;parallelogramme
DeclareModule Parallelogramme
  
  Enumeration Fenetre
    #Fenetre_Parallelogramme = 7
  EndEnumeration
  
  Enumeration gadgets
    #Str_Longueur_Parallelogramme = 32
    #Str_Largeur_Parallelogramme
    #Str_Hauteur_Parallelogramme
    #Str_Surface_Parallelogramme
    #Str_Perimetre_Parallelogramme
    #Parallelogramme
  EndEnumeration
  
  Structure ObjetParallelogramme
    ID.i
    Longueur_Parallelogramme.d
    Largeur_Parallelogramme.d
    Hauteur_Parallelogramme.d
    Surface_Parallelogramme.d
    Perimetre_Parallelogramme.d
  EndStructure  
  
  Global.ObjetParallelogramme *Parallelogramme
  
  Declare Ouvrir_fenetre_Parallelogramme()
  Declare CreerParallelogramme(Id, Longueur_Parallelogramme.d, Largeur_Parallelogramme.d, Hauteur_Parallelogramme.d)
  
EndDeclareModule
;trapèze
DeclareModule Trapeze
  
  Enumeration Fenetre
    #Fenetre_Trapeze
  EndEnumeration
  
  Enumeration Gadgets
    #Str_Cote_1_Trapeze = 38
    #Str_Cote_2_Trapeze
    #Str_Cote_3_Trapeze
    #Str_Cote_4_Trapeze
    #Str_Longueur_Mediane_Trapeze
    #Str_Hauteur_Trapeze
    #Str_Surface_Trapeze
    #Str_Perimetre_Trapeze
    #Trapeze
  EndEnumeration
  
  Structure ObjetTrapeze
    Id.i
    Cote_1.d
    Cote_2.d
    Cote_3.d
    Cote_4.d
    Longueur_Mediane.d
    Hauteur.d
    Surface.d
    Perimetre.d
  EndStructure
  
  Global.ObjetTrapeze *Trapeze
  
  Declare CreerTrapeze(ID, Cote_1.d, Cote_2.d, Cote_3.d, Cote_4.d,Hauteur.d)
  Declare Ouvrir_Fenetre_Trapeze()
  
EndDeclareModule  

;Partie publique
Enumeration Fenetres
  #Fenetre_Geometrie
  #Fenetre_Carre
  #Fenetre_Cercle
  #Fenetre_Rectangle
  #Fenetre_Anneau
  #Fenetre_TriangleR
  #Fenetre_Losange
  #Fenetre_Parallelogramme  
  #Fenetre_Trapeze
EndEnumeration

Enumeration Gadgets
  #Str_cote_carre
  #Str_Surface_carre
  #Str_Diagonale_carre
  #Str_perimetre_carre
  #Carre
EndEnumeration

Enumeration Gadgets
  #Str_perimetre_cercle = 5
  #Str_Rayon_cercle
  #Str_Surface_Cercle
  #Str_Diametre_Cercle
  #Cercle
EndEnumeration

Enumeration Gadgets
  #Str_perimetre_Rectangle = 10
  #Str_Largeur_Rectangle
  #Str_Longueur_Rectangle
  #Str_Surface_rectangle
  #Str_Diagonale_rectangle
  #Rectangle
EndEnumeration

Enumeration gadgets
  #Str_DE = 16
  #Str_DI
  #Str_DIn
  #Str_La
  #Str_SU
  #Anneau
EndEnumeration

Enumeration Gadgets
  #Str_Base_TR = 22
  #Str_Hauteur_TR
  #Str_Hypothenuse_TR
  #Str_Perimetre_TR
  #Str_Surface_TR
  #TriangleRectangle
EndEnumeration

Enumeration Gadgets
  #Str_Cote_Losange = 28
  #Str_Surface_Losange
  #Str_Perimetre_Losange
  #Losange
EndEnumeration

Enumeration gadgets
  #Str_Longueur_Parallelogramme = 32
  #Str_Largeur_Parallelogramme
  #Str_Hauteur_Parallelogramme
  #Str_Surface_Parallelogramme
  #Str_Perimetre_Parallelogramme
  #Parallelogramme
EndEnumeration

Enumeration Gadgets
  #Str_Cote_1_Trapeze = 38
  #Str_Cote_2_Trapeze
  #Str_Cote_3_Trapeze
  #Str_Cote_4_Trapeze
  #Str_Longueur_Mediane_Trapeze
  #Str_Hauteur_Trapeze
  #Str_Surface_Trapeze
  #Str_Perimetre_Trapeze
  #Trapeze
EndEnumeration  

Enumeration Gadgets
  #Btn_Carre = 47
  #Btn_Cercle
  #Btn_Anneau
  #Btn_Rectangle
  #Btn_TR
  #Btn_Losange
  #Btn_Parallelogramme
  #Btn_Trapeze
EndEnumeration

Procedure Ouvrir_Fenetre_Geometrie()
  
  OpenWindow(#Fenetre_Geometrie,380,100,470,341,"Choisissez une figure géométrique",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(#Btn_Carre,35,40,200,50,"Carré")
  ButtonGadget(#Btn_Cercle,35,110,200,50,"Cercle")
  ButtonGadget(#Btn_Rectangle,35,180,200,50,"Rectangle")
  ButtonGadget(#Btn_Anneau,35,250,200,50,"Anneau")
  ButtonGadget(#Btn_TR, 250,40,200,50,"Triangle Rectangle")
  ButtonGadget(#Btn_Losange, 250, 110, 200, 50, "Losange")
  ButtonGadget(#Btn_Parallelogramme, 250, 180, 200, 50,"Parallélogramme")
  ButtonGadget(#Btn_Trapeze, 250, 250, 200, 50, "Trapèze")
  
EndProcedure


Module Police
  
  FontID1 = LoadFont(1,"Segoe UI",16,#PB_Font_Bold)
  FontID2 = LoadFont(2,"Segoe UI",40,#PB_Font_Bold)
  FontID3 = LoadFont(3,"Segoe UI",30,#PB_Font_Bold)
  
EndModule


Module Verification
  
  Procedure checkFloatInput(gadget)
    Protected start,count,pointcount,new$
    SendMessage_(GadgetID(gadget),#EM_GETSEL,@start,0)
    Protected txt$ = GetGadgetText(gadget)
    Protected *p.Character = @txt$
    
    While *p\c
      If *p\c = '.'
        pointcount+1
        If pointcount < 2
          new$ + Chr(*p\c)
        Else
          If start>count:start-1:EndIf
        EndIf
      ElseIf count = 0 And *p\c = '-'
        new$ + Chr('-')
      ElseIf *p\c >= '0' And *p\c <= '9'
        new$ + Chr(*p\c)
      Else
        start - 1
      EndIf
      *p + SizeOf(Character)
      count + 1
    Wend
    SetGadgetText(gadget,new$)
    SendMessage_(GadgetID(gadget),#EM_SETSEL,start,start)
  EndProcedure
  
EndModule


Module Carre
  
  Procedure CreerCarre(ID, Co.d)
    *Carre = AllocateMemory(SizeOf(objetCarre))
    *Carre\Surface = Co * Co
    *Carre\Perimetre = Co * 4
    *Carre\Diagonale = Co * Sqr(2)
  EndProcedure
  
  Procedure Ouvrir_Fenetre_Carre()
    
    If OpenWindow(#Fenetre_carre, 216, 0, 375, 399, "Calcule d'un carré",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar|#PB_Window_ScreenCentered )
      
      StringGadget(#Str_cote_carre, 130, 120, 200, 40, "",#ES_RIGHT)
      GadgetToolTip(#Str_cote_carre, "Veuillez entrer le côté du carré")
      SetGadgetFont(#Str_cote_carre, Police::FontID1)
      StringGadget(#Str_Surface_carre, 130, 180, 200, 40, "",#ES_RIGHT)
      SetGadgetFont(#Str_Surface_carre, Police::FontID1)
      StringGadget(#Str_Diagonale_carre, 130, 240, 200, 40, "",#ES_RIGHT)
      SetGadgetFont(#Str_Diagonale_carre, Police::FontID1)
      StringGadget(#Str_perimetre_carre, 130, 300, 200, 40, "",#ES_RIGHT)
      SetGadgetFont(#Str_perimetre_carre, Police::FontID1)
      
      If StartDrawing(WindowOutput(#Fenetre_Carre))
        BackColor(Point(0, 0))
        
        DrawingFont(Police::FontID2)
        
        FrontColor(#Red)
        DrawText(100, 30, "Carré")
        
        
        DrawingFont(Police::FontID1)
        
        FrontColor(#Black)
        DrawText(20, 120, "Largeur :")        
        DrawText(20, 180, "Surface :")        
        DrawText(20, 240, "Diagonale :")        
        DrawText(20, 300, "Périmètre :")
        
      EndIf
      
    EndIf
    
    SetActiveGadget(#Str_cote_carre)
    
  EndProcedure
  
EndModule

Module Cercle
  
  Procedure CreerCercle(ID, Rayon.d)
    *Cercle = AllocateMemory(SizeOf(ObjetCercle))
    *Cercle\Diametre = Rayon * 2
    *Cercle\Perimetre = 2 * #PI * Rayon
    *Cercle\Surface = #PI / 4 * Pow(*Cercle\Diametre, 2)
  EndProcedure
  
  Procedure Ouvrir_Fenetre_Cercle()
    If OpenWindow(#Fenetre_Cercle, 216, 0, 375, 420, "Calcul d'un Cercle", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      
      StringGadget(#Str_Rayon_cercle, 130, 150, 200, 40, "",#ES_RIGHT)
      GadgetToolTip(#Str_Rayon_cercle, "Veuillez entrer la Rayon du Cercle")
      SetGadgetFont(#Str_Rayon_cercle, Police::FontID1)
      
      StringGadget(#Str_Surface_Cercle, 130, 210, 200, 40, "",#ES_RIGHT)
      SetGadgetFont(#Str_Surface_Cercle, Police::FontID1)
      
      StringGadget(#Str_Diametre_Cercle, 130, 270, 200, 40, "",#ES_RIGHT)
      SetGadgetFont(#Str_Diametre_Cercle, Police::FontID1)
      
      StringGadget(#Str_perimetre_cercle, 130, 330, 200, 40, "",#ES_RIGHT)
      SetGadgetFont(#Str_perimetre_cercle, Police::FontID1)
      
      If StartDrawing(WindowOutput(#Fenetre_Cercle))
        BackColor(Point(0, 0))
        
        DrawingFont(Police::FontID2)
        
        FrontColor(#Red)
        DrawText(100, 30, "Cercle")        
        
        DrawingFont(Police::FontID1)
        
        FrontColor(#Black)
        DrawText(20, 150, "Rayon :")        
        DrawText(20, 210, "Surface :")        
        DrawText(20, 270, "Diamètre:")        
        DrawText(20, 330, "Périmètre :")
        
      EndIf
      
      SetActiveGadget(#Str_Rayon_cercle)
      
    EndIf
    
  EndProcedure
  
EndModule

Module Rectangle
  
  Procedure CreerRectangle(Id, Longueur.d, Largeur.d)
    *Rectangle = AllocateMemory(SizeOf(ObjetRectangle))
    *Rectangle\Perimetre = (Longueur + Largeur) * 2
    *Rectangle\Surface = Longueur * Largeur
    *Rectangle\Diagonale = Sqr(Pow(Longueur, 2) + Pow(Largeur, 2))
  EndProcedure 
  
  Procedure Ouvrir_Fenetre_Rectangle()
    If OpenWindow(#Fenetre_Rectangle, 216, 0, 375, 420, "Calcul d'un rectangle", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      
      StringGadget(#Str_Longueur_Rectangle, 130, 120, 200, 40, "",#ES_RIGHT)
      GadgetToolTip(#Str_Longueur_Rectangle, "Veuillez entrer la longueur du rectangle")
      SetGadgetFont(#Str_Longueur_Rectangle,Police::FontID1)
      StringGadget(#Str_Largeur_Rectangle,130,180,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Largeur_Rectangle,"Veuillez entrer la largeur du rectangle")
      SetGadgetFont(#Str_Largeur_Rectangle, Police::FontID1)      
      StringGadget(#Str_Surface_rectangle, 130, 240, 200, 40, "", #PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Surface_rectangle, Police::FontID1)
      StringGadget(#Str_Diagonale_rectangle, 130, 300, 200, 40, "", #PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Diagonale_rectangle, Police::FontID1)
      StringGadget(#Str_perimetre_Rectangle, 130, 360, 200, 40, "", #PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_perimetre_Rectangle, Police::FontID1)
      
      If StartDrawing(WindowOutput(#Fenetre_Rectangle))
        BackColor(Point(0,0))
        
        DrawingFont(Police::FontID2)
        
        FrontColor(#Red)
        DrawText(60, 30, "Rectangle")        
        
        DrawingFont(Police::FontID1)
        
        FrontColor(#Black)
        DrawText(20, 120, "Longueur :")
        DrawText(20, 180, "Largeur :")
        DrawText(20, 240, "Surface :")        
        DrawText(20, 300, "Diagonale :")        
        DrawText(20, 360, "Périmètre :")
        
      EndIf
      
      SetActiveGadget(#Str_Longueur_Rectangle)
      
    EndIf
    
  EndProcedure
  
EndModule

Module Anneau
  
  Procedure CreerAnneau(ID,Di.d,De.d)
    *Anneau = AllocateMemory(SizeOf(ObjetAnneau))
    *Anneau\DiametreIntermediaire = (De+Di)/2
    *Anneau\Largeur = De-Di
    *Anneau\Surface = #PI * *Anneau\DiametreIntermediaire * *Anneau\Largeur
  EndProcedure
  
  Procedure Ouvrir_Fenetre_Anneau()
    If OpenWindow(#Fenetre_Anneau,0,0,400,420,"Anneau",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
      
      StringGadget(#Str_DE,250,120,100,40,"",#ES_RIGHT)
      StringGadget(#Str_DI,250,180,100,40,"",#ES_RIGHT)
      StringGadget(#Str_DIn,250,240,100,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      StringGadget(#Str_La,250,300,100,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      StringGadget(#Str_SU,250,360,100,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      
      For i = #Str_DE To #Str_SU
        SetGadgetFont(i, Police::FontID1)
      Next
      
      If StartDrawing(WindowOutput(#Fenetre_Anneau))
        BackColor(Point(0,0))
        
        DrawingFont(Police::FontID2)
        
        FrontColor(#Red)
        DrawText(100,30,"Anneau")        
        
        DrawingFont(Police::FontID1)
        
        FrontColor(#Black)
        DrawText(5,120,"Diamètre externe :")
        DrawText(5,180,"Diamètre interne :")
        DrawText(5,240,"Diamètre intermédiaire :")
        DrawText(5,300,"Epaisseur :")      
        DrawText(5,360,"Surface :")
        
      EndIf
      
      SetActiveGadget(#Str_DE)
      
    EndIf
    
  EndProcedure
  
EndModule

Module TriangleRectangle
  
  Procedure CreerTriangleRectangle(Id, Base.d, Hauteur.d)
    *TriangleRectangle = AllocateMemory(SizeOf(ObjetTriangleRectangle))
    *TriangleRectangle\Surface = (Base * Hauteur) / 2
    *TriangleRectangle\Hypothenuse = Sqr(Pow(Base, 2) + Pow(Hauteur, 2))
    *TriangleRectangle\Perimetre = Base + Hauteur + *TriangleRectangle\Hypothenuse
  EndProcedure
  
  Procedure Ouvrir_Fenetre_TriangleRectangle()
    If OpenWindow(#Fenetre_TriangleR,216,0,400,420,"Calcul d'un triangle rectangle",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      
      StringGadget(#Str_Base_TR,170,120,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Base_TR,"Veuillez entrer la base")
      SetGadgetFont(#Str_Base_TR,Police::FontID1)
      StringGadget(#Str_Hauteur_TR,170,180,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Hauteur_TR,"Veuillez entrer la hauteur")
      SetGadgetFont(#Str_Hauteur_TR,Police::FontID1)
      StringGadget(#Str_Hypothenuse_TR,170,240,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Hypothenuse_TR,Police::FontID1)
      StringGadget(#Str_Surface_TR,170,300,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Surface_TR,Police::FontID1)
      StringGadget(#Str_Perimetre_TR,170,360,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Perimetre_TR,Police::FontID1)
      
      If StartDrawing(WindowOutput(#Fenetre_TriangleR))
        BackColor(Point(0,0))
        
        DrawingFont(Police::FontID3)
        
        FrontColor(#Red)
        DrawText(20,30,"Triangle Rectangle")
        
        DrawingFont(Police::FontID1)
        FrontColor(#Black)
        DrawText(20,120,"Longueur :")
        DrawText(20,180,"Largeur :")
        DrawText(20,240,"Hypothénuse :")
        DrawText(20,300,"Surface :")
        DrawText(20,360,"Périmètre :")
        
      EndIf
      
      SetActiveGadget(#Str_Base_TR)
      
    EndIf
    
  EndProcedure
  
EndModule

Module Losange
  
  Procedure CreerLosange(ID, Cote_Losange.d)
    *Losange = AllocateMemory(SizeOf(ObjetLosange))
    *Losange\Perimetre_Losange = Cote_Losange * 4
    *Losange\Surface_Losange = Cote_Losange * Cote_Losange
  EndProcedure
  
  Procedure Ouvrir_Fenetre_Losange()
    If OpenWindow(#Fenetre_Losange,216,0,400,420,"Calcul d'un losange",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      
      StringGadget(#Str_Cote_Losange,170,120,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Cote_Losange,"Veuillez entrer la longueur du côté")
      SetGadgetFont(#Str_Cote_Losange,Police::FontID1)
      StringGadget(#Str_Surface_Losange,170,240,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Surface_Losange,Police::FontID1)
      StringGadget(#Str_Perimetre_Losange,170,360,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Perimetre_Losange,Police::FontID1)
      
      If StartDrawing(WindowOutput(#Fenetre_Losange))
        BackColor(Point(0,0))
        
        DrawingFont(Police::FontID2)
        
        FrontColor(#Red)
        DrawText(60,30,"Losange")
        
        
        DrawingFont(Police::FontID1)
        
        FrontColor(#Black)
        DrawText(20,120,"Côté :")
        DrawText(20,240,"Surface :")
        DrawText(20,360,"Périmètre :")
        
      EndIf
      
      SetActiveGadget(#Str_Cote_Losange)
      
    EndIf
    
  EndProcedure
  
EndModule

Module Parallelogramme
  
  Procedure CreerParallelogramme(Id, Longueur_Parallelogramme.d, Largeur_Parallelogramme.d, Hauteur_Parallelogramme.d)
    *Parallelogramme = AllocateMemory(SizeOf(ObjetParallelogramme))
    *Parallelogramme\Perimetre_Parallelogramme = (2 * Longueur_Parallelogramme) + (2 * Largeur_Parallelogramme)
    *Parallelogramme\Surface_Parallelogramme = Longueur_Parallelogramme * Hauteur_Parallelogramme
  EndProcedure
  
  Procedure Ouvrir_fenetre_Parallelogramme()
    If OpenWindow(#Fenetre_Parallelogramme,216,0,375,420,"Calcul d'un parallélogramme",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      
      StringGadget(#Str_Longueur_Parallelogramme,130,120,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Longueur_Parallelogramme,"Veuillez entrer la longueur du parallélogramme")
      SetGadgetFont(#Str_Longueur_Parallelogramme,Police::FontID1)
      StringGadget(#Str_Largeur_Parallelogramme,130,180,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Largeur_Parallelogramme,"Veuillez entrer la largeur du parallélogramme")
      SetGadgetFont(#Str_Largeur_Parallelogramme,Police::FontID1)
      StringGadget(#Str_Hauteur_Parallelogramme,130,240,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Hauteur_Parallelogramme,"Veuillez entrer la hauteur du parallélogramme")
      SetGadgetFont(#Str_Hauteur_Parallelogramme,Police::FontID1)
      StringGadget(#Str_Surface_Parallelogramme,130,300,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Surface_Parallelogramme,Police::FontID1)
      StringGadget(#Str_Perimetre_Parallelogramme,130,360,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Perimetre_Parallelogramme,Police::FontID1)
      
      If StartDrawing(WindowOutput(#Fenetre_Parallelogramme))
        BackColor(Point(0,0))
        
        DrawingFont(Police::FontID1)
        
        FrontColor(#Red)
        DrawText(100,30,"Parallélogramme")
        
        FrontColor(#Black)
        DrawText(20,120,"Longueur :")
        DrawText(20,180,"Largeur :")
        DrawText(20,240,"Hauteur :")
        DrawText(20,300,"Surface :")
        DrawText(20,360,"Périmètre :")
        
      EndIf
      
      SetActiveGadget(#Str_Longueur_Parallelogramme)
      
    EndIf
    
  EndProcedure
  
EndModule

Module Trapeze
  
  Procedure CreerTrapeze(ID, Cote_1.d, Cote_2.d, Cote_3.d, Cote_4.d, Hauteur.d)
    *Trapeze = AllocateMemory(SizeOf(ObjetTrapeze))
    *Trapeze\Surface = (Cote_1 + Cote_3) / (2 * Hauteur)
    *Trapeze\Longueur_Mediane = (Cote_1 + Cote_3) / 2
    *Trapeze\Perimetre = Cote_1 + Cote_2 + Cote_3 + Cote_4
  EndProcedure
  
  Procedure Ouvrir_Fenetre_Trapeze()
    If OpenWindow(#Fenetre_Trapeze,216,0,375,600,"Calcul d'un trapèze",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered)
      
      StringGadget(#Str_Cote_1_Trapeze,130,120,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Cote_1_Trapeze,"Veuillez entrer le côté 1")
      SetGadgetFont(#Str_Cote_1_Trapeze,Police::FontID1)
      StringGadget(#Str_Cote_2_Trapeze,130,180,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Cote_2_Trapeze,"Veuillez entrer le côté 2")
      SetGadgetFont(#Str_Cote_2_Trapeze,Police::FontID1)
      StringGadget(#Str_Cote_3_Trapeze,130,240,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Cote_3_Trapeze,"Veuillez entrer le côté 3")
      SetGadgetFont(#Str_Cote_3_Trapeze,Police::FontID1)
      StringGadget(#Str_Cote_4_Trapeze,130,300,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Cote_4_Trapeze,"Veuillez entrer le côté 4")
      SetGadgetFont(#Str_Cote_4_Trapeze,Police::FontID1)
      StringGadget(#Str_Hauteur_Trapeze,130,360,200,40,"",#ES_RIGHT)
      GadgetToolTip(#Str_Hauteur_Trapeze,"Veuillez entrer la hauteur")
      SetGadgetFont(#Str_Hauteur_Trapeze,Police::FontID1)
      StringGadget(#Str_Longueur_Mediane_Trapeze,130,420,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Longueur_Mediane_Trapeze,Police::FontID1)
      StringGadget(#Str_Surface_Trapeze,130,480,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Surface_Trapeze,Police::FontID1)
      StringGadget(#Str_Perimetre_Trapeze,130,540,200,40,"",#PB_String_ReadOnly|#ES_RIGHT)
      SetGadgetFont(#Str_Perimetre_Trapeze,Police::FontID1)
      
      If StartDrawing(WindowOutput(#Fenetre_Trapeze))
        BackColor(Point(0,0))
        
        DrawingFont(Police::FontID2)
        
        FrontColor(#Red)
        DrawText(80,30,"Trapèze")
        
        
        DrawingFont(Police::FontID1)
        
        FrontColor(#Black)
        DrawText(20,120,"Côté 1 :")
        DrawText(20,180,"Côté 2 :")
        DrawText(20,240,"Côté 3 :")
        DrawText(20,300,"Côté 4 :")
        DrawText(20,360,"Hauteur :")
        DrawText(20,420,"Médiane :")
        DrawText(20,480,"Surface :")
        DrawText(20,540,"Périmètre")
        
      EndIf
      
      SetActiveGadget(#Str_Cote_1_Trapeze)
      
    EndIf
    
  EndProcedure
  
EndModule


Ouvrir_Fenetre_Geometrie()


Define.i Evenement, EvenementFenetre, EvenementGadget, TypeEvenement

Repeat
  
  Evenement = WaitWindowEvent()
  TypeEvenement = EventType()
  
  Select Evenement
      ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Case #PB_Event_Gadget
      EvenementGadget = EventGadget()
      Select EvenementGadget
        Case #Btn_Carre
          StopDrawing()
          Carre::Ouvrir_Fenetre_Carre()
        Case #Btn_Cercle
          StopDrawing()
          Cercle::Ouvrir_Fenetre_Cercle()
        Case #Btn_Rectangle
          StopDrawing()
          Rectangle::Ouvrir_Fenetre_Rectangle()
        Case #Btn_Anneau
          StopDrawing()
          Anneau::Ouvrir_Fenetre_Anneau()
        Case #Btn_TR
          StopDrawing()
          TriangleRectangle::Ouvrir_Fenetre_TriangleRectangle()
        Case #Btn_Losange
          StopDrawing()
          Losange::Ouvrir_Fenetre_Losange()
        Case #Btn_Parallelogramme
          StopDrawing()
          Parallelogramme::Ouvrir_fenetre_Parallelogramme()
        Case #Btn_Trapeze
          StopDrawing()
          Trapeze::Ouvrir_Fenetre_Trapeze()
                    
          ;carré
        Case #Str_cote_carre
          If Val(GetGadgetText(#Str_cote_carre)) >= 0
            Carre::CreerCarre(#Carre,ValD(GetGadgetText(#Str_cote_carre)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(#Str_cote_carre)) <> 0.0
              SetGadgetText(#Str_perimetre_carre, StrD(Carre::*Carre\Perimetre))
              SetGadgetText(#Str_Surface_carre, StrD(Carre::*Carre\Surface))
              SetGadgetText(#Str_Diagonale_carre, StrD(Carre::*Carre\Diagonale))
            EndIf
          EndIf
          
          ;cercle    
        Case #Str_Rayon_cercle
          If Val(GetGadgetText(#Str_Rayon_cercle)) >= 0
            Cercle::CreerCercle(#Cercle,ValD(GetGadgetText(#Str_Rayon_cercle)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(#Str_Rayon_cercle)) <> 0.0
            SetGadgetText(#Str_Surface_Cercle,StrD(Cercle::*Cercle\Surface))
              SetGadgetText(#Str_Diametre_Cercle, StrD(Cercle::*Cercle\Diametre))
              SetGadgetText(#Str_perimetre_cercle, StrD(Cercle::*Cercle\Perimetre))
            EndIf
          EndIf
          
          ;rectangle          
        Case #Str_Largeur_Rectangle, #Str_Longueur_Rectangle
          If Val(GetGadgetText(#Str_Largeur_Rectangle)) >= 0 And Val(GetGadgetText(#Str_Longueur_Rectangle)) >= 0
            Rectangle::CreerRectangle(#Rectangle, ValD(GetGadgetText(#Str_Longueur_Rectangle)), 
                                      ValD(GetGadgetText(#Str_Largeur_Rectangle)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(#Str_Largeur_Rectangle)) <> 0.0 And ValD(GetGadgetText(#Str_Longueur_Rectangle)) <> 0.0
              SetGadgetText(#Str_Surface_rectangle, StrD(Rectangle::*Rectangle\Surface))
              SetGadgetText(#Str_Diagonale_rectangle, StrD(Rectangle::*Rectangle\Diagonale))
              SetGadgetText(#Str_perimetre_Rectangle, StrD(Rectangle::*Rectangle\Perimetre))
            EndIf
          EndIf
          
          ;anneau          
        Case Anneau::#Str_DE,Anneau::#Str_DI
          If Val(GetGadgetText(Anneau::#Str_DE)) >= 0 And Val(GetGadgetText(Anneau::#Str_DI)) >= 0
            Anneau::CreerAnneau(#Anneau,ValD(GetGadgetText(Anneau::#Str_DI)),ValD(GetGadgetText(Anneau::#Str_DE)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(Anneau::#Str_DE)) <> 0.0 And ValD(GetGadgetText(Anneau::#Str_DI)) <> 0.0
              SetGadgetText(Anneau::#Str_DIn,StrD(Anneau::*Anneau\DiametreIntermediaire))
              SetGadgetText(Anneau::#Str_La,StrD(Anneau::*Anneau\Largeur))
              SetGadgetText(Anneau::#Str_SU, StrD(Anneau::*Anneau\Surface))
            EndIf
          EndIf
          
          ;triangle rectangle
        Case #Str_Base_TR, #Str_Hauteur_TR
          If Val(GetGadgetText(#Str_Base_TR)) >= 0 And Val(GetGadgetText(#Str_Hauteur_TR)) >= 0
            TriangleRectangle::CreerTriangleRectangle(#TriangleRectangle, ValD(GetGadgetText(#Str_Base_TR)),
                                                      ValD(GetGadgetText(#Str_Hauteur_TR)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(#Str_Base_TR)) <> 0.0 And ValD(GetGadgetText(#Str_Hauteur_TR)) <> 0.0
              SetGadgetText(#Str_Hypothenuse_TR, StrD(TriangleRectangle::*TriangleRectangle\Hypothenuse))
              SetGadgetText(#Str_Surface_TR, StrD(TriangleRectangle::*TriangleRectangle\Surface))
              SetGadgetText(#Str_Perimetre_TR, StrD(TriangleRectangle::*TriangleRectangle\Perimetre))
            EndIf
          EndIf
          
          ;losange
        Case #Str_Cote_Losange
          If Val(GetGadgetText(#Str_Cote_Losange)) >= 0
            Losange::CreerLosange(#Losange,ValD(GetGadgetText(#Str_Cote_Losange)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(#Str_Cote_Losange)) <> 0.0
              SetGadgetText(#Str_Perimetre_Losange, StrD(Losange::*Losange\Perimetre_Losange))
              SetGadgetText(#Str_Surface_Losange, StrD(Losange::*Losange\Surface_Losange))
            EndIf
          EndIf
          
          ;parallelogramme
        Case #Str_Longueur_Parallelogramme,#Str_Largeur_Parallelogramme,#Str_Hauteur_Parallelogramme
          If Val(GetGadgetText(#Str_Longueur_Parallelogramme)) >= 0 And
             Val(GetGadgetText(#Str_Largeur_Parallelogramme))  >= 0 And
             Val(GetGadgetText(#Str_Hauteur_Parallelogramme))  >= 0
            Parallelogramme::CreerParallelogramme(#Parallelogramme, ValD(GetGadgetText(#Str_Longueur_Parallelogramme)),
                                                  ValD(GetGadgetText(#Str_Largeur_Parallelogramme)),
                                                  ValD(GetGadgetText(#Str_Hauteur_Parallelogramme)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(#Str_Longueur_Parallelogramme)) <> 0.0 And
               ValD(GetGadgetText(#Str_Largeur_Parallelogramme)) <> 0.0 And
               ValD(GetGadgetText(#Str_Hauteur_Parallelogramme))  <> 0.0
              SetGadgetText(#Str_Perimetre_Parallelogramme, StrD(Parallelogramme::*Parallelogramme\Perimetre_Parallelogramme))
              SetGadgetText(#Str_Surface_Parallelogramme, StrD(Parallelogramme::*Parallelogramme\Surface_Parallelogramme))
            EndIf
          EndIf  
          
          ;trapèze
        Case #Str_Cote_1_Trapeze, #Str_Cote_2_Trapeze, #Str_Cote_3_Trapeze, #Str_Cote_4_Trapeze, #Str_Hauteur_Trapeze
          If Val(GetGadgetText(#Str_Cote_1_Trapeze)) >= 0 And
             Val(GetGadgetText(#Str_Cote_2_Trapeze)) >= 0 And
             Val(GetGadgetText(#Str_Cote_3_Trapeze)) >= 0 And
             Val(GetGadgetText(#Str_Cote_4_Trapeze)) >= 0 And
             Val(GetGadgetText(#Str_Hauteur_Trapeze)) >= 0
            Trapeze::CreerTrapeze(#Trapeze,ValD(GetGadgetText(#Str_Cote_1_Trapeze)),
                                  ValD(GetGadgetText(#Str_Cote_2_Trapeze)),
                                  ValD(GetGadgetText(#Str_Cote_3_Trapeze)),
                                  ValD(GetGadgetText(#Str_Cote_4_Trapeze)),
                                  ValD(GetGadgetText(#Str_Hauteur_Trapeze)))
            Verification::checkFloatInput(EventGadget())
            If ValD(GetGadgetText(#Str_Cote_1_Trapeze)) <> 0.0 And
               ValD(GetGadgetText(#Str_Cote_2_Trapeze)) <> 0.0 And
               ValD(GetGadgetText(#Str_Cote_3_Trapeze)) <> 0.0 And
               ValD(GetGadgetText(#Str_Cote_4_Trapeze)) <> 0.0 And
               ValD(GetGadgetText(#Str_Hauteur_Trapeze)) <> 0.0
              SetGadgetText(#Str_Longueur_Mediane_Trapeze, StrD(Trapeze::*Trapeze\Longueur_Mediane))
              SetGadgetText(#Str_Perimetre_Trapeze, StrD(Trapeze::*Trapeze\Perimetre))
              SetGadgetText(#Str_Surface_Trapeze, StrD(Trapeze::*Trapeze\Surface))
            EndIf
          EndIf  
          
      EndSelect ; Fin EvenementGadget
      ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Case #PB_Event_CloseWindow
      EvenementFenetre = EventWindow()
      Select EvenementFenetre
        Case #Fenetre_Geometrie
          CloseWindow(#Fenetre_Geometrie)
          Break
        Case #Fenetre_Carre
          CloseWindow(#Fenetre_Carre)
          Ouvrir_Fenetre_Geometrie()
        Case #Fenetre_Cercle
          CloseWindow(#Fenetre_Cercle)
          Ouvrir_Fenetre_Geometrie()
        Case #Fenetre_Rectangle
          CloseWindow(#Fenetre_Rectangle)
          Ouvrir_Fenetre_Geometrie()
        Case #Fenetre_Anneau
          CloseWindow(#Fenetre_Anneau)
          Ouvrir_Fenetre_Geometrie()
        Case #Fenetre_TriangleR
          CloseWindow(#Fenetre_TriangleR)
          Ouvrir_Fenetre_Geometrie()
        Case #Fenetre_Losange
          CloseWindow(#Fenetre_Losange)
          Ouvrir_Fenetre_Geometrie()
        Case #Fenetre_Parallelogramme
          CloseWindow(#Fenetre_Parallelogramme)
          Ouvrir_Fenetre_Geometrie()
        Case #Fenetre_Trapeze
          CloseWindow(#Fenetre_Trapeze)
          Ouvrir_Fenetre_Geometrie()
      EndSelect
      ; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  EndSelect
ForEver
End
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Module geometrie

Message par Ar-S »

Salut Micoute, j'ai pas testé ton module mais en le survolant j'ai vu qu'il manque un ou des stopdrawing().. Penses y sinon ton prog va finir dans les choux.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Module geometrie

Message par falsam »

Je me demande pourquoi utiliser des canvas pour afficher des simples gadgetexte. Les StopDrawing y sont bien mais placés bizarrement dans la boucle événementielle. Je n'aime pas cette manière de coder.

Quand on ferme la fenêtre de calcul du trapèze, la fenêtre principale ne s'affiche plus.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Module geometrie

Message par kernadec »

bonsoir Micoute

merci pour le partage.
autre remarque, quand on choisi le trapèze la fenêtre principale disparait 8O

Cordialement
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Module geometrie

Message par Ar-S »

falsam, y'a pas de stopdrawing() avant le endif donc je considère qu'il est manquant.

Code : Tout sélectionner

 If StartDrawing(WindowOutput(#Fenetre_Carre))
        BackColor(Point(0, 0))
       
        DrawingFont(Police::FontID2)
       
        FrontColor(#Red)
        DrawText(100, 30, "Carré")
       
       
        DrawingFont(Police::FontID1)
       
        FrontColor(#Black)
        DrawText(20, 120, "Largeur :")       
        DrawText(20, 180, "Surface :")       
        DrawText(20, 240, "Diagonale :")       
        DrawText(20, 300, "Périmètre :")
       
EndIf
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Module geometrie

Message par falsam »

Peut être qu'ils sont là ? :mrgreen:

Code : Tout sélectionner

Select EvenementGadget
        Case #Btn_Carre
          StopDrawing()
          Carre::Ouvrir_Fenetre_Carre()
        Case #Btn_Cercle
          StopDrawing()
          Cercle::Ouvrir_Fenetre_Cercle()
        Case #Btn_Rectangle
          StopDrawing()
          Rectangle::Ouvrir_Fenetre_Rectangle()
        Case #Btn_Anneau
          StopDrawing()
          Anneau::Ouvrir_Fenetre_Anneau()
        Case #Btn_TR
          StopDrawing()
          TriangleRectangle::Ouvrir_Fenetre_TriangleRectangle()
        Case #Btn_Losange
          StopDrawing()
          Losange::Ouvrir_Fenetre_Losange()
        Case #Btn_Parallelogramme
          StopDrawing()
          Parallelogramme::Ouvrir_fenetre_Parallelogramme()
        Case #Btn_Trapeze
          StopDrawing()
          Trapeze::Ouvrir_Fenetre_Trapeze()
Micoute aime coder dangeureusement. Il en est de même pour la conception des modules.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Module geometrie

Message par Micoute »

Bonjour à tous pour vos critiques qui sont constructives pour moi, car vues d'un autre œil, ça va me permettre de modifier mon code en conséquence de cause.

Merci à tous.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Module geometrie

Message par microdevweb »

Bonjour Micoute,

Je trouve que tu utilise beaucoup de modules, perso je n'aurais fais qu'un seul module géométrie. A mon sens les modules dans Pb permettent de combler son manque de couche Poo, tu encapsule les données et procédures privée dans le module (comme une classe) et déclare les constantes, variables, listes procédures etc... que tu estime devoir être public donc le moins possible (perso j'évite de rendre public les structure liste variable, je passe par une procédure). Il est plus logique de faire une procédure qui agit comme un constructeur ou toutes les variables nécessaire seront initialisée ainsi que toutes les autres fonctions utile à l'utilisateur. Le but final est de rendre le fonctionnement d'un code complexe transparent pour l'utilisateur final et limiter au maximum les mauvaises manipulation.

Bon c'est mon avis et il n'engage que moi :wink:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Module geometrie

Message par Micoute »

Bonjour microdevweb et merci pour tes remarques.

En fait, je ne fais que ce que je sais faire ou plutôt, du mieux que je peux, quelquefois, j'ai une vision claire de ce que je veux faire et à d'autres moments, c'est plutôt flou. Ce sont les aléas de la vieillesse et j'ai même de la chance, car la programmation m'a sauvé ! Là, par exemple, je comprend exactement ce que tu veux me faire comprendre, mais bien que j'aie connu la notion d'objets avec Turbo Pascal qui était de Borland à l'époque, l'encapsulation reste pour moi une notion assez vague, mais comme tu me parles de classe, ça me donne une autre vision de ce que je peux faire !

Merci encore de m'avoir éclairé.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Module geometrie

Message par microdevweb »

@Micoute de rien

Il est vrai que le principe d'encapsulation n'est pas évident au première abord, j'ai eu un peux de mal au départ. Le plus facile c'est d'agir comme si il s’agissait d'un programme totalement autonome et de tout placer dans le module, et de faire les procédures de manière tout à fait classique pour arriver au résultat souhaiter. Ensuite il suffis de se poser la question, de quel fonctions l'utilisateur final vat'il avoir besoin? Il suffis juste après de déclarer les procédures utiles dans DeclareModule. Un bon exemple Poo, trouver sur le net. Comparer une classe (module) à une grosse machine, avec plein de fils, circuits puces etc... Et on ne veux pas quel l'utilisateur se blesse ou endommage la dite machine, on place donc tout dans une grosse boite fermée à clef et on ne laisse apparent que quelques boutons, manivelle etc... pour que l'utilisateur puisse faire fonctionner la machine en toute sécurité, un petit manuel d'utilisation et utilisateur n'as pas besoins de savoir comment ça fonctionne, il à juste à connaitre l'action de tel ou tel bouton.

Voila c'est pas plus compliquer que ça...

Cordialement
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Module geometrie

Message par graph100 »

concernant les Startdrawing() Stopdrawing(), l'idéal serait de n'en avoir qu'une paire par boucle de dessin.

Et les opérations de dessin ne devrait pas les appeler.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Module geometrie

Message par Micoute »

graph100 a écrit :concernant les Startdrawing() Stopdrawing(), l'idéal serait de n'en avoir qu'une paire par boucle de dessin.

Et les opérations de dessin ne devrait pas les appeler.
Oui, c'est ce que j'ai fait, on trouve chaque couple dans la même procédure, mais j'ai essayé un autre format

Code : Tout sélectionner

;Classe Geometrie
;-(Tel est le visage public de mes classes qui permettent à PB d'appeler mes méthodes de fonctions).


Interface ObjetCarre
  Surface.d()
  Cote.d()
  LongueurDiagonale.d()
  DefinirCote.d(NouvelleLongueur)
  Perimetre.d()
  Detruire()
EndInterface

Interface ObjetCercle
  Surface.d()
  Rayon.d()
  Perimetre.d()
  DefinirRayon.d(NouveauRayon)
  Detruire()
EndInterface

Interface ObjetRectangle
  Surface.d()
  Longueur.d()
  Largeur.d()
  EstCarre.d()
  LongueurDiagonale.d()
  DefinirLongueur.d(NouvelleLongueur)
  DefinirLargeur.d(NouvelleLargeur)
  Perimetre.d()
  Detruire()
EndInterface

Interface ObjetAnneau
  DefinirDiametreExterieur.d(DiametreExterieur)
  DefinirDiametreInterieur.d(DiametreInterieur)
  DefinirLargeur.d(NouvelleLargeur)
  Largeur.d()
  DiametreIntermediaire.d()
  Surface.d()
  Detruire()
EndInterface

Interface ObjetTriangleRectangle
  DefinirLongueur.d()
  DefinirLargeur.d()
  Longueur.d()
  Largeur.d()
  Hypothenuse.d()
  Surface.d()
  Perimetre.d()
  Detruire()
EndInterface

Interface ObjetLosange
  DefinirCote.d()
  Perimetre.d()
  Surface.d()
  Detruire()
EndInterface

Interface ObjetParallellogramme
  Surface.d()
  Longueur.d()
  Largeur.d()
  EstLosange.d()
  DefinirLongueur.d(NouvelleLongueur)
  DefinirLargeur.d(NouvelleLargeur)
  Perimetre.d()
  Detruire()
EndInterface


Interface ObjetTrapeze
  DefinirCote1.d(NouveauCote1)
  DefinirCote2.d(NouveauCote2)
  DefinirCote3.d(NouveauCote3)
  DefinirCote4.d(NouveauCote4)
  DefinirHauteur.d(NouvelleHauteur)
  Cote1.d()
  Cote2.d()
  Cote3.d()
  Cote4.d()
  Perimetre.d()
  Surface.d()
  Detruire()
EndInterface



;-MODELE DE CLASSE CARRE.
Structure _Carre
  *TableVirtuelle
  Cote.d
EndStructure

;-MODELE DE CLASSE CERCLE.
Structure _Cercle
  *TableVirtuelle
  Rayon.d
EndStructure

;-MODELE DE CLASSE RECTANGLE.
Structure _Rectangle
  *TableVirtuelle
  Longueur.d
  Largeur.d
EndStructure

;-MODELE DE CLASSE ANNEAU.
Structure _Anneau
  *TableVirtuelle
  DiametreInterieur.d
  DiametreExterieur.d
  DiametreIntermediaire.d
  Largeur.d
EndStructure

;-MODELE DE CLASSE TRIANGLERECTANGLE
Structure _TriangleRectangle
  *TableVirtuelle
  Longueur.d
  Largeur.d
  Hypothenuse.d
EndStructure

;-MODELE DE CLASSE LOSANGE
Structure _Losange
  *TableVirtuelle
  Cote.d
EndStructure

;-MODELE DE CLASSE PARALLELOGRAMME.
Structure _Parallelogramme
  *TableVirtuelle
  Longueur.d
  Largeur.d
  Hauteur.d
EndStructure

;-MODELE DE CLASSE TRAPEZE.
Structure _Trapeze
  *TableVirtuelle
  Cote1.d
  Cote2.d
  Cote3.d
  Cote4.d
  Hauteur.d
EndStructure


Procedure.d CreerCarre(Cote.d = 0)
  Protected *Objet._Carre
  ;Tentative d'allouer de la mémoire pour un modèle de nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_Carre))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_Carre
    ;Initialiser le côté.
    *Objet\Cote = Cote
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure


Procedure.d CreerCercle(Rayon.d = 0)
  Protected *Objet._Cercle
  ;Tentative d'allouer de la mémoire pour un modèle de Nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_Cercle))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_Cercle
    ;Initialiser le Rayon.
    *Objet\Rayon = Rayon
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure


Procedure.d CreerRectangle(Longueur.d = 0, Largeur.d = 0)
  Protected *Objet._Rectangle
  ;Tentative d'allouer de la mémoire pour un modèle de nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_Rectangle))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_Rectangle
    ;Initialiser la longueur et la largeur.
    *Objet\Longueur = Longueur
    *Objet\Largeur = Largeur
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure


Procedure.d CreerAnneau(DiametreInterieur.d = 0, DiametreExterieur.d = 0)
  Protected *Objet._Anneau
  ;Tentative d'allouer de la mémoire pour un modèle de nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_Anneau))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_Anneau
    ;Initialiser les diamètres intérieur et extérieur.
    *Objet\DiametreInterieur = DiametreInterieur
    *Objet\DiametreExterieur = DiametreExterieur
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure


Procedure.d CreerTriangleRectangle(Longueur.d = 1.0, Largeur.d = 1.0)
  Protected *Objet._TriangleRectangle
  ;Tentative d'allouer de la mémoire pour un modèle de nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_TriangleRectangle))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_TriangleRectangle
    ;Initialiser la longueur et la largeur.
    *Objet\Longueur = Longueur
    *Objet\Largeur = Largeur
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure


Procedure.d CreerLosange(Cote.d = 0)
  Protected *Objet._Losange
  ;Tentative d'allouer de la mémoire pour un modèle de nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_Losange))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_Losange
    ;Initialiser la longueur et la largeur.
    *Objet\Cote = Cote
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure


Procedure.d CreerParallelogramme(Longueur.d = 0, Largeur.d = 0, Hauteur.d = 0)
  Protected *Objet._Parallelogramme
  ;Tentative d'allouer de la mémoire pour un modèle de nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_Parallelogramme))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_Parallelogramme
    ;Initialiser la longueur et la largeur.
    *Objet\Longueur = Longueur
    *Objet\Largeur = Largeur
    *Objet\Hauteur = Hauteur
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure

Procedure.d CreerTrapeze(Cote1.d = 0, Cote2.d = 0, Cote3.d = 0, Cote4.d = 0)
  Protected *Objet._Trapeze
  ;Tentative d'allouer de la mémoire pour un modèle de nouvelle classe.
  *Objet = AllocateMemory(SizeOf(_Trapeze))
  If *Objet
    ;Assurez-vous que les points champs *TableVirtuelle pour notre table virtuelle.
    *Objet\TableVirtuelle = ?TableVirtuelle_Trapeze
    ;Initialiser la longueur et la largeur.
    *Objet\Cote1 = Cote1
    *Objet\Cote2 = Cote2
    *Objet\Cote3 = Cote3
    *Objet\Cote4 = Cote4
  EndIf
  ;Retourne un pointeur à notre objet.
  ProcedureReturn *Objet
EndProcedure


;METHODES DE CLASSE

;-DEFINIR

;Retourne #True si le côté est modifié avec succès.
Procedure.b DefinirCote_Carre(*Auto._Carre, NouveauCote.d)
  ;Ne procéder que si l'utilisateur tente de définir un côté non-négatif.
  If NouveauCote >= 0
    *Auto\Cote = NouveauCote
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si le rayon est modifié avec succès.
Procedure.b DefinirRayon_Cercle(*Auto._Cercle, NouveauRayon.d)
  ;Ne procéder que si l'utilisateur tente de définir une Rayon non-négatif.
  If NouveauRayon >= 0
    *Auto\Rayon = NouveauRayon
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la longeur est modifiée avec succès.
Procedure.b DefinirLongueur_Rectangle(*Auto._Rectangle, NouvelleLongueur.d)
  ;Ne procéder que si l'utilisateur tente de définir une longueur non-négative.
  If NouvelleLongueur >= 0
    *Auto\Longueur = NouvelleLongueur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la largeur est modifiée avec succès.
Procedure.b DefinirLargeur_Rectangle(*Auto._Rectangle, NouvelleLargeur.d)
  ;Ne procéder que si l'utilisateur tente de définir une largeur non-négative.
  If NouvelleLargeur >= 0
    *Auto\Largeur = NouvelleLargeur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la largeur est modifiée avec succès.
Procedure.b DefinirLargeur_Anneau(*Auto._Anneau, NouvelleLargeur.d)
  ;Ne procéder que si l'utilisateur tente de définir une largeur non-négative.
  If NouvelleLargeur >= 0
    *Auto\Largeur = NouvelleLargeur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la largeur est modifiée avec succès.
Procedure.b DefinirDiametreInterieur_Anneau(*Auto._Anneau, NouveauDiametre.d)
  ;Ne procéder que si l'utilisateur tente de définir un diamètre non-négative.
  If NouveauDiametre >= 0
    *Auto\DiametreInterieur = DiametreInterieur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la largeur est modifiée avec succès.
Procedure.b DefinirDiametreExterieur_Anneau(*Auto._Anneau, NouveauDiametre.d)
  ;Ne procéder que si l'utilisateur tente de définir un diamètre non-négative.
  If NouveauDiametre >= 0
    *Auto\DiametreExterieur = DiametreExterieur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la longeur est modifiée avec succès.
Procedure.b DefinirLongueur_TriangleRectangle(*Auto._TriangleRectangle, NouvelleLongueur.d)
  ;Ne procéder que si l'utilisateur tente de définir une longueur non-négative.
  If NouvelleLongueur >= 0
    *Auto\Longueur = NouvelleLongueur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la largeur est modifiée avec succès.
Procedure.b DefinirLargeur_TriangleRectangle(*Auto._TriangleRectangle, NouvelleLargeur.d)
  ;Ne procéder que si l'utilisateur tente de définir une largeur non-négative.
  If NouvelleLargeur >= 0
    *Auto\Largeur = NouvelleLargeur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Retourne #True si le côté est modifié avec succès.
Procedure.b DefinirCote_Losange(*Auto._Losange, NouveauCote.d)
  ;Ne procéder que si l'utilisateur tente de définir un côté non-négatif.
  If NouveauCote >= 0
    *Auto\Cote = NouveauCote
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la longeur est modifiée avec succès.
Procedure.b DefinirLongueur_Parallelogramme(*Auto._Parallelogramme, NouvelleLongueur.d)
  ;Ne procéder que si l'utilisateur tente de définir une longueur non-négative.
  If NouvelleLongueur >= 0
    *Auto\Longueur = NouvelleLongueur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure


;Retourne #True si la largeur est modifiée avec succès.
Procedure.b DefinirLargeur_Parallelogramme(*Auto._Parallelogramme, NouvelleLargeur.d)
  ;Ne procéder que si l'utilisateur tente de définir une largeur non-négative.
  If NouvelleLargeur >= 0
    *Auto\Largeur = NouvelleLargeur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Retourne #True si le côté est modifié avec succès.
Procedure.b DefinirCote1_Trapeze(*Auto._Trapeze, NouveauCote1.d)
  ;Ne procéder que si l'utilisateur tente de définir un côté non-négatif.
  If NouveauCote1 >= 0
    *Auto\Cote1 = NouveauCote1
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Retourne #True si le côté est modifié avec succès.
Procedure.b DefinirCote2_Trapeze(*Auto._Trapeze, NouveauCote2.d)
  ;Ne procéder que si l'utilisateur tente de définir un côté non-négatif.
  If NouveauCot2e >= 0
    *Auto\Cote2 = NouveauCote2
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Retourne #True si le côté est modifié avec succès.
Procedure.b DefinirCote3_Trapeze(*Auto._Trapeze, NouveauCote3.d)
  ;Ne procéder que si l'utilisateur tente de définir un côté non-négatif.
  If NouveauCote3 >= 0
    *Auto\Cote3 = NouveauCote3
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Retourne #True si le côté est modifié avec succès.
Procedure.b DefinirCote4_Trapeze(*Auto._Trapeze, NouveauCote4.d)
  ;Ne procéder que si l'utilisateur tente de définir un côté non-négatif.
  If NouveauCote4 >= 0
    *Auto\Cote4 = NouveauCote4
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;Retourne #True si le côté est modifié avec succès.
Procedure.b DefinirHauteur_Trapeze(*Auto._Trapeze, NouvelleHauteur.d)
  ;Ne procéder que si l'utilisateur tente de définir un côté non-négatif.
  If NouvelleHauteur >= 0
    *Auto\Hauteur = NouvelleHauteur
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure




;-OBTENIR


Procedure.d ObtenirSurface_Carre(*Auto._Carre)
  Protected Surface.d
  Surface = *Auto\Cote * *Auto\Cote
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirSurface_Cercle(*Auto._Cercle)
  Protected Surface.d
  Surface = 3.1415926536 * (*Auto\Rayon * *Auto\Rayon)
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirSurface_Rectangle(*Auto._Rectangle)
  Protected Surface.d
  Surface = *Auto\Longueur * *Auto\Largeur
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirSurface_Anneau(*Auto._Anneau)
  Protected Surface.d
  Surface = #PI * *Auto\DiametreIntermediaire * *Auto\Largeur
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirSurface_TriangleRectangle(*Auto._TriangleRectangle)
  Protected Surface.d
  Surface = (*Auto\Longueur * *Auto\Largeur) / 2
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirSurface_Losange(*Auto._Losange)
  Protected Surface.d
  Surface = *Auto\Cote
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirSurface_Parallelogramme(*Auto._Parallelogramme)
  Protected Surface.d
  Surface = *Auto\Longueur * *Auto\Largeur
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirSurface_Trapeze(*Auto._Trapeze)
  Protected Surface.d
  Surface = (*Auto\Cote1 + *Auto\Cote3) / (2 * *Auto\Hauteur)
  ProcedureReturn Surface
EndProcedure


Procedure.d ObtenirCote_Carre(*Auto._Carre)
  ProcedureReturn *Auto\Cote
EndProcedure


Procedure.d ObtenirLongueurDiagonale_Carre(*Auto._Carre)
  Protected Longueur.d
  Diagonale = *Auto\Cote * Sqr(2)
  ProcedureReturn Diagonale
EndProcedure


Procedure.d ObtenirRayon_Cercle(*Auto._Cercle)
  ProcedureReturn *Auto\Rayon
EndProcedure


Procedure.d ObtenirLongueur_Rectangle(*Auto._Rectangle)
  ProcedureReturn *Auto\Longueur
EndProcedure


Procedure.d ObtenirLargeur_Rectangle(*Auto._Rectangle)
  ProcedureReturn *Auto\Largeur
EndProcedure


Procedure.d ObtenirLongueurDiagonale_Rectangle(*Auto._Rectangle)
  Protected Longueur.d
  Longueur = *Auto\Longueur * *Auto\Longueur + *Auto\Largeur * *Auto\Largeur
  Longueur = Sqr(Longueur)
  ProcedureReturn Longueur
EndProcedure


Procedure.d ObtenirLargeur_Anneau(*Auto._Anneau)
  ProcedureReturn *Auto\Largeur
EndProcedure


Procedure.d ObtenirDiametreIntermediaire_Anneau(*Auto._Anneau)
  Diametre = (*Auto\DiametreExterieur - *Auto\DiametreInterieur) / 2
  ProcedureReturn Diametre
EndProcedure


Procedure.d ObtenirLongueur_TriangleRectangle(*Auto._TriangleRectangle)
  ProcedureReturn *Auto\Longueur
EndProcedure


Procedure.d ObtenirLargeur_TriangleRectangle(*Auto._TriangleRectangle)
  ProcedureReturn *Auto\Largeur
EndProcedure


Procedure.d ObtenirHypothenuse_TriangleRectangle(*Auto._TriangleRectangle)
  *Auto\Hypothenuse = Sqr(Pow(*Auto\Longueur, 2) + Pow(*Auto\Largeur, 2))
  ProcedureReturn *Auto\Hypothenuse
EndProcedure


Procedure.d ObtenirCote_Losange(*Auto._Losange)
  ProcedureReturn *Auto\Cote
EndProcedure


Procedure.d ObtenirLongueur_Parallelogramme(*Auto._Parallelogramme)
  ProcedureReturn *Auto\Longueur
EndProcedure


Procedure.d ObtenirLargeur_Parallelogramme(*Auto._Parallelogramme)
  ProcedureReturn *Auto\Largeur
EndProcedure


Procedure.d ObtenirCote1_Trapeze(*Auto._Trapeze)
  ProcedureReturn *Auto\Cote1
EndProcedure


Procedure.d ObtenirCote2_Trapeze(*Auto._Trapeze)
  ProcedureReturn *Auto\Cote2
EndProcedure


Procedure.d ObtenirCote3_Trapeze(*Auto._Trapeze)
  ProcedureReturn *Auto\Cote3
EndProcedure


Procedure.d ObtenirCote4_Trapeze(*Auto._Trapeze)
  ProcedureReturn *Auto\Cote4
EndProcedure


Procedure.d ObtenirHauteur_Trapeze(*Auto._Trapeze)
  ProcedureReturn *Auto\Hauteur
EndProcedure


Procedure.d ObtenirPerimetre_Carre(*Auto._Carre)
  If *Auto\Cote >= 0
    ProcedureReturn *Auto\Cote * 4
  EndIf
EndProcedure


Procedure.d ObtenirPerimetre_Cercle(*Auto._Cercle)
  ProcedureReturn *Auto\Rayon * 2 * 3.1415926536
EndProcedure


Procedure.d ObtenirPerimetre_Rectangle(*Auto._Rectangle)
  If *Auto\Longueur >= 0 And *Auto\Largeur >= 0
    ProcedureReturn (*Auto\Longueur + *Auto\Largeur) * 2
  EndIf
EndProcedure


Procedure.d ObtenirPerimetre_TriangleRectangle(*Auto._TriangleRectangle)
  If *Auto\Longueur >= 0 And *Auto\Largeur >= 0
    ProcedureReturn *Auto\Longueur + *Auto\Largeur + *Auto\Hypothenuse
  EndIf
EndProcedure


Procedure.d ObtenirPerimetre_Losange(*Auto._Losange)
  If *Auto\Cote >= 0
    ProcedureReturn *Auto\Cote * 4
  EndIf
EndProcedure


Procedure.d ObtenirPerimetre_Parallelogramme(*Auto._Parallelogramme)
  If *Auto\Longueur >= 0 And *Auto\Largeur >= 0
    ProcedureReturn (*Auto\Longueur + *Auto\Largeur) * 2
  EndIf
EndProcedure


Procedure.d ObtenirPerimetre_Trapeze(*Auto._Trapeze)
  If *Auto\Cote1 >= 0 And *Auto\Cote2 >= 0 And *Auto\Cote3 >= 0 And *Auto\Cote4 >= 0 And *Auto\Hauteur >= 0
    ProcedureReturn *Auto\Cote1 + *Auto\Cote2 + *Auto\Cote3 + *Auto\Cote4
  EndIf
EndProcedure


Procedure.b Rectangle_EstCarre(*Auto._Rectangle)
  If *Auto\Longueur = *Auto\Largeur
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure


Procedure.b Parallelogramme_EstLosange(*Auto._Parallelogramme)
  If *Auto\Longueur = *Auto\Largeur
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

;-Détruire

Procedure Detruire_Carre(*Auto._Carre)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure


Procedure Detruire_Cercle(*Auto._Cercle)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure


Procedure Detruire_Rectangle(*Auto._Rectangle)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure


Procedure Detruire_Anneau(*Auto._Anneau)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure


Procedure Detruire_TriangleRectangle(*Auto._TriangleRectangle)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure


Procedure Detruire_Losange(*Auto._Losange)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure


Procedure Detruire_Parallelogramme(*Auto._Parallelogramme)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure


Procedure Detruire_Trapeze(*Auto._Trapeze)
  ;Tout ce qu'il faut faire ici, c'est libérer la mémoire précédemment allouée pour cet objet.
  FreeMemory(*Auto)
EndProcedure





;-TABLES VIRTUELLES.

DataSection
  
  TableVirtuelle_Carre:
  Data.i @ObtenirSurface_Carre()
  Data.i @ObtenirCote_Carre()
  Data.i @ObtenirLongueurDiagonale_Carre()
  Data.i @DefinirCote_Carre()
  Data.i @ObtenirPerimetre_Carre()
  Data.i @Detruire_Carre()
  
  
  TableVirtuelle_Cercle:
  Data.i @ObtenirSurface_Cercle()
  Data.i @ObtenirRayon_Cercle()
  Data.i @ObtenirPerimetre_Cercle()
  Data.i @DefinirRayon_Cercle()
  Data.i @Detruire_Cercle()
  
  
  
  TableVirtuelle_Rectangle:
  Data.i @ObtenirSurface_Rectangle()
  Data.i @ObtenirLongueur_Rectangle()
  Data.i @ObtenirLargeur_Rectangle()
  Data.i @Rectangle_EstCarre()
  Data.i @ObtenirLongueurDiagonale_Rectangle()
  Data.i @DefinirLongueur_Rectangle()
  Data.i @DefinirLargeur_Rectangle()
  Data.i @ObtenirPerimetre_Rectangle()
  Data.i @Detruire_Rectangle()
  
  
  TableVirtuelle_Anneau:
  Data.i @DefinirDiametreExterieur_Anneau()
  Data.i @DefinirDiametreInterieur_Anneau()
  Data.i @DefinirLargeur_Anneau()
  Data.i @ObtenirLargeur_Anneau()
  Data.i @ObtenirDiametreIntermediaire_Anneau()
  Data.i @ObtenirSurface_Anneau()
  Data.i @Detruire_Anneau()
  
  
  TableVirtuelle_TriangleRectangle:
  Data.i @DefinirLongueur_TriangleRectangle()
  Data.i @DefinirLargeur_TriangleRectangle()
  Data.i @ObtenirLongueur_TriangleRectangle()
  Data.i @ObtenirLargeur_TriangleRectangle()
  Data.i @ObtenirHypothenuse_TriangleRectangle()
  Data.i @ObtenirSurface_TriangleRectangle()
  Data.i @ObtenirPerimetre_TriangleRectangle()
  Data.i @Detruire_TriangleRectangle()
  
  TableVirtuelle_Losange:
  Data.i @DefinirCote_Losange()
  Data.i @ObtenirPerimetre_Losange()
  Data.i @ObtenirSurface_Losange()
  Data.i @Detruire_Losange()
  
  
  TableVirtuelle_Parallelogramme:
  Data.i @ObtenirSurface_Parallelogramme()
  Data.i @ObtenirLongueur_Parallelogramme()
  Data.i @ObtenirLargeur_Parallelogramme()
  Data.i @Parallelogramme_EstLosange()
  Data.i @DefinirLongueur_Parallelogramme()
  Data.i @DefinirLargeur_Parallelogramme()
  Data.i @ObtenirPerimetre_Parallelogramme()
  Data.i @Detruire_Parallelogramme()
  
  TableVirtuelle_Trapeze:
  Data.i @DefinirCote1_Trapeze()
  Data.i @DefinirCote2_Trapeze()
  Data.i @DefinirCote3_Trapeze()
  Data.i @DefinirCote4_Trapeze()
  Data.i @DefinirHauteur_Trapeze()
  Data.i @ObtenirCote1_Trapeze()
  Data.i @ObtenirCote2_Trapeze()
  Data.i @ObtenirCote3_Trapeze()
  Data.i @ObtenirCote4_Trapeze()
  Data.i @ObtenirPerimetre_Trapeze()
  Data.i @ObtenirSurface_Trapeze()
  Data.i @Detruire_Trapeze()
  
EndDataSection

CompilerIf #PB_Compiler_IsMainFile
  
  EnableExplicit
  
  Define T1.ObjetTriangleRectangle = CreerTriangleRectangle(3.0, 4.0)
  Define T2.ObjetTriangleRectangle = CreerTriangleRectangle() ;par défaut
  
  ;Define *Inconnu.BaseObjet ; objet prédéfini toujours disponible
  
  
  If T1 And T2
    Debug "Longueur T1 = " + T1\Longueur()
    Debug "Largeur T1 = " + T1\Largeur()
    Debug "Hypoténuse T1 = " + T1\Hypothenuse()
    Debug "Perimetre T1 = " + T1\Perimetre()
    Debug "Surface T1 = " + T1\Surface()
    Debug ""
    
    Debug "Longueur T2 = " + T2\Longueur()
    Debug "Largeur T2 = " + T2\Largeur()
    Debug "Hypoténuse T2 = " + T2\Hypothenuse()
    Debug "Perimetre T2 = " + T2\Perimetre()
    Debug "Surface T2 = " + T2\Surface()
    Debug ""
    
    Debug "Detruire T2"
    T2\Detruire()    
    Debug "Detruire T1"
    T1\Detruire()
    
    Debug ""
  EndIf
  
  
  ;Définir deux objets rectangle.
  ;Notez que nous déclarons chaque variable en fonction du type d'interface: "ObjetRectangle" dans ce cas
  Define rect1.ObjetRectangle
  Define rect2.ObjetRectangle
  
  ;Créer les deux objets. D'abord avec la longueur = 100 et la largeur = 10, et le second avec la longueur
  ;= 20 et la largeur = 20.
  rect1 = CreerRectangle(100, 50)
  rect2 = CreerRectangle(20, 20)
  
  ;Récupérer les longueurs, largeurs, surfaces, diagonales et si ce sont des carrés.
  Define Longueur.d = rect1\Longueur()
  Define Largeur.d = rect1\Largeur()
  Debug "Le rectangle 1 à une longueur de " + Str(Longueur) + " unités, une largeur de " + Str(Largeur) + 
        " et une surface de " + Str(ObtenirSurface_Rectangle(rect1)) + " unités²."
  Debug "Le rectangle 1 à une diagonale de " + StrD(ObtenirLongueurDiagonale_Rectangle(rect1), 2) + " unités"
  If Rectangle_EstCarre(rect1)
    Debug "Le rectangle 1 est carré"
  Else
    Debug "Le rectangle 1 n'est pas carré"
  EndIf
  
  Largeur.d = rect2\Largeur()
  Longueur.d = rect2\Longueur()
  Debug "Le rectangle 2 à une largeur de " + Str(Largeur) + " et une longueur de " + Str(Longueur) + " unités."
  Debug "Le rectangle 2 à une diagonale de " + StrD(ObtenirLongueurDiagonale_Rectangle(rect2), 2) + " unités"
  If Rectangle_EstCarre(rect2)
    Debug "Le rectangle 2 est carré"
  Else
    Debug "Le rectangle 2 n'est pas carré"
  EndIf
  
  ;Détruire les objets lorsque nous avons terminé.
  rect1\Detruire()
  rect2\Detruire()

  CompilerEndIf
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre