www.oohg.org

Object Oriented Harbour GUI

Ejemplo oMySQL (omysql.prg)

/*
 * http://www.oohg.org – http://sourceforge.net/projects/oohg
 * "oMySQL.prg" Ejemplo de Grid y ADO
 * Copyright 2010 MigSoft <migsoft/at/oohg.org>
 */

#include "ado.ch"
#include "oohg.ch"

Function Main()
  
LOCAL oRs, aHds:={} , aWds:={} , aFlds:={} 
  
LOCAL aJust:={} , aTip:={}

   lConnected:= .F.
  
oServer:= NIL
  
cServer:= "myserver"
  
cUser:= "myuser"
  
cPaswd:= "mypass"

   /********** Cadena de Conexion **********/
   
cCad :="Driver={MySQL ODBC 3.51 Driver};Server="+ ;
   
cServer+";Database=oohgorg_grupo;User="+cUser+ ;
    ";Password="
+cPaswd+";Option=3;"
  
/************ Abrir Conexion ************/
   
IF ( oRs := CreateObject( "ADODB.Recordset" ) ) != NIL
        
oRs:Open( "SELECT * FROM test" ,;
                
cCad ,;
                
adOpenDynamic, ;
                
adLockOptimistic )

       aRows := {}
      
aRows := oRs:Getrows()
      
nFlds := oRs:Fields:Count

       FOR i := 1 TO nFlds
          
AAdd(aHds, oRs:Fields(i-1):Name)
          
AAdd(aTip, oRs:Fields(i-1):Type)
      
NEXT

    ENDIF

   For f := 1 to LEN(aRows)
      
aRegs := {}
      
For c := 1 to LEN(aRows[1]) 
          
AAdd( aRegs, Value(aRows,f,c) ) 
      
Next
      
AAdd(aFlds,aRegs)
  
Next

   For n := 1 to LEN(aFlds[1])
      
If valtype(aFlds[1,n])=‘C’
         
AAdd(aWds, MAX(100,Min(160,Len((aFlds[1,n]))*14))) 
         
AAdd(aJust,0)
      
Elseif valtype(aFlds[1,n])=‘L’
         
AAdd( aWds,  80 ) ; AAdd(aJust,2)
      
Elseif valtype(aFlds[1,n])=‘N’
         
AAdd( aWds,  80 ) ; AAdd(aJust,1)
      
Endif
  
Next

   DEFINE WINDOW oWnd WIDTH 640 HEIGHT 480 ;
         
TITLE "MySQL Viewer 2020 v.0.01 (c)2010 MigSoft " ;
         
ICON "ZZZ_LED_ON" ON SIZE Ajuste() ;
         
ON PAINT Ajuste() MAIN

       DEFINE TOOLBAR ToolBar_1 BUTTONSIZE 90,32 ;
             
FONT "Arial" SIZE 9 FLAT RIGHTTEXT

         BUTTON Cerrar    CAPTION "Close"  ;
        
PICTURE "MINIGUI_EDIT_CLOSE"      ;
        
ACTION oWnd.Release  AUTOSIZE

         BUTTON Nuevo     CAPTION "New"    ;
        
PICTURE "MINIGUI_EDIT_NEW"        ;
        
ACTION Nil           AUTOSIZE

         BUTTON Modificar CAPTION "Edit"   ;
        
PICTURE "MINIGUI_EDIT_EDIT"       ;
        
ACTION Nil           AUTOSIZE

         BUTTON Eliminar  CAPTION "Delete" ;
        
PICTURE "MINIGUI_EDIT_DELETE"     ;
        
ACTION Nil           AUTOSIZE

         BUTTON Buscar    CAPTION "Find"   ;
        
PICTURE "MINIGUI_EDIT_FIND"       ;
        
ACTION Nil           AUTOSIZE

         BUTTON Imprimir  CAPTION "Print"  ;
        
PICTURE "MINIGUI_EDIT_PRINT"      ;
        
ACTION Nil           AUTOSIZE

       END TOOLBAR

       @ 60, 10 GRID Grid_1 ;
               
WIDTH  oWnd.width - 30 ;
               
HEIGHT oWnd.height - 110 ;
               
