You are on page 1of 44

Tema: I

Presentacion.
Herramientas Avanzadas para el Desarrollo de Aplicaciones
Departamento de Lenguajes y Sistemas Inform
aticos
Universidad de Alicante

Curso 2012-2013 , Copyleft 2011-2013 .


Reproduccion permitida bajo los terminos de la licencia de
documentaci
on libre GNU.

1 / 44

Contenido
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Profesores
Gua Docente
Contenidos
Evaluacion
Evaluacion sin superar evaluaci
on continua
Plan de aprendizaje (I)
Plan de aprendizaje (II)
Lenguajes de practicas
Introduccion a Vala
Caractersticas de Vala
Palabras reservadas
Operadores
Hola Mundo en Vala
Compilacion
Cadenas
Entrada / Salida
Arrays
Clases

2 / 44

Profesores

Garrig
os Fernandez, Irene - (Coordinadora)
Corb Bellot, Antonio-Miguel
Mu
noz Terol, Rafael

Despachos, Horarios de tutora, cita previa, etc: www.dlsi.ua.es.

3 / 44

Gua Docente

Campus Virtual Recursos de aprendizaje Gua docente


Horarios, objetivos y competencias, contenidos, plan de aprendizaje,

evaluacion, bibliografa y enlaces


La asignatura proporciona 1.20 cr
editos te
oricos y 1.20 creditos

practicos.

4 / 44

Contenidos

El temario de la asignatura es el siguiente


T1 - Presentaci
on, Lenguajes de programaci
on
T2 - Control de versiones
T3 - Programaci
on dirigida por eventos y ejecuci
on diferida de codigo
T4 - Interfaces gr
aficas de usuario
T5 - Acceso a BBDD desde aplicaciones de escritorio
T6 - Reutilizaci
on del c
odigo objeto: gesti
on de bibliotecas
T7 - Aspectos b
asicos y despliegue de aplicaciones Web
T8 - Acceso a BBDD mediante un modelo de objetos
T9 - Realizaci
on de presentaciones efectivas

5 / 44

Evaluacion
1

Practica individual. Se realizaran 3 practicas


individuales. Practica 1: 2,5 %, Practica 2: 7,5 %, Practica 3: 10 %.
Puntuaci
on: 20 %.

Evaluaci
on Contnua: Test escritorio. Se realizar
a un test para evaluar los
conocimientos de los alumnos de forma individual a mitad de curso.
Nota mnima necesaria: 4. Puntuaci
on: 30 %.

Practica en grupo. Se realizara una practica en grupo


sober una aplicacion Web de forma colaborativa cuya entrega sera a
final de curso. Ademas se debe realizar una exposicion de dicha
practica Puntuaci
on: 30 %.

Test web. Se realizara un test sobre la parte web en la


fecha oficial asignada por la escuela politenica en junio. Nota mnima
necesaria: 4. Puntuaci
on: 20 %.

Evaluaci
on Contnua:

Evaluaci
on Contnua:

Evaluaci
on Contnua:

6 / 44

Evaluacion sin superar evaluacion continua

Atenci
on! En Julio, los alumnos que no superen las actividades de

evaluacion continua tendran que realizar un examen cuya puntuacion


maxima sera 50 %.
Las notas obtenidas en las pr
acticas durante el curso, no son

recuperables. Se mantiene su nota para calcular la nota media en


Julio.
Para m
as detalle, en el campus virtual ver documento

Criterios de Evaluaci
on Hada.

7 / 44

Plan de aprendizaje (I)


Sem.
01

Ud.
1

02

03
04

2
3

05
06

4
5

07

Desc. trab. pres.


Introducci
on a la asignatura. Introducci
on al lenguaje de programaci
on.
Control de versiones

Control de versiones
Programaci
on dirigida por eventos y ejecuci
on diferida de c
odigo
Interfaces gr
aficas de usuario
Acceso a BBDD desde aplicaciones de
escritorio
Bibliotecas.

Desc. trab. no pres.


Autopr
actica guiada para
comprender el entorno de
programaci
on.
Pr
actica 1
Pr
actica 1
Pr
actica 2
Pr
actica 3
Pr
actica 3

Prueba objetiva (test)

8 / 44

Plan de aprendizaje (II)


Sem.
08
09
10
11
12
13

Ud.
7
8
7
7
8
8,9

14

15

