Sei sulla pagina 1di 16

IFRN TADS Atividade de Desenvolvimento Integrado Aluno: Rafael Brito Pantoja Matrcula: 201014040264 - Adicionando e excluindo Categoria 1- Criando

o Script para excluir categoria:


CREATE Procedure RemoveCategory ( @CategoryID int ) AS DELETE FROM Products WHERE CategoryID = @CategoryID DELETE FROM Categories WHERE CategoryID = @CategoryID

2 Criando os mtodos de adicionar e excluir categoria no servio(dois ltimos mtodos):


using using using using using using using using using System; System.Collections.Generic; System.Data; System.Data.SqlClient; System.Linq; System.Runtime.Serialization; System.ServiceModel; System.ServiceModel.Activation; System.Web.Configuration;

namespace ProvaDI.Web { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class ServiceAcessoDados { private static String connectionString = WebConfigurationManager.ConnectionStrings["RafaelDB"].ConnectionString; SqlConnection con = new SqlConnection(connectionString); [OperationContract()] public List<Categories> ListarCategorias() { List<Categories> lista = new List<Categories>(); SqlCommand cmd = new SqlCommand("GetCategories", con); cmd.CommandType = System.Data.CommandType.StoredProcedure; con.Open(); try { SqlDataReader reader = cmd.ExecuteReader(); while(reader.Read()) { Categories c = new Categories();

c.CategoryID = Convert.ToInt32(reader["CategoryID"]); c.CategoryName = reader["CategoryName"].ToString(); lista.Add(c); } return lista; } catch (SqlException ex) { throw new Exception("Erro=" + ex.Message); } finally { con.Close(); } } [OperationContract()] public List<Products> ListarProdutosPorCategoria(int categoriaId) { List<Products> produtos = new List<Products>(); SqlCommand cmd = new SqlCommand("ProductsByCategory", con); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@CategoryID", categoriaId); con.Open(); try { SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Products p = new Products(); p.ProductID = Convert.ToInt16(reader["ProductID"]); p.Description = reader["Description"].ToString(); p.ModelName = reader["ModelName"].ToString(); p.UnitCost = Convert.ToDecimal(reader["UnitCost"]); p.ProductImage = (byte[]) reader.GetValue(4); produtos.Add(p); } return produtos; } catch (SqlException ex) { throw new Exception("Erro=" + ex.Message); } finally { con.Close(); } } [OperationContract()] public string RemoverCategoria(int categoriaId) { SqlCommand cmd = new SqlCommand("RemoveCategory", con); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@CategoryID", categoriaId); con.Open(); try { cmd.ExecuteReader(); return "sucesso";

} catch (SqlException ex) { throw new Exception("Erro=" + ex.Message); } finally { con.Close(); } }

[OperationContract()] public string AdicionarCategoria(string categoriaNome) { string sqlIns = "INSERT INTO Categories (CategoryName) VALUES (@categoriaNome)"; SqlCommand cmd = new SqlCommand(sqlIns, con); cmd.Parameters.AddWithValue("@categoriaNome", categoriaNome); con.Open(); try { cmd.ExecuteNonQuery(); return "sucesso"; } catch (SqlException ex) { throw new Exception("Erro=" + ex.Message); } finally { con.Close(); } } } }

3 Criando evento pra remover categoria selecionada quando clicar no boto Excluir Categoria: MainPage.xaml
<Button Content="excluir categoria" HorizontalAlignment="Left" Margin="444,153,0,0" VerticalAlignment="Top" Style="{StaticResource ButtonStyle}" Grid.Row="0" Click="Button_Click_1"/>

Criar varivel para guardar id da categoria selecionada e setar seu valor quando clicar em cima de uma categoria.
int categoriaId = -1; private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Grid g = sender as Grid; TextBlock tb = g.Children[0] as TextBlock; //Anexar um manipulador de eventos para o evento completed.

cliente.ListarProdutosPorCategoriaCompleted += cliente_ListarProdutosPorCategoriaCategoriaCompleted; //Inicia a chamada ao servio web cliente.ListarProdutosPorCategoriaAsync(Convert.ToInt32(tb.Text)); categoriaId = (Convert.ToInt32(tb.Text)); }