HEADERS aHds ;
               
WIDTHS aWds ;
               
ITEMS aFlds ;
               
VALUE 1     ;
               
TOOLTIP ‘Editable Grid’ ;
               
EDIT ;
               
JUSTIFY aJust ;
               
COLUMNCONTROLS AsigCtrl(aFlds) ;

   END WINDOW

   CENTER WINDOW oWnd
  
ACTIVATE WINDOW oWnd

Return Nil

*——————————————————————————*
Procedure Ajuste()
*——————————————————————————*
   oWnd.Grid_1.width  := oWnd.width - 30
  
oWnd.Grid_1.height := oWnd.height - 110

Return

*——————————————————————————*
Function Value(aPar,nFil,nCol)
*——————————————————————————*
    Local xVar := aPar[nFil,nCol]

    DO CASE
      
CASE Valtype(xVar)=="C" 
           
xVar := xVar
      
CASE Valtype(xVar)=="N" 
           
xVar := xVar
      
CASE Valtype(xVar)=="D" 
           
xVar := HB_DTOC(xVar,"mm/dd/yy")
      
CASE Valtype(xVar)=="L" 
           
xVar := xVar
      
OTHERWISE
           
xVar := ""
   
ENDCASE

Return( xVar )

*——————————————————————————*
Procedure AsigCtrl( aNew )
*——————————————————————————*
   LOCAL aColCtrl  := {}

   For n := 1 to LEN(aNew[1])
      
Do Case
         
Case ValType(aNew[1,n])==‘L’
              
aadd(aColCtrl,{‘CHECKBOX’ , ‘Yes’ , ‘No’ })
         
Case ValType(aNew[1,n])==‘N’
              
aadd(aColCtrl,{‘TEXTBOX’,‘NUMERIC’,’999,999.99′})
         
Case ValType(aNew[1,n])==‘C’
              
If len(aNew[1,n])=8
                 
If ValType( HB_CtoD(aNew[1,n],"mm/dd/yy") )==‘D’
                    
if SubStr((aNew[1,n]),3,1) = "/"
                       
aadd(aColCtrl,{‘TEXTBOX’,‘DATE’,})
                    
Else
                       
aadd(aColCtrl,{‘TEXTBOX’,‘CHARACTER’,})
                    
Endif
                 
Else
                    
aadd(aColCtrl,{‘TEXTBOX’,‘CHARACTER’,})
                 
Endif
              
Else
                 
aadd(aColCtrl,{‘TEXTBOX’,‘CHARACTER’,})
              
Endif
         
Otherwise
              
aadd(aColCtrl,{‘TEXTBOX’,‘CHARACTER’,})
      
Endcase
  
Next

Return( aColCtrl )

