gridCadastro.ColumnDefinitions.Add(new ColumnDefinition());
gridCadastro.RowDefinitions.Add(new RowDefinition());
TextBox txt = new TextBox();
TextBlock lbl = new TextBlock();
//label
lbl.Text = "e-mail";
lbl.SetValue(Grid.RowProperty, 0);
lbl.SetValue(Grid.ColumnProperty, 0);
lbl.HorizontalAlignment = HorizontalAlignment.Left;
//textbox
txt.MaxLength = 30;
txt.Width = 100;
txt.Name = "txtEmail";
txt.SetValue(Grid.RowProperty, 0);
txt.SetValue(Grid.ColumnProperty, 1);
txt.HorizontalAlignment = HorizontalAlignment.Left;
gridCadastro.Children.Add(lbl);
gridCadastro.Children.Add(txt);
quarta-feira, julho 29, 2009
Silverlight :: Grid :: Adicionando componentes dinamicamente
Como nem tudo é alegria na vida de um programador e as vezes temos que adicionar um componente dinamicamente no codigo ou ler um arquivo de um template e criar uma tela apartir dele. Pelo menos sempre tem uma solução :P a um tempo atras desenvolvi um algoritmo que le uma classe ou um xml e cria a tela em tempo de execução. Como os controles do Silverlight são diferentes não foi so migrar o codigo para o Silverlight e pronto. Abaixo um exemplo basico de como criar as linhas e colunas e adicionar no Grid, comentado no post anterior.
Silverlight :: Grid
Uma breve introdução ao controle GRID do silverlight.
E o resultado...
Bom inicialmente para utilizar o controle é preciso definir as linhas e colunas do grid, abaixo é possivel ver os ROWS e COLUMN DEFINITION que indica as caracteristicas de cada linha e coluna dentro do grid. Por padrão se as linhas e colunas não tiverem altura e largura definidas, serão ajustadas conforme o controle pai.
No meu exemplo utilizei tipos diferentes para as linhas a fim de demonstrar esse comportamento.
A primeirta linha tem altura fixa, a segunda uma altura máxima e a terceira se ajusta com o tamanho restante conforme o comportamento do controle pai.
Para as duas primeiras colunas utilizei o AUTO que vai definir o tamanho conforme o controle filho, já a terceira coluna vai pegar todo o restante da largura.
Sobre os controles, é necesário posicionar cada um dentro do grid. :(
É, pra quem está acostumado com o velho HTML é algo no mínimo estranho, mas ok.
Então para cada controle definimos as caracteristicas Grid.Row e Grid.Column, se em algum controle não for definido, por padrão será colocado o valor zero, posicionando assim na primeira linha e/ou coluna.
<Grid Name="gridCadastro" Background="YellowGreen" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="25"></RowDefinition>
<RowDefinition MaxHeight="60"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="e-mail"></TextBlock>
<TextBox Grid.Row="0" Grid.Column="1" Width="100" Height="25"></TextBox>
<TextBlock Grid.Row="1" Grid.Column="0" Text="password" VerticalAlignment="Center"></TextBlock>
<TextBox Grid.Row="1" Grid.Column="1" Width="100" Height="25"></TextBox>
<Button Grid.Row="2" Grid.Column="2" Content="GO!" Height="30" ></Button>
</Grid>
E o resultado...
quarta-feira, julho 15, 2009
Eu no twitter http://twitter.com/danielcolnaghi não esperem muita coisa, ainda não vejo finalidade pra ele hehe.
segunda-feira, julho 13, 2009
Usando Reflection
A um tempo atrás desenvolvi um gerador de classes, logo depois incrementei um gerador de interface seguindo um padrão pré estabelecido. Algumas vezes criar geradores pode ser uma solução para criar um projeto do zero com uma certa garantia de qualidade. Digo isso porque normalmente o código gerado não contém erros(pelo menos eu acho que não pode!).
Em todo caso sistemas que estão em constante mudanças, o gerador se torna uma ferramenta superficial e que pode causar dor de cabeça. Isso porque para continuar utilizando o gerador o desenvolvedor usará seu tempo programando o código a ser gerado e não o código final.
Uma outra abordagem para evitar o gerador e não comprometer o tempo que seria ganho com ele, é criar telas genéricas e manipular as classes dinamicamente.
No exemplo abaixo criei um método que carrega os dados do objeto e popula os campos da tela conforme um arquivo XML que contém a definição para cada campo.
protected void CarregarObjeto(string codigo)
{
Assembly a = Assembly.Load("MyClassLib");
var obj = a.CreateInstance("MyNamespace.MyClass");
Type t = obj.GetType();
PropertyInfo[] pInfo = t.GetProperties();
// pInfo[0] = PK
if (t.GetProperties()[0].PropertyType.FullName == "System.String")
{
pInfo[0].SetValue(obj, codigo, null);
}
else
{
pInfo[0].SetValue(obj, Convert.ToInt32(codigo), null);
}
t.GetMethod("Load").Invoke(obj, null);
foreach (PropertyInfo p in t.GetProperties())
{
if (p.GetValue(obj, null) != null && plhCadastro.FindControl(string.Concat("txt", p.Name)) != null)
{
((TextBox)plhCadastro.FindControl(string.Concat("txt", p.Name))).Text = p.GetValue(obj, null).ToString();
}
}
}
quinta-feira, julho 09, 2009
Subsonic 3
Subsonic 3 está disponível para downlaod e agora com o framework 3.5, ainda estou testando para ver quais as novidades e se ele está estável mesmo hehe.
No entanto para rodar os exemplos será preciso baixar o ASP.NET MVC disponível no site www.asp.net ou diretamente no site da microsoft.
quarta-feira, junho 17, 2009
Web Tower Battle
Bom, como eu não consigo ficar em cima de um único projeto :P resolvi tocar em paralelo outro jogo que na verdade é uma versão pra web do jogo de cartas Arcomage.
A jogabilidade será um pouco diferente da que estou fazendo em XNA. O jogador pode atacar várias torres ao mesmo tempo, o objetivo é fazer com que o jogador não se prenda a apenas um inimigo e sim a uma lista de inimigos e aliados.
Em cada ataque o jogador ganha experiência e pode avançar de nível conforme seu progresso.
Espero até o final do mês disponibilizar uma versão beta para avaliação e testes. Caso alguém tenha interesse em fazer parte da equipe é só entrar e contato.
Cargos abertos:
Designer
Sonoplastia
Desenvolvedor de interface(HTML, CSS)
sexta-feira, maio 29, 2009
Gerador de Classes C# FireBird
terça-feira, maio 26, 2009
segunda-feira, maio 25, 2009
Snippet Generator
Um dos meus projetos é um gerador de snippet, ele cria trechos de codigos que seguem um padrão e que são usados no dia a dia. O gerador conta com a ajuda do Subsonic que gera as classes do banco de dados para acessar as propriedades dos objetos e criar formulários tipados e com suas principais caracteristicas. Veja abaixo exemplos de códigos gerados.

SALVAR - Utilizando a estrutura do Subsonic, faz conversão para os tipos.

HTML - Cria formulários com os campos e suas propriedades, adiciona resources, validators, tamanho do campo, verifica vinculo com tabelas e adiciona dropdownlist.

SALVAR - Utilizando a estrutura do Subsonic, faz conversão para os tipos.
HTML - Cria formulários com os campos e suas propriedades, adiciona resources, validators, tamanho do campo, verifica vinculo com tabelas e adiciona dropdownlist.
sexta-feira, maio 22, 2009
Crystal Reports C# Custom DataSource
Aqui vai uma dica para quem estiver começando a usar o Crystal Reports no Asp.Net.
DataSet ds = new DataSet();
DataTable t = ds.Tables.Add("Cliente");
t.Columns.Add("ClienteID", Type.GetType("System.Int32"));
t.Columns.Add("Nome", Type.GetType("System.String"));
DataRow r;
Na maioria dos exemplos da web é mostrado usando os componentes CrystalReportViewer, CrystalReportSource e SqlDataSource. Mas infelizmente nem sempre é possível utilizar um comando SQL no SQLDataSource. As vezes é preciso tratar o retorno da pesquisa ou até adicionar campos extras. Para estes casos é possível criar uma tabela temporária para passar as informações para o reporte, observe o código abaixo:
DataTable t = ds.Tables.Add("Cliente");
t.Columns.Add("ClienteID", Type.GetType("System.Int32"));
t.Columns.Add("Nome", Type.GetType("System.String"));
DataRow r;
// O select abaixo é feito usando o Subsonic
List<Cliente> colecaoCliente = new Select().From(Cliente.Schema).ExecuteTypedList<Cliente>();
foreach (Cliente c in colecaoCliente)
{
r = t.NewRow();
r["ClienteID"] = c.ClienteID;
r["Nome"] = c.Nome;
t.Rows.Add(r);
}
ReportDocument rpt = new ReportDocument();
rpt.Load(Server.MapPath("~/reports/RelatorioCliente.rpt"));
rpt.SetDataSource(ds.Tables[0]);
crv.ReportSource = rpt;
List<Cliente> colecaoCliente = new Select().From(Cliente.Schema).ExecuteTypedList<Cliente>();
foreach (Cliente c in colecaoCliente)
{
r = t.NewRow();
r["ClienteID"] = c.ClienteID;
r["Nome"] = c.Nome;
t.Rows.Add(r);
}
ReportDocument rpt = new ReportDocument();
rpt.Load(Server.MapPath("~/reports/RelatorioCliente.rpt"));
rpt.SetDataSource(ds.Tables[0]);
crv.ReportSource = rpt;
E não esqueça de criar o CrystalReportView!
<CR:CrystalReportViewer ID="crv" runat="server" AutoDataBind="true" />
<CR:CrystalReportViewer ID="crv" runat="server" AutoDataBind="true" />
Alguns links pesquisados e muito uteis.
quinta-feira, maio 21, 2009
Zombie Chaos Project
Ontem comentei do meu jogo de cartas no estilo ArcoMage, agora vou mostrar um pouco do outro projeto que iniciou em um curso de games em que eu ministrei.
Como eu gosto de jogos de zumbi, resolvi criar um jogo simples que eu pudesse usar de exemplo na aula. Já que o jogo seria 2D não compliquei fazendo objetivos complexos, a unica coisa que o jogador precisava fazer era defender a casa da horda de zumbi. Bem, pelo menos essa foi a idéia inicial.
Logo após o curso decidi implementar outras idéias no jogo, como: coletar dinheiro, passar de fase, criar hordas randomicas, comprar munição e futuramente comprar armas e veículos. A idéia pareceu tão legal que resolvi contratar uma pessoa experiente para criar os gráficos do jogo. Foi ae que descobri um desenhista de games.
Resolvi então desembolsar uns trocos pra fazer a arte final da capa e ver a qualidade do trabalho. Eu curti muito a arte final, realmente muito profissional.

Agradeço a Rodrigo Castro Pereira que fez a arte da tela inicial do jogo.
Atualmente o jogo está parado, gostaria de continuar mas infelizmente não tenho recursos pra continuar bancando a arte. Estou atras de um patrocinador ou algum colaborador. No mais, vou dar um tempo e assim que sobrar uns pilas vou investir mais um pouco para ver até onde vai a idéia e se consigo chegar ao ponto de vender o jogo em caixas e tudo mais.
Encerrando, para quem gosta de jogos de zumbi, segue o link do site zombie games com vários jogos em flash.
quarta-feira, maio 20, 2009
O preço do conhecimento
Sempre que procuro a solução de um problema diferente, seja ele novo, dificil ou até raro, as vezes me deparo com um site que vai contra meu coceito de compartilhar conhecimento e evoluir.
Estava procurando algo trivial mas que não sabia como descrever para o google achar. Foi então que digitei cento e novecentas palavras e achei um link que era o que eu procurava!
E o melhor de tudo, é FREE!
Real Wolverine Claws
É, realmente algumas pessoas tem muito tempo sobrando pra fazer uma coisa dessas.
Uma coisa é certo, é uma criança feliz!
Programação de jogos em XNA
Opa!
Achei interessante a ideia de começar a escrever um pouco para assim poder divulgar mais meus trabalhos que faço nas horas vagas. Em especial os jogos de XNA que estou me dedicando cada vez mais.

Atualmente estou desenvolvendo a engine de um jogo de cartas parecido com ArcoMage, um jogo que tem dentro do jogo Might & Magic 7 e 8.
A idéia do jogo é destruir a torre do adversário ou aumentar a torre o mais alto possivel. Para isso o jogador deve usar cartas para elevar a torre, criar muro, atacar o adversário e elevar seus recursos.
Na versão atual já é possivel sortear as cartas e o baralho inicial dos jogadores. Assim que tiver um tempo, posto uma imagem do jogo e quando estiver jogavel, uma versão beta.
sexta-feira, fevereiro 13, 2009
Assinar:
Postagens (Atom)