4 Definindo o evento que vai ser chamado quando clicar no boto de excluir categoria: MainPage.xaml.cs
private void Button_Click_1(object sender, RoutedEventArgs e) { if (categoriaId == -1) { MessageBox.Show("Nenhuma Categoria Selecionada"); } else { cliente.RemoverCategoriaCompleted += cliente_RemoverCategoriaCompleted; cliente.RemoverCategoriaAsync(categoriaId); } } void cliente_RemoverCategoriaCompleted(object sender, ProvaReferencia.RemoverCategoriaCompletedEventArgs e) { if (e.Result == "sucesso") { Button_Click(listarCategorias, null); MessageBox.Show("Categoria removida com sucesso"); categoriaId = -1; } else { MessageBox.Show(e.Result); } }

5 Criando a janela de adicionar categoria: Add>New Item> Silverlight Child Window

Figura 1- Criando modal de cadastro de categoria

CadCategoria.xaml

<controls:ChildWindow x:Class="ProvaDI.CadCategoria" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clrnamespace:System.Windows.Controls;assembly=System.Windows.Controls" Width="285.512" Height="117.078" Title="Adicionar Categoria"> <Grid x:Name="LayoutRoot" Margin="2"> <Grid.ColumnDefinitions> <ColumnDefinition Width="65"/> <ColumnDefinition Width="59*"/> <ColumnDefinition Width="140*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Margin="3">Categoria:</TextBlock> <TextBox x:Name="txtCategoriaNome" Grid.Row="0" Grid.Column="1" Margin="3,3,0,3" Width="150" HorizontalAlignment="Left" Grid.ColumnSpan="2"></TextBox> <Button x:Name="OKButton" Content="Salvar" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Left" Margin="0,12,0,0" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/> <Button x:Name="CancelButton" Content="Cancelar" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Left" Margin="41.371,12,0,0" Grid.Row="1" Grid.Column="2" /> </Grid> </controls:ChildWindow>

6 Chamando o mtodo de adicionar categoria na janela modal: CadCategoria.xaml.cs


using using using using using using using using using using using using System; System.Collections.Generic; System.Linq; System.Net; System.Windows; System.Windows.Controls; System.Windows.Documents; System.Windows.Input; System.Windows.Media; System.Windows.Media.Animation; System.Windows.Shapes; ProvaDI.ProvaReferencia;

namespace ProvaDI { public partial class CadCategoria : ChildWindow { ProvaReferencia.ServiceAcessoDadosClient cliente; public CadCategoria(ProvaReferencia.ServiceAcessoDadosClient client) { InitializeComponent(); cliente = client; } private void OKButton_Click(object sender, RoutedEventArgs e) { cliente.AdicionarCategoriaCompleted +=cliente_AdicionarCategoriaCompleted; cliente.AdicionarCategoriaAsync(txtCategoriaNome.Text); } void cliente_AdicionarCategoriaCompleted(object sender, ProvaReferencia.AdicionarCategoriaCompletedEventArgs e) { if (e.Result == "sucesso") { this.DialogResult = true; } else { MessageBox.Show(e.Result); this.DialogResult = false; } } private void CancelButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; }

} }

7 Chamando a tela de cadastro na pgina principal MainPage.xaml


<Button Content="Adicionar categoria" HorizontalAlignment="Left" Margin="663,153,0,0" VerticalAlignment="Top" Style="{StaticResource ButtonStyle}" Grid.Row="0" Click="Button_Click_2"/>

MainPage.xaml.cs
private CadCategoria categoriaCad = new CadCategoria(cliente); public MainPage() { InitializeComponent(); categoriaCad.Closed += new EventHandler(categoriaCad_Closed); } private void Button_Click_2(object sender, RoutedEventArgs e) { categoriaCad.Show(); } void categoriaCad_Closed(object sender, EventArgs e) { if (categoriaCad.DialogResult == true) { Button_Click(listarCategorias, null); MessageBox.Show("Categoria adcicionada com sucesso"); } }

- Exibir Imagem do produto no datagrid 1 - Necessrio redefinir a tabela de Produto para suportar imagens em binrio.
use [store] ALTER TABLE Products ALTER COLUMN ProductImage varbinary(MAX)

2 - Inserindo um produto com imagem local:


use [store] GO SET IDENTITY_INSERT Products ON GO INSERT INTO Products(ProductID,CategoryID,ModelNumber,ModelName,UnitCost,Description,ProductI mage) SELECT 410 as ProductID, 16 as CategoryID, 'RU027' as ModelNumber, 'Modelo Teste' as ModelName, 2.00 as UnitCost, 'Descrio' as [Description], * FROM OPENROWSET(BULK 'D:\armored_titan_by_sohai9132-d66i68w.jpg', SINGLE_BLOB) AS ProductImage;

SET IDENTITY_INSERT Products OFF GO

3 Mudar a linha em que se pega a imagem na hora de listar:


p.ProductImage = (byte[]) reader.GetValue(4);

4 Criando o conversor de imagem


namespace ProvaDI { public class ConversorByteArrayImage : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { MemoryStream ms = new MemoryStream((byte[])value); BitmapImage image = new BitmapImage(); image.SetSource(ms); return image; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }

5 Disponibilizando o conversor na pgina:


<UserControl.Resources > <local:ConversorDePreco x:Key="ConverterPreco"></local:ConversorDePreco> <local:ConversorByteArrayImage x:Key="ConverterArrayImagem"></local:ConversorByteArrayImage> </UserControl.Resources>

6 Inserindo template para exibir imagem no dataGrid:


<sdk:DataGridTemplateColumn Header="Imagem"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Width="50" Height="98" Source="{Binding ProductImage, Converter={StaticResource ConverterArrayImagem}}" /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn>

Cdigo-Fonte:

App.xaml
<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ProvaDI.App" > <!--nao e possivel utilizar o Type Control no silverlight para aplicar em diferentes controles--> <Application.Resources> <Style x:Key="ControlBaseStyle" TargetType="Control"> <Setter Property="Foreground" Value="DarkGreen"/> <Setter Property="Background"> <Setter.Value> <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="DarkGreen" Offset="0.5"></GradientStop> <GradientStop Color="LightGreen" Offset="0.2"></GradientStop> </LinearGradientBrush> </Setter.Value> </Setter> </Style> <Style x:Key="ButtonStyle" TargetType="Button" BasedOn="{StaticResource ControlBaseStyle}"> <Setter Property="Width" Value="200"/> <Setter Property="Height" Value="30"/> <Setter Property="BorderBrush" Value="Red"/> </Style> </Application.Resources> </Application>

MainPage.xaml
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="ProvaDI.MainPage" xmlns:local ="clr-namespace:ProvaDI" mc:Ignorable="d" Height="459.94"> <UserControl.Resources > <local:ConversorDePreco x:Key="ConverterPreco"></local:ConversorDePreco> <local:ConversorByteArrayImage x:Key="ConverterArrayImagem"></local:ConversorByteArrayImage> </UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="White" Margin="10,0,10,60" Width="auto" HorizontalAlignment="Stretch">

<Grid.RowDefinitions> <RowDefinition Height="192*"/> <RowDefinition Height="217*"/> </Grid.RowDefinitions> <ListBox x:Name="listaCategorias" Height="143" VerticalAlignment="Top" ItemContainerStyle="{StaticResource ControlBaseStyle}"> <ListBox.ItemTemplate> <DataTemplate> <Border BorderBrush="Black" CornerRadius="3" BorderThickness="1" HorizontalAlignment="Stretch"> <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown" Height="30" HorizontalAlignment="Stretch"> <Grid.ColumnDefinitions> <ColumnDefinition MinWidth="100" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding CategoryID}" FontWeight="Bold"/> <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding CategoryName}" /> </Grid> </Border> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <Button Name="listarCategorias" Content="Listar Categorias" HorizontalAlignment="Left" Margin="229,153,0,0" VerticalAlignment="Top" Click="Button_Click" Style="{StaticResource ButtonStyle}" Grid.Row="0" /> <Button Content="excluir categoria" HorizontalAlignment="Left" Margin="444,153,0,0" VerticalAlignment="Top" Style="{StaticResource ButtonStyle}" Grid.Row="0" Click="Button_Click_1"/> <Button Content="Adicionar categoria" HorizontalAlignment="Left" Margin="663,153,0,0" VerticalAlignment="Top" Style="{StaticResource ButtonStyle}" Grid.Row="0" Click="Button_Click_2"/> <sdk:DataGrid Name="datagridProdutos" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Grid.Row="1" AutoGenerateColumns="False" RowHeight="70" Margin="0,0,0,51" > <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="Produto" Width="100" Binding="{Binding ModelName}" /> <sdk:DataGridTextColumn Header="Preo" Width="80" Binding="{Binding UnitCost, Converter={StaticResource ConverterPreco}}" /> <sdk:DataGridTextColumn Header="Descrio" Width="400" Binding="{Binding Description}"> <sdk:DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap"/> </Style> </sdk:DataGridTextColumn.ElementStyle> </sdk:DataGridTextColumn> <sdk:DataGridTemplateColumn Header="Imagem"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <Image Width="50" Height="98" Source="{Binding ProductImage, Converter={StaticResource ConverterArrayImagem}}" /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate>