Descarga el programa y recursos aqui

  • 0 Comments
  • Filed under: Ejemplos, ooHG
  • Ejemplo Aview (aview.prg)

    /*
     * ooHG – Object Oriented Harbour GUI library
     * http://www.oohg.org – http://sourceforge.net/projects/oohg
     * "Aview.prg" – Visor de Arrays
     * (c) 2010 MigSoft <migsoft/at/oohg.org>
     */

    #include "oohg.ch"

    Procedure Main

       Use mibase
      
    ArrayView( DBStruct() )

    Return

    *———————————————————————*
    Function ArrayView( aInfo )
    *———————————————————————*
       LOCAL aHds:={},aWds:={},aJst:={},aItems:={}

       IF valtype(aInfo)=‘A’

          For n := 1 to LEN(aInfo[1])
             
    AAdd( aHds, "Col: "+ltrim(str(n)) )
             
    AAdd( aWds, iif( valtype(aInfo[1,n])=‘N’,80,;
                   
    MAX((Len(alltrim(aInfo[1,n]))*14),80)))
             
    AAdd( aJst, iif( valtype(aInfo[1,n])=‘N’,1,0 ) )
         
    Next

          aFlds := {}
         
    For f := 1 to LEN(aInfo)
             
    aRegs := {}
             
    For c := 1 to LEN(aInfo[1])
                 
    AAdd( aRegs, Value(aInfo,f,c) )
             
    Next
             
    AAdd(aFlds,aRegs)
         
    Next

          DEFINE WINDOW oWnd WIDTH 640 HEIGHT 420    ;
            
    TITLE "ooHG Array View – (c) 2010 MigSoft";
            
    ICON "ZZZ_LED_ON" ON SIZE Adjust() ON PAINT Adjust()

             @ 20, 20 LABEL Boton1 VALUE "Rows : "+str(LEN(aInfo))
            
    @ 20,130 LABEL Boton2 VALUE "Cols : "+str(LEN(aInfo[1]))

             @ 60, 10 GRID Grid_1 ;
                     
    WIDTH  oWnd.width - 35 ;
                     
    HEIGHT oWnd.height - 115 ;
                     
    HEADERS aHds ;
                     
    WIDTHS aWds ;
                     
    ITEMS aFlds ;
                     
    JUSTIFY aJst ;
                     
    VALUE 1     ;
                     
    EDIT

          END WINDOW

          CENTER WINDOW oWnd
         
    ACTIVATE WINDOW oWnd

       Endif

    RETURN( Nil )

    *———————————————————————*
    Procedure Adjust()
    *———————————————————————*
       oWnd.Grid_1.width  := oWnd.width - 35
      
    oWnd.Grid_1.height := oWnd.height - 115
    Return

    *———————————————————————-*
    Function Value(aPar,nFil,nCol)
    *———————————————————————-*
       Local xVar := aPar[nFil,nCol]
      
    DO CASE
         
    CASE Valtype(xVar)=="C" ; xVar := xVar
         
    CASE Valtype(xVar)=="N" ; xVar := Str(xVar)
         
    CASE Valtype(xVar)=="D" ; xVar := DTOC(xVar)
         
    CASE Valtype(xVar)=="L" ; xVar := iif(xVar,"TRUE", "FALSE")
         
    OTHERWISE               ; xVar := ""
      
    ENDCASE
    Return( xVar )

    28-07-2010 21-12-24

  • 0 Comments
  • Filed under: Ejemplos, ooHG
  • Ejemplo Sizedemo (sizedemo.prg)

    /*
     * ooHG – Object Oriented Harbour GUI library
     * http://www.oohg.org – http://sourceforge.net/projects/oohg
     * "Sizedemo.prg" – Basado en el ejemplo de Vic
     * (c) 2010 MigSoft <migsoft/at/oohg.org>
     */

    #include "oohg.ch"

    #define CRLF  HB_OsNewLine()

    PROCEDURE MAIN
      
    LOCAL oWnd

       DEFINE WINDOW Main OBJ oWnd WIDTH 520 HEIGHT 300

          DEFINE MAIN MENU
            
    DEFINE POPUP "Archivo"
               
    MENUITEM "Nuevo…" ACTION Nil
               
    MENUITEM "Gabar…" ACTION Nil
               
    MENUITEM "Imprimir…" ACTION Nil
               
    SEPARATOR
               
    MENUITEM "Salir…" ACTION IF(MsgYesNo("Salir?";
                      
    ,"Finalizar Programa"),oWnd:release, Nil)
            
    END POPUP
         
    END MENU

          @ 10 , 10 BUTTON Boton1   CAPTION "GetWindowRect"   ;
           
    WIDTH 120 ACTION Window( oWnd )
         
    @ 10 ,130 BUTTON Boton2   CAPTION "GetClientRect"   ;
           
    WIDTH 120 ACTION Client( oWnd )
         
    @ 10 ,250 BUTTON Boton3   CAPTION "GetBorderHeight" ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetBorderHeight(oWnd:hwnd)))
         
    @ 10 ,370 BUTTON Boton4   CAPTION "GetBorderWidth"  ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetBorderWidth(oWnd:hwnd)))

          @ 50 , 10 BUTTON Boton5   CAPTION "GetWindowRow"    ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetWindowRow(oWnd:hWnd)))
         
    @ 50 ,130 BUTTON Boton6   CAPTION "GetWindowCol"    ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetWindowCol(oWnd:hWnd)))

          @ 50 ,250 BUTTON Boton7   CAPTION "GetWindowHeight" ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetWindowHeight(oWnd:hWnd)))
         
    @ 50 ,370 BUTTON Boton8   CAPTION "GetWindowWidth"  ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetWindowWidth(oWnd:hWnd)))

          @ 90 , 10 BUTTON Boton9   CAPTION "GetDeskTopHeight" ;
           
    WIDTH 120 ACTION MsgInfo(str(GetDesktopHeight()))
         
    @ 90 ,130 BUTTON Boton10  CAPTION "GetDeskTopWidth"  ;
           
    WIDTH 120 ACTION MsgInfo(str(GetDesktopWidth()))

          @ 130, 10 BUTTON Boton11  CAPTION "GetTitleHeight"   ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetTitleHeight(oWnd:hwnd)))
         
    @ 130,130 BUTTON Boton12  CAPTION "GetMenuBarHeight" ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(GetMenuBarHeight(oWnd:hwnd)))

          @ 170, 10 BUTTON Boton13  CAPTION "Get3DEdgeHeight"  ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(Get3DEdgeHeight(oWnd:hwnd)))
         
    @ 170,130 BUTTON Boton14  CAPTION "Get3DEdgeWidth"   ;
           
    WIDTH 120 ACTION ;
           
    MsgInfo(str(Get3DEdgeWidth(oWnd:hwnd)))

       END WINDOW

       CENTER WINDOW Main
      
    ACTIVATE WINDOW Main

    RETURN

    FUNCTION Window( oWnd )
      
    LOCAL aInfo
      
    aInfo := ARRAY( 4 )
      
    GetWindowRect( oWnd:hWnd, aInfo )
      
    MSGINFO( "Izquierda " + STR( aInfo[ 1 ],5 ) + CRLF + ;
                "Arriba    "
    + STR( aInfo[ 2 ],5 ) + CRLF + ;
                "Derecha   "
    + STR( aInfo[ 3 ],5 ) + CRLF + ;
                "Abajo     "
    + STR( aInfo[ 4 ],5 ) + CRLF )
    RETURN Nil

    FUNCTION Client( oWnd )
      
    LOCAL aInfo
      
    aInfo := ARRAY( 4 )
      
    GetClientRect( oWnd:hWnd, aInfo )
      
    MSGINFO( "Izquierda " + STR( aInfo[ 1 ],5 ) + CRLF + ;
                "Arriba    "
    + STR( aInfo[ 2 ],5 ) + CRLF + ;
                "Derecha   "
    + STR( aInfo[ 3 ],5 ) + CRLF + ;
                "Abajo     "
    + STR( aInfo[ 4 ],5 ) + CRLF )
    RETURN Nil

    15-07-2010 22-24-43

  • 0 Comments
  • Filed under: Ejemplos, ooHG
  • Ejemplo Mixmode (mixmode.prg)

    #include "oohg.ch"

    *————————————–
    Function Main
    *————————————–

      
    DEFINE WINDOW Ventana AT 370 , 333 ;
          
    WIDTH 560 HEIGHT 400 ;
          
    TITLE "Mixed Mode!"  ;
          
    ICON NIL MAIN

           DEFINE BUTTON Button_1
            
    ROW    170
            
    COL    180
            
    WIDTH  150
            
    HEIGHT 50
            
    CAPTION "Run Console!!!"
            
    ACTION   Console()
            
    FONTNAME  "Arial"
            
    FONTSIZE  9
         
    END BUTTON

       END WINDOW

       ACTIVATE WINDOW Ventana

    Return Nil

    *————————————–
    Function Console()
    *————————————–

      
    REQUEST HB_GT_WIN_DEFAULT

       SetMode(25,80)

       CLS

       @ 10,10 say ‘Hello’

       alert(‘Hello’)

    Return nil

    26-06-2010 11-50-19

    26-06-2010 11-50-34

  • 0 Comments
  • Filed under: Uncategorized
  • WindowsXP.Manifiest (32 y 64 Bits)

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="6.0.0.0"
        processorArchitecture
    ="*"
        name
    ="ooHG.32.64bits"
        type
    ="win32"
    />
    <
    description>Windows Shell.</description>
    <dependency>
       
    <dependentAssembly>
           
    <assemblyIdentity
                type="win32"
                name
    ="Microsoft.Windows.Common-Controls"
                version
    ="6.0.0.0"
                processorArchitecture
    ="*"
                publicKeyToken
    ="6595b64144ccf1df"
                language
    ="*"
           
    />
        </
    dependentAssembly>
    </dependency>
    </assembly>
  • 0 Comments
  • Filed under: Uncategorized
  • Ejemplo ButtonMix (demo.prg)

    #include "oohg.ch"

    Function Main()

        Define Window form_1 at 0,0 width 320 height 600 ;
              
    main title "XP Mix Button Demo"

           @  10,80 BUTTON BUTTON_1 ;
                   
    CAPTION "Click Me" ;
                   
    PICTURE "hbprint_print" ;
                   
    ACTION MsgInfo(‘Ok’) ;
                   
    LEFT ;
                   
    WIDTH 140 ;
                   
    HEIGHT 70

           @ 110,80 BUTTON BUTTON_2 ;
                   
    CAPTION "Cambio Texto" ;
                   
    PICTURE "hbprint_save" ;
                   
    ACTION cambia(1) ;
                   
    RIGHT ;
                   
    WIDTH 140 ;
                   
    HEIGHT 70

           @ 210,80 BUTTON BUTTON_3 ;
                   
    CAPTION "Cambio Imagen" ;
                   
    PICTURE "hbprint_print"  ;
                   
    ACTION cambia(2) ;
                   
    TOP ;
                   
    WIDTH 140 ;
                   
    HEIGHT 70

           @ 310,80 BUTTON BUTTON_4 ;
                   
    CAPTION "Deshabilita" ;
                   
    PICTURE  "hbprint_save"   ;
                   
    ACTION cambia(3) ;
                   
    BOTTOM ;
                   
    WIDTH 140 ;
                   
    HEIGHT 70

           @ 400,80 button button_5 ;
                   
    caption "Habilita"  ;
                   
    action cambia(4) ;
                   
    tooltip "boton de texto" ;
                   
    width 140

           @ 450,80 Button button_6 ;
                   
    Picture "Button5.bmp"  ;
                   
    action msgbox("action") ;
                   
    tooltip "boton de imagen" ;
                   
    width 140

        End window

        Center window form_1
       
    Activate window form_1

    Return Nil

    Function cambia(npar)

        If npar=1
          
    form_1.button_1.caption:="Nuevo Texto"
       
    Else
          
    If npar=3
             
    form_1.button_1.enabled:=.F.
          
    Else
             
    If npar=4
                
    form_1.button_1.enabled:=.T.
             
    Else
                
    form_1.button_4.picture:= "button5.bmp"
             
    Endif
          
    Endif
       
    Endif

    Return Nil

    31-05-2010 23-08-41

  • 0 Comments
  • Filed under: Ejemplos, ooHG
  • Ejemplo Autoadjust (auto1.prg)

    /*
     * ooHG – Object Oriented Harbour GUI library
     * http://www.oohg.org – http://sourceforge.net/projects/oohg
     * "Auto1.prg" – Ejemplo de AutoAdjust
     * Copyright 2007-2010 MigSoft <migsoft/at/oohg.org>
     */

    #include ‘oohg.ch’

    *——————————————————*
    Function Main()
    *——————————————————*
       SET AUTOADJUST ON

       MsgInfo("Se ajusta posicion, ancho y font","Informacion")

       DEFINE WINDOW  Principal AT 126,66 WIDTH 648 HEIGHT 404 ;
      
    TITLE ‘AutoAdjust (c)2007-2010 MigSoft ‘ MAIN;

           @ 320,400 BUTTON button_1 CAPTION ‘Aceptar’ ;
          
    ACTION msginfo(‘Button pressed’) WIDTH 100 HEIGHT 28 ;
          
    FONT ‘MS Sans Serif’ SIZE 10 ;

           principal.button_1.fontcolor:={0,0,0}

           @ 320,507 BUTTON button_2 CAPTION ‘Cancelar’ ;
          
    ACTION msginfo(‘Button pressed’) WIDTH 100 HEIGHT 28 ;
          
    FONT ‘MS Sans Serif’ SIZE 10 ;

           principal.button_2.fontcolor:={0,0,0}

           @ 18,31 FRAME frame_1 CAPTION "Datos Generales" ;
          
    WIDTH 576 HEIGHT 281 ;

           principal.frame_1.fontcolor:={0,0,0}
          
    principal.frame_1.fontname:=‘MS Sans Serif’
          
    principal.frame_1.fontsize:= 10

           @ 322,35 LABEL label_1 WIDTH 95 HEIGHT 21 ;
          
    VALUE ‘Nombres’ FONT ‘MS Sans Serif’ SIZE 10 ;

           principal.label_1.fontcolor:={0,0,0}

           @ 321,150 TEXTBOX text_1 HEIGHT 24 WIDTH 219 ;
          
    Font ‘MS Sans Serif’ size 10 MAXLENGTH 30 ;

           principal.text_1.fontcolor:={0,0,0}
          
    principal.text_1.backcolor:={255,255,255}

           @ 40,491 IMAGE image_1 PICTURE "hbprint_save" ;
          
    WIDTH 100 HEIGHT 100 STRETCH  ;

           @ 86,309 DATEPICKER datepicker_1 WIDTH 120 ;
          
    FONT ‘MS Sans Serif’ SIZE 10 ;

           principal.datepicker_1.fontcolor:={0,0,0}
          
    principal.datepicker_1.backcolor:={255,255,255}

           DEFINE TAB tab_1 AT 40,40 WIDTH 250 HEIGHT 250 ;
          
    FONT ‘MS Sans Serif’ SIZE 10 ;

               DEFINE PAGE ‘Page 1′ IMAGE

                   @ 48,24 GRID grid_1 WIDTH 200 HEIGHT 158 ;
                  
    HEADERS {‘one’,‘two’} WIDTHS  {60,60} ;
                  
    FONT ‘MS Sans Serif’ SIZE 10 INPLACE ;

                   principal.grid_1.fontcolor:={0,0,0}

               END PAGE

               DEFINE PAGE ‘Page 2′ IMAGE

                   @ 121,29 PROGRESSBAR progressbar_1 ;
                  
    WIDTH 191 HEIGHT 34 ;

                   principal.progressbar_1.fontcolor:={0,0,0}

              END PAGE
          
    END TAB

           @ 128,308 LISTBOX list_1 WIDTH 158 HEIGHT 99 ;
          
    FONT ‘MS Sans Serif’ SIZE 10 ;

           principal.list_1.fontcolor:={0,0,0}
          
    principal.list_1.backcolor:={255,255,255}

           @ 244,313 COMBOBOX combo_1 WIDTH 100 VALUE 3;
          
    FONT ‘MS Sans Serif’ SIZE 10 ;

           ITEMS {"HMG","MiniGUI","ooHG"} ;

           principal.combo_1.fontcolor:={0,0,0}
          
    principal.combo_1.backcolor:={255,255,255}

           @ 243,488 BUTTON picbutt_3 PICTURE ‘hbprint_close’;
          
    ACTION msginfo(‘Pic button pressed’) WIDTH 100 HEIGHT 44 ;

       END WINDOW

       Activate Window principal

    Return Nil

    31-05-2010 21-32-05

    31-05-2010 21-32-46

  • 0 Comments
  • Filed under: Ejemplos, ooHG
  • Primera Ventana con ooHG

    #include "oohg.ch"

    Function Main()

       oWnd := TformMain():Define()
         
    oWnd:Title := "Mi primera ventana con ooHG"
      
    oWnd:endwindow()

       oWnd:Activate()

    Return(Nil)

    29-05-2010 10-49-51

  • 0 Comments
  • Filed under: Ejemplos, ooHG
  • Ejemplo Hello (hello.prg)

    #include "oohg.ch"

    Function Main

       DEFINE WINDOW Win_1 ;
          
    TITLE ‘Hola Mundo!’ ;
          
    MAIN
      
    END WINDOW

       ACTIVATE WINDOW Win_1

    Return

    29-05-2010 0-09-03

  • 0 Comments
  • Filed under: Ejemplos, ooHG
  • Hello world!

    Welcome to www.oohg.org

  • 0 Comments
  • Filed under: Uncategorized