1-9
Total

Desc. trab. pres.


Introducci
on a C# y aplicaciones Web
Modelo de capas
Capa de interfaz aplicaciones Web
Capa de interfaz aplicaciones Web (II)
Acceso a BBDD modo conectado
Acceso a BBDD modo desconectado. Presentaciones efectivas
Aspectos avanzados en el desarrollo de aplicaciones Web
Repaso y dudas
60

Desc. trab.
Pr
actica en
Pr
actica en
Pr
actica en
Pr
actica en
Pr
actica en
Pr
actica en

no pres.
grupo
grupo
grupo
grupo
grupo
grupo

Pr
actica en grupo.
Exposici
on oral.
Correcci
on pr
actica
en grupo
90

9 / 44

Lenguajes de practicas

Pr
acticas individuales Lenguaje Vala.

Pr
actica en grupo Lenguaje C# (con ASP.net).

10 / 44

Introduccion a Vala

Vala es un nuevo lenguaje de programaci


on:

Vala

Emplea las funcionalidades proporcionadas por

Glib

GObject

El compilador de Vala genera c


odigo C, el cual es compilado por un

compilador de Lenguaje C.
Es un lenguaje similar a Java y C#, m
as parecido a este u
ltimo.

11 / 44

Caractersticas de Vala
1
2
3
4
5
6
7
8
9
10
11
12

13
14
15
16
17
18
19
20
21
22
23

POO (clases, clases abstractas, mixin interfaces, polymorphism)


Espacios de nombres (namespaces)
Delegados
Propiedades
Se
nales
Notificaciones automaticas de modificaci
on de propiedades
Foreach
Expresiones Lambda / Clausuras
Inferencia de tipos de variables locales
Tipos Genericos
Tipos No-nulos
Gestion automatica de memoria dinamica (automatic reference
counting)
Destructores deterministas (RAII)
Excepciones (checked exceptions)
Metodos Asncronos (coroutines)
Precondiciones y postcondiciones (programaci
on por contrato)
Run-time type information
Constructors con nombre
Cadenas Verbatim
Troceado de arrays y cadenas
Compilacion condicional
Sintaxis similar a C#
Compatibilidad a nivel de ABI con C.
12 / 44

Palabras reservadas

Seleccion: if, else, switch, case, default


Iteracion: do, while, for, foreach, in
Salto: break, continue, return
Excepciones: try, catch, finally, throw
Sincronizaci
on: lock
Declaracion de tipos: class, interface, struct, enum,
delegate, errordomain
Modificadores de tipos: const, weak, unowned, dynamic
Modificadores: abstract, virtual, override, signal,
extern, static, async, inline, new
Modificadores de acceso: public, private, protected,
internal
Parametros de metodos: out, ref
Programaci
on por contrato: throws, requires, ensures
Espacios de nombres: namespace, using
Operadores: as, is, in, new, delete, sizeof, typeof
Acceso: this, base
Literales: null, true, false
Propiedades: get, set, construct, default, value
Bloques constructores: construct, static construct, class
construct
Otras: void, var, yield, global, owned
13 / 44

Operadores

Aritmeticos: +, -, *, /, %
Bit a bit: , &, |,, <<, >>
Relacionales: <, >, <=, >=
Igualdad: ==, !=
Logicos: !, &&, ||
Asignacion: =, +=, -=, *=, /=, %=, &=, |=,=, <<=, >>=
Incremento, Decremento: ++,
Punteros: &, *, ->, delete
Condicionales: ?:
Comparacion con null: ??
Concatenaci
on de cadenas: +
Invocacion de metodos: ()
Acceso a miembros: .
Indice: [ ]
Troceado: [ : ]
Lambda: =>
Casting: (Type), (!), as
Comprobaci
on de tipos en tiempo de ejecucion: is
Transferencia de propiedad: (owned)
Cualificador de alias de espacios de nombres: :: (currently only with
global)
Otros: new, sizeof, typeof, in
14 / 44

Hola Mundo en Vala

1
3
5

c l a s s Demo . H e l l o W o r l d : GLib . O b j e c t {
p u b l i c s t a t i c i n t main ( s t r i n g [ ] a r g s ) {
s t d o u t . p r i n t f ( " Hello , World \ n " ) ;
return 0;
}
}

15 / 44

Compilacion

$ valac compiler.vala --pkg libvala


