sábado, 3 de abril de 2010

Microsoft mostra jogo rodando no Xbox, PC e Celular com Windows Phone 7

Salve, salve

Durante a apresentação no TechEd Middle East em Dubai, Eric Rudder, da Microsoft, jogou um joguinho estilo Indiana Jones em um computador com Windows, em um celular com Windows 7 Phone, e no Xbox 360. O mesmo jogo, a mesma partida. Prepare-se para levar seu jogo para qualquer lugar.





Take care

sexta-feira, 2 de abril de 2010

Dicas Delphi - Gera Resultado de Consulta no Excel

Salve, salve

** Dica retirada da internet

A Procedure GerarExcel, recebe como parâmetro o nome de um componente de consulta, TQuery1/ClientDataSet por exemplo, e gera uma planilha no Excel com os campos e registros da consulta. Observe o código abaixo:

procedure TForm1.GerarExcel(Consulta:TQuery);
var
coluna, linha: integer;
excel: variant;
valor: string;
begin
try
excel:=CreateOleObject('Excel.Application');
excel.Workbooks.add(1);
except
Application.MessageBox ('Versão do Ms-Excel'+
'Incompatível','Erro',MB_OK+MB_ICONEXCLAMATION);
end;
Consulta.First;
try
for linha:=0 to Consulta.RecordCount-1 do
begin
for coluna:=1 to Consulta.FieldCount do
begin
valor:= Consulta.Fields[coluna-1].AsString; excel.cells [linha+2,coluna]:=valor;
end;
Consulta.Next;
end;
for coluna:=1 to Consulta.FieldCount do
begin
valor:= Consulta.Fields[coluna-1].DisplayLabel;
excel.cells[1,coluna]:=valor;
end;
excel.columns.AutoFit;
excel.visible:=true;
except
Application.MessageBox ('Aconteceu um erro desconhecido durante a conversão'+
'da tabela para o Ms-Excel','Erro',MB_OK+MB_ICONEXCLAMATION);
end;
end;


// Deixe seu comentário


Take care

Dicas Delphi - Mostrando o usuário logado no windows

Salve, salve


Incremente seu sistema, exibindo o usuário logado no windows.

function LogUser: string;
var
Registro: TRegistry;
begin
Registro := TRegistry.Create;
Registro.RootKey := HKEY_LOCAL_MACHINE;
if Registro.OpenKey('Network\Logon', false) then
begin
result := Registro.ReadString('username');
end;
Registro.Free;
end;


// Deixe seu comentário


Take care

Dicas Delphi - Validando Cartão de Crédito

Salve, salve

** Dica retirada da internet

A função CheckCC verifica se o número digitado identifica um cartão de crédito. Esta retorna um número inteiro e recebe como parâmetro uma string que é o número do cartão.