</sdk:DataGridTemplateColumn> </sdk:DataGrid.Columns> </sdk:DataGrid> </Grid> </UserControl>

MainPage.xaml.cs
namespace ProvaDI { public partial class MainPage : UserControl { static ProvaReferencia.ServiceAcessoDadosClient cliente = new ProvaReferencia.ServiceAcessoDadosClient(); int categoriaId = -1; private CadCategoria categoriaCad = new CadCategoria(cliente); public MainPage() { InitializeComponent(); categoriaCad.Closed += new EventHandler(categoriaCad_Closed); } private void Button_Click(object sender, RoutedEventArgs e) { //Anexar um manipulador de eventos para o evento completed. cliente.ListarCategoriasCompleted += cliente_ListarCategoriasCompleted; //Inicia a chamada ao servio web cliente.ListarCategoriasAsync(); } void cliente_ListarCategoriasCompleted(object sender, ProvaReferencia.ListarCategoriasCompletedEventArgs e) { List<Categories> lista = e.Result.ToList(); listaCategorias.ItemsSource = lista; }

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Grid g = sender as Grid; TextBlock tb = g.Children[0] as TextBlock; //Anexar um manipulador de eventos para o evento completed. cliente.ListarProdutosPorCategoriaCompleted += cliente_ListarProdutosPorCategoriaCategoriaCompleted; //Inicia a chamada ao servio web cliente.ListarProdutosPorCategoriaAsync(Convert.ToInt32(tb.Text)); categoriaId = (Convert.ToInt32(tb.Text)); } void cliente_ListarProdutosPorCategoriaCategoriaCompleted(object sender, ProvaReferencia.ListarProdutosPorCategoriaCompletedEventArgs e) {

List<Products> lista = e.Result.ToList(); datagridProdutos.ItemsSource = lista; } private void Button_Click_1(object sender, RoutedEventArgs e) { if (categoriaId == -1) { MessageBox.Show("Nenhuma Categoria Selecionada"); } else { cliente.RemoverCategoriaCompleted += cliente_RemoverCategoriaCompleted; cliente.RemoverCategoriaAsync(categoriaId); } } void cliente_RemoverCategoriaCompleted(object sender, ProvaReferencia.RemoverCategoriaCompletedEventArgs e) { if (e.Result == "sucesso") { Button_Click(listarCategorias, null); MessageBox.Show("Categoria removida com sucesso"); categoriaId = -1; } else { MessageBox.Show(e.Result); } } private void Button_Click_2(object sender, RoutedEventArgs e) { categoriaCad.Show(); } void categoriaCad_Closed(object sender, EventArgs e) { if (categoriaCad.DialogResult == true) { Button_Click(listarCategorias, null); MessageBox.Show("Categoria adcicionada com sucesso"); } } } }

CadCategoira.xaml
<controls:ChildWindow x:Class="ProvaDI.CadCategoria" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clrnamespace:System.Windows.Controls;assembly=System.Windows.Controls" Width="285.512" Height="117.078" Title="Adicionar Categoria"> <Grid x:Name="LayoutRoot" Margin="2"> <Grid.ColumnDefinitions>