$ valac source1.vala source2.vala -o myprogram
$ valac hello.vala -C -H hello.h

16 / 44

Cadenas
https://live.gnome.org/Vala/Tutorial

2
4
6
8

int a = 6 , b = 7;
s t r i n g s = @" $a * $b = $ ( a * b ) " ;

// => 6 7 = 42

s t r i n g g r e e t i n g = " hello , world " ;


s t r i n g s1 = g r e e t i n g [ 7 : 1 2 ] ;
s t r i n g s 2 = g r e e t i n g [ 4: 2];

// => w o r l d
// => o r

12

b o o l b = b o o l . p a r s e ( " false " ) ;


i n t i = i n t . p a r s e ( " -52 " ) ;
d o u b l e d = d o u b l e . p a r s e ( " 6.67428 E -11 " ) ;
s t r i n g s1 = true . t o s t r i n g ( ) ;
s t r i n g s2 = 21. t o s t r i n g ( ) ;

//
//
//
//
//

=>
=>
=>
=>
=>

14

i f ( " ere " i n " Able was I ere I saw Elba . " )

...

10

false
52
6 . 6 7 4 2 8 E11
true
21

17 / 44

Cadenas
https://live.gnome.org/Vala/Tutorial

1
3

s t d o u t . p r i n t f ( " Hello , world \ n " ) ;


s t d o u t . p r i n t f ( " %d %g %s \ n " , 4 2 , 3 . 1 4 1 5 , " Vala " ) ;
string input = stdin . r ead li ne () ;
i n t number = i n t . p a r s e ( s t d i n . r e a d l i n e ( ) ) ;

Tambi
en disponemos de la salida de error estandar representada por

stderr.
Podemos mostrar informaci
on en ella con printf as:

stderr.printf(...);.

18 / 44

Arrays
https://live.gnome.org/Vala/Tutorial

2
4
6
8
10

i n t [ ] a = new i n t [ 1 0 ] ;
i n t [ ] b = { 2 , 4 , 6 , 8 };
int [] c = b [1:3];
// => { 4 , 6 }
int
al = a . length ;
i n t [ , ] c = new i n t
i n t [ , ] d = {{2 , 4 ,
{3 , 5 ,
{1 , 3 ,
d [2 ,3] = 42;
int d0l = d . length

[3 ,4];
6 , 8} ,
7 , 9} ,
5 , 7}};
[0];

12
i n t [ ] e = {}; e += 1 2 ; e += 5 ; e += 3 7 ;

19 / 44

Clases
https://live.gnome.org/Vala/Tutorial

1
3
5
7
9

/ d e f i n i n g a c l a s s /
c l a s s Track : GLib . O b j e c t {
p u b l i c d o u b l e mass ;
p u b l i c d o u b l e name { g e t ; s e t ; }
p r i v a t e bool terminated = f a l s e ;
public void terminate () {
terminated = true ;
}
}

/
/
/
/
/

s u b c l a s s i n g GLib . O b j e c t /
a p u b l i c f i e l d /
a p u b l i c p r o p e r t y /
a p r i v a t e f i e l d /
a p u b l i c method /

20 / 44

Conversion e inferencia de tipos


https://live.gnome.org/Vala/Tutorial

int
float

i = 10;
j = ( float ) i ;

var
var
var
var

=
=
=
=

3
5
7
9

11

p
s
l
i

new P e r s o n ( ) ;
" hello " ;
new L i s t <i n t >() ;
10;

//
//
//
//

same
same
same
same

a s : P e r s o n p = new P e r s o n ( ) ;
as : s t r i n g s = h e l l o ;
a s : L i s t <i n t > l = new L i s t <i n t >() ;
as : i n t i = 10;

MyFoo<s t r i n g , MyBar<s t r i n g , i n t >> f o o = new MyFoo<s t r i n g , MyBar<


s t r i n g , i n t >>() ;
// Compara con . . .
v a r f o o = new MyFoo<s t r i n g , MyBar<s t r i n g , i n t >>() ;

21 / 44

Operador ??
https://live.gnome.org/Vala/Tutorial

s t d o u t . p r i n t f ( " Hello , %s !\ n " , name ?? " unknown person " ) ;

22 / 44

Foreach
https://live.gnome.org/Vala/Tutorial

f o r e a c h ( i n t a i n i n t a r r a y ) { s t d o u t . p r i n t f ( " %d \ n " , a ) ; }