function TForm1.CheckCC(c: string): Integer;
var
card: string[21];
Vcard: array[0..21] of Byte absolute card;
Xcard: Integer;
Cstr: string[21];
y, x: Integer;
begin
Cstr := '';
FillChar(Vcard, 22, #0);
card := c;
for x := 1 to 20 do
if (Vcard[x] in [48..57]) then
Cstr := Cstr + chr(Vcard[x]);
card := '';
card := Cstr;
Xcard := 0;
if not odd(Length(card)) then
for x := (Length(card) - 1) downto 1 do
begin
if odd(x) then
y := ((Vcard[x] - 48) * 2)
else
y := (Vcard[x] - 48);
if (y >= 10) then
y := ((y - 10) + 1);
Xcard := (Xcard + y)
end
else
for x := (Length(card) - 1) downto 1 do
begin
if odd(x) then
y := (Vcard[x] - 48)
else
y := ((Vcard[x] - 48) * 2);
if (y >= 10) then
y := ((y - 10) + 1);
Xcard := (Xcard + y)
end;
x := (10 - (Xcard mod 10));
if (x = 10) then
x := 0;
if (x = (Vcard[Length(card)] - 48)) then
Result := Ord(Cstr[1]) - Ord('2')
else
Result := 0
end;


// Deixe seu comentário


Take care

Utilizando JOINS em SQL

Salve, salve

Para aqueles que tinham dúvidas quanto ao funcionamento dos JOIN's das tabelas no SQL, desenvolvi um pequeno tutorial de apoio, que segue abaixo:

Tabelas e seus registros:
TABELA_A
--------------------
|CODIGO | NOME |
--------------------
| 1 | UM |
| 2 | DOIS |
| 3 | TRES |
| 4 | QUATRO |
| 5 | CINCO |
--------------------

TABELA_B
------------------------
|LANCA | CODIGO | VALOR|
------------------------
| 1 | 1 | 1.000|
| 2 | 1 | 2.000|
| 3 | 1 | 5.000|
| 4 | 2 | 4.000|
| 5 | 2 | 9.000|
| 6 | 3 | 7.000|
| 7 | 5 | 4.000|
| 8 | 8 | 7.000|
------------------------

Para a relação entre as tabelas temos:

• 3 registros para a empresa 1 (que existe na tabela de empresas);
• 2 registros para a empresa 2 (que existe na tabela de empresas);
• 1 registros para a empresa 3 (que existe na tabela de empresas);
• 0 registros para a empresa 4 (que existe na tabela de empresas);
• 1 registros para a empresa 5 (que existe na tabela de empresas);
• 1 registros para a empresa 8 (que NÃO existe na tabela de empresas);

Agora vamos ver como ficariam as pesquisas* (SELECT's) com os JOIN's
( INNER, [ LEFT | RIGHT | FULL ] OUTER ):

* Para tais pesquisas vamos usar a seguinte linguagem:
SELECT [CAMPOS]
FROM "TABELA_DA_ESQUERDA"
[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN "TABELA_DA_DIREITA"

1) INNER JOIN:

SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
INNER JOIN TABELA_B B ON B.CODIGO = A.CODIGO

-------------------
|A.NOME | B.VALOR |
-------------------
1.|UM | 1.000|
2.|UM | 2.000|
3.|UM | 5.000|
4.|DOIS | 4.000|
5.|DOIS | 9.000|
6.|TRES | 7.000|
7.|CINCO | 4.000|
-------------------

Nas pesquisas com INNER JOIN o resultado trará somente as linhas que sejam comum nas 2 tabelas, ligadas pelos campos das tabelas em questão na pesquisa.

2) LEFT OUTER JOIN:

SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
LEFT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO

-------------------
|A.NOME | B.VALOR |
-------------------
1.|UM | 1.000|
2.|UM | 2.000|
3.|UM | 5.000|
4.|DOIS | 4.000|
5.|DOIS | 9.000|
6.|TRES | 7.000|
7.|QUATRO | |
8.|CINCO | 4.000|
-------------------

Nas pesquisas com LEFT OUTER JOIN o resultado trará todas os registros que estejam na tabela da esquerda do JOIN (neste caso é a TABELA_A) ao menos 1 vez, mesmo que não tenham registros na tabela da direita do JOIN (neste caso é a TABELA_B) ligadas à tabela da esquerda, como é o caso da linha 7.

3) RIGHT OUTER JOIN:

SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
RIGHT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO

-------------------
|A.NOME | B.VALOR |
-------------------
1.|UM | 1.000|
2.|UM | 2.000|
3.|UM | 5.000|
4.|DOIS | 4.000|
5.|DOIS | 9.000|
6.|TRES | 7.000|
7.|CINCO | 4.000|
8.| | 7.000|
-------------------

Nas pesquisas com RIGHT OUTER JOIN o resultado trará todas os registros que estejam na tabela da direita do JOIN (neste caso é a TABELA_B) ao menos 1 vez, mesmo que não tenham registros na tabela da esquerda do JOIN (neste caso é a TABELA_A) ligadas à tabela da direita, como é o caso da linha 8.

4) FULL OUTER JOIN:

SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
FULL OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO

-------------------
|A.NOME | B.VALOR |
-------------------
1.|UM | 1.000|
2.|UM | 2.000|
3.|UM | 5.000|
4.|DOIS | 4.000|
5.|DOIS | 9.000|
6.|TRES | 7.000|
7.|QUATRO | |
8.|CINCO | 4.000|
9.| | 7.000|
-------------------


// Deixe seu comentário


Take care

Otimizações SQL

Salve, salve

Algumas dicas para otimizações em instruções SQL (em alguns casos o servidor de banco de dados pode não suportar algumas instruções ou cláusulas).

1) Todas as vezes que for utilizar um SQL que possua condições de OR, é mais aconselhável e mais rápido utilizar IN, como no exemplo:

AO INVÉS DE
select * from projint where sit_projint = ‘AI’ or sit_projint = ‘EL’

DIGITE
select * from projint where sit_projint IN (‘AI’,‘EL’);

2) Quando existem duas ou mais condições AND juntas, especifique primeiro sempre a que possui o maior limite de ocorrências

AO INVÉS DE
select count(*) from pessoa where sit_pessoa = 11 AND cod_munic > 1100155

USE
select count(*) from pessoa where cod_munic > 1100155 AND sit_pessoa = 11

3) Quando existem duas ou mais condições OR juntas, especifique primeiro sempre a que possui o maior limite de ocorrências

AO INVÉS DE
select count(*) from pessoa where cod_munic > 1100155 OR sit_pessoa = 11

DIGITE
select count(*) from pessoa where sit_pessoa = 11 OR cod_munic > 1100155

4) Tenha cuidado com o sinal de <>

AO INVÉS DE
select count(*) from pessoawhere cod_munic < > 1100155

DIGITE
select count(*) from pessoawhere cod_munic < 1100155 OR cod_munic > 1100155


// Deixe seu comentário


Take care

Dicas Delphi - Movendo o foco para o próximo Edit quando o tamanho máximo de caracteres foi alcançado

Salve, salve

A propriedade MaxLenght de um componente descendente de TCustomEdit (Edit, DBEdit, etc.) especifica o número máximo de caracteres que o usuário pode inserir no controle. Esta dica mostra como mover imediatamente para o próximo controle (seguindo a ordem do tab) quando o número máximo de caracteres for alcançado.

procedure TForm1.Edit1Change(Sender: TObject) ;
begin
if Sender is TEdit then
with Sender as TEdit do
if MaxLength = GetTextLen then
Self.SelectNext(TCustomEdit(Sender), True, True);
end;

O código anterior é do evento OnChange de um Edit chamado Edit1. A propriedade MaxLength é utilizada em aplicações que utilizam bancos de dados, onde o MaxLength de um DBEdit é o mesmo que a propriedade Size de um TField (para campos texto).


//Deixe seu comentário


Take care

Dicas Delphi - Código que exclui itens selecionados de um Listbox

Salve, salve

Adicione um ListBox no formulário, altere a propriedade MultiSelect para True. Adicione alguns itens na propriedade Items do componente. Implemente a procedure a seguir:

procedure DeletarVarios(var ListBox1: TListBox);
var
lista1, lista2: TStringList;
i: integer;
begin
for i := 0 to ListBox1.Items.Count-1 do
if ListBox1.Selected[i] then
begin
ListBox1.Items.Strings[i] := '';
ListBox1.Items.SaveToFile(extractfilepath(application.ExeName)+'items.txt');
end;
lista2 := TStringList.Create;
lista1 := TStringList.Create;
lista1.LoadFromFile(extractfilepath(application.ExeName)+'items.txt');
for i := 0 to lista1.Count-1 do
begin
if lista1.Strings[i] <> '' then
begin
lista2.Add(lista1.Strings[i]);
lista2.SaveToFile(extractfilepath(application.ExeName)+'items.txt');
end
else
lista2.SaveToFile(extractfilepath(application.ExeName)+'items.txt');
end;
ListBox1.Items.LoadFromFile(extractfilepath(application.ExeName)+'items.txt');
DeleteFile(extractfilepath(application.ExeName)+'items.txt');
end;