<ColumnDefinition Width="65"/> <ColumnDefinition Width="59*"/> <ColumnDefinition Width="140*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" Margin="3">Categoria:</TextBlock> <TextBox x:Name="txtCategoriaNome" Grid.Row="0" Grid.Column="1" Margin="3,3,0,3" Width="150" HorizontalAlignment="Left" Grid.ColumnSpan="2"></TextBox> <Button x:Name="OKButton" Content="Salvar" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Left" Margin="0,12,0,0" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2"/> <Button x:Name="CancelButton" Content="Cancelar" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Left" Margin="41.371,12,0,0" Grid.Row="1" Grid.Column="2" /> </Grid> </controls:ChildWindow>

CadCategoria.xaml.cs
namespace ProvaDI { public partial class CadCategoria : ChildWindow { ProvaReferencia.ServiceAcessoDadosClient cliente; public CadCategoria(ProvaReferencia.ServiceAcessoDadosClient client) { InitializeComponent(); cliente = client; } private void OKButton_Click(object sender, RoutedEventArgs e) { cliente.AdicionarCategoriaCompleted +=cliente_AdicionarCategoriaCompleted; cliente.AdicionarCategoriaAsync(txtCategoriaNome.Text); } void cliente_AdicionarCategoriaCompleted(object sender, ProvaReferencia.AdicionarCategoriaCompletedEventArgs e) { if (e.Result == "sucesso") { this.DialogResult = true; } else { MessageBox.Show(e.Result); this.DialogResult = false; } } private void CancelButton_Click(object sender, RoutedEventArgs e) { this.DialogResult = false; }

} }

ConversorByteArrayImage.cs
namespace ProvaDI { public class ConversorByteArrayImage : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { MemoryStream ms = new MemoryStream((byte[])value); BitmapImage image = new BitmapImage(); image.SetSource(ms); return image; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } } }

ServiceAcessoDados.svc
namespace ProvaDI.Web { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class ServiceAcessoDados { private static String connectionString = WebConfigurationManager.ConnectionStrings["RafaelDB"].ConnectionString; SqlConnection con = new SqlConnection(connectionString); [OperationContract()] public List<Categories> ListarCategorias() { List<Categories> lista = new List<Categories>(); SqlCommand cmd = new SqlCommand("GetCategories", con); cmd.CommandType = System.Data.CommandType.StoredProcedure; con.Open(); try { SqlDataReader reader = cmd.ExecuteReader(); while(reader.Read()) { Categories c = new Categories(); c.CategoryID = Convert.ToInt32(reader["CategoryID"]); c.CategoryName = reader["CategoryName"].ToString(); lista.Add(c); }

return lista; } catch (SqlException ex) { throw new Exception("Erro=" + ex.Message); } finally { con.Close(); } } [OperationContract()] public List<Products> ListarProdutosPorCategoria(int categoriaId) { List<Products> produtos = new List<Products>(); SqlCommand cmd = new SqlCommand("ProductsByCategory", con); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@CategoryID", categoriaId); con.Open(); try { SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Products p = new Products(); p.ProductID = Convert.ToInt16(reader["ProductID"]); p.Description = reader["Description"].ToString(); p.ModelName = reader["ModelName"].ToString(); p.UnitCost = Convert.ToDecimal(reader["UnitCost"]); p.ProductImage = (byte[]) reader.GetValue(4); produtos.Add(p); } return produtos; } catch (SqlException ex) { throw new Exception("Erro=" + ex.Message); } finally { con.Close(); } } [OperationContract()] public string RemoverCategoria(int categoriaId) { SqlCommand cmd = new SqlCommand("RemoveCategory", con); cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@CategoryID", categoriaId); con.Open(); try { cmd.ExecuteReader(); return "sucesso"; } catch (SqlException ex) { throw new Exception("Erro=" + ex.Message);

} finally { con.Close(); } }

[OperationContract()] public string AdicionarCategoria(string categoriaNome) { string sqlIns = "INSERT INTO Categories (CategoryName) VALUES (@categoriaNome)"; SqlCommand cmd = new SqlCommand(sqlIns, con); cmd.Parameters.AddWithValue("@categoriaNome", categoriaNome); con.Open(); try { cmd.ExecuteNonQuery(); return "sucesso"; } catch (SqlException ex) { throw new Exception("Erro=" + ex.Message); } finally { con.Close(); } } } }

Potrebbero piacerti anche