23 / 44

Comprobacion automatica de valores nulos


https://live.gnome.org/Vala/Tutorial

1
3
5

s t r i n g ? method name ( s t r i n g ? t e x t , Foo ? f o o , Bar b a r ) {


// . . .
}
O b j e c t o1 = new O b j e c t ( ) ;
O b j e c t ? o2 = new O b j e c t ( ) ;

// n o t n u l l a b l e
// n u l l a b l e

7
9

o1 = o2 ; // P r o h i b i d o
o1 = ( ! ) o2 ; // P e r m i t i d o con e l c a s t nonn u l l

e x p l i c i t o : operador !

24 / 44

Delegados
https://live.gnome.org/Vala/Tutorial

delegate void DelegateType ( i n t a ) ;

void f1 ( int a) {
s t d o u t . p r i n t f ( " %d \ n " , a ) ;
}

5
7
9
11

13

void f2 ( DelegateType d , i n t a ) {
d(a) ;
// C a l l i n g a d e l e g a t e
}
v o i d main ( ) {
f 2 ( f1 , 5) ;
// P a s s i n g a method a s d e l e g a t e argument t o a n o t h e r
method
}

25 / 44

Clausuras
https://live.gnome.org/Vala/Tutorial

d2e l e g a t e v o i d P r i n t I n t F u n c ( i n t a ) ;
4
6

8
10

v o i d main ( ) {
P r i n t I n t F u n c p1 = ( a ) => { s t d o u t . p r i n t f ( " %d \ n " , a ) ; } ;
p1 ( 1 0 ) ;
// C u r l y b r a c e s a r e o p t i o n a l i f t h e body c o n t a i n s o n l y one s t a t e m e n t
:
P r i n t I n t F u n c p2 = ( a ) => s t d o u t . p r i n t f ( " %d \ n " , a ) ;
p2 ( 2 0 ) :
}

26 / 44

Espacios de nombres
https://live.gnome.org/Vala/Tutorial

namespace Hada {
int n;
}

4
6

u s i n g Hada ;
n = 3 ; // O t a m b i e n . . .
Hada . n = 3 ;

27 / 44

Visibilidad
https://live.gnome.org/Vala/Tutorial

public
private

protected

internal

Sin restricciones de acceso


Acceso limitado desde dentro de la definicon de la
clase o estructura.
Este es el acceso por defecto si no se dice nada.
Acceso limitado desde dentro de la definicon de la
clase o estructura y desde cualquier clase que
derive de ella.
Acceso limitado desde clases definidas en el mismo paquete

28 / 44

Constructores/Destructores
https://live.gnome.org/Vala/Tutorial

1
3

p u b l i c c l a s s Button : Object {
p u b l i c Button ( ) {
}

p u b l i c Button . w i t h l a b e l ( s t r i n g
}

label ) {

7
p u b l i c Button . f r o m s t o c k ( s t r i n g s t o c k i d ) {
}

9
}
11
13
15

c l a s s Demo : O b j e c t {
Demo ( ) {
s t d o u t . p r i n t f ( " in destructor " ) ;
}
}

29 / 44

Senales
https://live.gnome.org/Vala/Tutorial

p u b l i c c l a s s T e s t : GLib . O b j e c t {
public s i g n a l void s i g 1 ( int a) ;

p u b l i c s t a t i c i n t main ( s t r i n g [ ]
T e s t t 1 = new T e s t ( ) ;

args ) {

6
t 1 . s i g 1 . c o n n e c t ( ( t , a ) => { s t d o u t . p r i n t f ( " %d \ n " , a ) ; } ) ;
8
t1 . s i g 1 (5) ;
10
return 0;
}

12
}

30 / 44

Propiedades
https://live.gnome.org/Vala/Tutorial

c l a s s Person : Object {
private i n t age = 32;
with property

// u n d e r s c o r e p r e f i x t o a v o i d name c l a s h

3
/ P r o p e r t y /
p u b l i c i n t age {
get { return age ; }
set { age = value ; }
}

5
7
9
11
13
15
17

}
// O mas r e s u m i d o . . .
c l a s s Person : Object {
/ P r o p e r t y w i t h s t a n d a r d g e t t e r and s e t t e r and d e f a u l t v a l u e /
p u b l i c i n t age { g e t ; s e t ; d e f a u l t = 3 2 ; }
...
// De s o l o l e c t u r a
p u b l i c i n t age2 { ge t ; p r i v a t e s e t ; d e f a u l t = 3 2 ; }
}

