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
sábado, 3 de abril de 2010
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
** 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
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
** 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
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.|
-------------------
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.|
-------------------
// 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
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
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
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
// 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
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
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.
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
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
Assinar:
Postagens (Atom)