Coloque um botão no formulário e “chame” a procedure criada anteriormente.


// Deixe seu comentário

Take care

Dicas Delphi - Como mostrar o hint de um Button na StatusBar

Salve, salve amigos

// Criando a função para mostrar a hora
function mostrahora: string;
begin
mostrahora := timetostr(time);
end;

// Criando a função para mostrar a data

function mostradata: string;
var
dthoje: TDatetime;
diasemana: integer;
strdiasemana: string;
begin
dthoje := date;
diasemana := dayofweek(dthoje);
case diasemana of
1: strdiasemana := 'Domingo';
2: strdiasemana := 'Segunda-feira';
3: strdiasemana := 'Terça-feira';
4: strdiasemana := 'Quarta-feira';
5: strdiasemana := 'Quinta-feira';
6: strdiasemana := 'Sexta-feira';
7: strdiasemana := 'Sábado';
end;
mostradata := strdiasemana+' '+datetostr(dthoje);
end;

No formulário coloque: um Timer, um Application Events e uma StatusBar adicionando 3 Panels. Clique no Application Events, no evento OnHint digite o código abaixo:

procedure TFprincipal.ApplicationEvents1Hint(Sender: TObject);
begin
StatusBar1.Panels[2].Text := Application.Hint;
end;

Logo depois: Selecione no timer dê 2 cliques e digite o código abaixo:

procedure TFprincipal.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels[0].Text := mostrahora();
StatusBar1.Panels[1].Text := mostradata();
end;

Para testar coloque um botão e digite qualquer hint para ele, daí e só compilar e testar passando o mouse em cima do botão.


// Deixe seu comentátio

Take care

Dicas Delphi - Mudando a cor de fundo de linhas diferentes de texto em um Listbox

Salve, salve

Crie uma nova aplicação, insira um Listbox e altere a propriedade Style para lbOwnerDrawFixed, depois clique na propriedade Items (...) e digite alguns valores em linhas diferentes. Copie o código abaixo, no evento OnDrawItem do Listbox.

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
myColor: TColor;
myBrush: TBrush;
begin
myBrush := TBrush.Create;
with (Control as TListBox).Canvas do
begin
if not Odd(Index) then
myColor := clSilver
else
myColor := clWhite;
myBrush.Style := bsSolid;
myBrush.Color := myColor;
Windows.FillRect(handle, Rect, myBrush.Handle);
Brush.Style := bsClear;
TextOut(Rect.Left, Rect.Top,(Control as TListBox).Items[Index]);
MyBrush.Free;
end;
end;

Não se esqueça de incluir valores no Listbox para que possa ser visto o efeito das cores. Execute a aplicação e veja a o funcionamento.

// Deixe seu comentátio ok.

Take care

Dicas Delphi - Utilize as teclas para mover entre os controles

Salve, salve amigos

As teclas UP e DOWN são virtualmente sem utilidade em controles Edit. Então porque não utilizá-las para navegar entre os campos? Se você alterar a propriedade KeyPreview de um formulário para True, pode usar o seguinte trecho de código no evento OnKeyDown do formulário para navegar entre os controles.

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift : TShiftState) ;
var
Direction : Integer;
begin
Direction := -1;
case Key of
VK_DOWN, VK_RETURN : Direction := 0; {Next}
VK_UP : Direction := 1; {Previous}
end;
if Direction <> -1 then
begin
Perform(WM_NEXTDLGCTL, Direction, 0) ;
Key := 0;
end;
end;

// Deixe seu comentário.


Take care

terça-feira, 30 de março de 2010

Disponibilizados os Videos Mix10

Salve, salve,

Segue abaixo, link com os vídeos disponibilizados do evento MIX10.

Clique aqui


Take care.

Construindo uma aplicação Windows Phone 7 Twitter utilizando Silverlight

Salve, salve amigos,

Veja no link abaixo, no blog de Scott Guthrie, um passo a passo de como criar uma aplicação Windows Phone 7 Twitter utilizando Silverlight.

Clique aqui

Take care