19
21
23

P e r s o n a l i c e = new P e r s o n ;
a l i c e . n o t i f y [ " age " ] . c o n n e c t (
( s , p ) => { s t d o u t . p r i n t f ( " age has changed \ n " ) ; }
);

31 / 44

Clases abstractas
https://live.gnome.org/Vala/Tutorial

1
3

p u b l i c a b s t r a c t c l a s s Animal : Object {
public void eat () {
s t d o u t . p r i n t f ( " * chomp chomp *\ n " ) ;
}

5
public abstract void s a y h e l l o () ;
7

p u b l i c c l a s s T i g e r : Animal {
public override void s a y h e l l o () {
s t d o u t . p r i n t f ( " * roar *\ n " ) ;
}
}

11
13
15
17
19

p u b l i c c l a s s Duck : A n i m a l {
public override void s a y h e l l o () {
s t d o u t . p r i n t f ( " * quack *\ n " ) ;
}
}

32 / 44

Interfaces
https://live.gnome.org/Vala/Tutorial

1
3
5
7
9

p u b l i c i n t e r f a c e I T e s t : GLib . O b j e c t {
public abstract i n t data 1 { get ; set ; }
p u b l i c a b s t r a c t v o i d method 1 ( ) ;
}
....
p u b l i c c l a s s T e s t 1 : GLib . O b j e c t , I T e s t {
public i n t data 1 { get ; set ; }
p u b l i c v o i d method 1 ( ) {
}
}

33 / 44

Enlace dinamico de metodos


https://live.gnome.org/Vala/Tutorial

2
4

c l a s s S u p e r C l a s s : GLib . O b j e c t {
p u b l i c v i r t u a l v o i d method 1 ( ) {
s t d o u t . p r i n t f ( " SuperClass . method_1 () \ n " ) ;
}
}

6
8
10

c l a s s SubClass : SuperClass {
p u b l i c o v e r r i d e v o i d method 1 ( ) {
s t d o u t . p r i n t f ( " SubClass . method_1 () \ n " ) ;
}
}

34 / 44

RTTI
https://live.gnome.org/Vala/Tutorial

1
3
5

b o o l b = o b j e c t i s SomeTypeName ;
Type t y p e = o b j e c t . g e t t y p e ( ) ;
s t d o u t . p r i n t f ( " %s \ n " , t y p e . name ( ) ) ;
Type t y p e = t y p e o f ( Foo ) ;
Foo f o o = ( Foo ) O b j e c t . new ( t y p e ) ;

35 / 44

Conversiones de tipo dinamicas


https://live.gnome.org/Vala/Tutorial

Button b = widget as Button ;


// Lo a n t e r i o r e q u i v a l e a . . . .
Button b = ( widget i s Button ) ? ( Button ) widget : n u l l ;

36 / 44

Clases genericas
https://live.gnome.org/Vala/Tutorial

p u b l i c c l a s s Wrapper<G> : GLib . O b j e c t {
p r i v a t e G data ;

3
p u b l i c v o i d s e t d a t a (G d a t a ) {
t h i s . data = data ;

}
7
public G get data () {
return t h i s . data ;
}

9
11

13

v a r w r a p p e r = new Wrapper<s t r i n g >() ;


w r a p p e r . s e t d a t a ( " test " ) ;
var data = wrapper . g e t d a t a () ;

15

37 / 44

Programacion por contrato


https://live.gnome.org/Vala/Tutorial

1
3
5
7

d o u b l e method name ( i n t x , d o u b l e d )
r e q u i r e s ( x > 0 && x < 1 0 )
r e q u i r e s ( d >= 0 . 0 && d <= 1 . 0 )
e n s u r e s ( r e s u l t >= 0 . 0 && r e s u l t <= 1 0 . 0 )
{
return d x ;
}

Donde result es una variable especial que representa el resultado.

38 / 44

Excepciones
https://live.gnome.org/Vala/Tutorial

errordomain IOError {
FILE NOT FOUND

v o i d my method ( ) t h r o w s I O E r r o r {
// . . .
i f ( something went wrong ) {
throw new I O E r r o r . FILE NOT FOUND (
" Requested file could not be found . " ) ;
}
}
...
try {
my method ( ) ;
} catch ( IOError e ) {
s t d o u t . p r i n t f ( " Error : %s \ n " , e . m e s s a g e ) ;
}
...
IOChannel channel ;
try {
c h a n n e l = new I O C h a n n e l . f i l e ( " / tmp / my_lock " , " w " ) ;
} catch ( F i l e E r r o r e ) {
i f ( e i s F i l e E r r o r . EXIST ) {
throw e ;
}
GLib . e r r o r ( " " , e . m e s s a g e ) ;
}

7
9
11
13
15
17
19
21
23
25
27

39 / 44

Direccion de los parametros


https://live.gnome.org/Vala/Tutorial

v o i d method 1 ( i n t a , out i n t b , r e f i n t c ) { . . . }
v o i d method 2 ( O b j e c t o , out O b j e c t p , r e f O b j e c t q ) { . . . }

3
5
7
9
11

int a = 1;
int b;
int c = 3;
method 1 ( a , out b , r e f c ) ;
Object
Object
Object
method

o = new O b j e c t ( ) ;
p;
q = new O b j e c t ( ) ;
2 ( o , out p , r e f q ) ;

13
15
17

// Una i m p l e m e n t a c i o n de method 1
v o i d method 1 ( i n t a , out i n t b , r e f i n t c ) {
b = a + c;
c = 3;
}

40 / 44

Colecciones (I)

Se definen fuera del n


ucleo del lenguaje en una biblioteca.
Esta biblioteca se llama Gee o libgee.
Las colecciones disponibles en Gee son:
1 Lists: Colecciones ordenadas de items accesibles por un ndice num
erico.
2 Sets: Colecciones no ordenadas.
3 Maps: Colecciones no ordenadas de items accesibles por un ndice
numerico o de otro tipo.
Algunas clases de Gee:
ArrayList<G>
HashMap<K,V>
HashSet<G>

41 / 44

Colecciones (II)
https://live.gnome.org/Vala/Tutorial

u s i n g Gee ;
2
4
6
8
10
12
14
16

v o i d main ( ) {
v a r l i s t = new A r r a y L i s t <i n t > ( ) ;
l i s t . add ( 1 ) ;
l i s t . add ( 2 ) ;
l i s t . add ( 5 ) ;
l i s t . add ( 4 ) ;
l i s t . i n s e r t (2 , 3) ;
l i s t . remove at (3) ;
foreach ( int i in l i s t ) {
s t d o u t . p r i n t f ( " %d \ n " , i ) ;
}
l i s t [ 2 ] = 10;
s t d o u t . p r i n t f ( " %d \ n " , l i s t [ 2 ] ) ;
}

// same a s
// same a s

l i s t . s e t (2 , 10)
l i s t . get (2)

Compilar y ejecutar:
2

$ v a l a c pkg gee 1.0 geel i s t . v a l a


$ . / geel i s t

42 / 44

Soporte multi-thread
https://live.gnome.org/Vala/Tutorial

2
4
6
8
10

void thread func () {


s t d o u t . p r i n t f ( " Thread running .\ n " ) ;
return null ;
}
i n t main ( s t r i n g [ ] a r g s ) {
i f ( ! Thread . s u p p o r t e d ( ) ) {
s t d e r r . p r i n t f ( " Cannot run without threads .\ n " ) ;
return 1;
}
try {
Thread . c r e a t e ( t h r e a d f u n c , f a l s e ) ;
} catch ( ThreadError e ) {
return 1;
}

12
14
16
18

return 0;
}

20
22

// E s t e t i p o de c o d i g o s e d e b e c o m p i l a r a s i :
> v a l a c t h r e a d t h r e a d s a m p l e . v a l a

43 / 44

Enlaces de interes

Vala para programadores en C#

Vala para programadores en Java

La gesti
on de memoria din
amica en Vala

Lista de

bibliotecas

preparadas para ser usadas desde Vala

Preguntas frecuentes en Vala:

live.gnome.org/Vala/FAQ

Un tutorial en vdeo que muestra lo sencillo que es crear una

aplicacion en vala con interfaz grafico:

Ejemplos sencillos

ejemplos de nivel medio

ejemplos con se
nales y callbacks

video-tutorial

ejemplos con cadenas

ejemplos con propiedades

44 / 44

You might also like