Pesquisar no Programero

segunda-feira, 30 de junho de 2008

Palavra com a primeira letra em Maiúsculo (Delphi)

Para casos onde temos palavras que são armazenadas todas em maiúsculo, geralmente surge a necessidade de utiliza-la de uma maneira mais elegante, como o título sugere, então vamos lá:

function Primeira_Letra_Maiuscula(p_texto: string): string;
begin


IF p_texto <> '' THEN
result := UpperCase(Copy(p_texto,1,1))+LowerCase(Copy(p_texto,2,Length(p_texto)));

end;

sexta-feira, 27 de junho de 2008

Consulta Top-N SQL Server

Esse tipo de consulta é útil em situações onde precisamos encontrar, por exemplo, os N maiores ou menores dentro de determinado grupo, os funcionários mais bem pagos, os que vendem mais, as mercadorias menos vendidas e assim por diante.

No SQL Server utilizamos o predicado TOP para recuperar um determinado número de registros e ordenamos a consulta com o ORDER BY.

Baixe aqui o script com a criação da tabela e os inserts para o teste.
No exemplo abaixo desejamos encontrar os três funcionários que ganham mais:

SELECT TOP 3
NOM_FUNC NOME, SAL_FUNC SALARIO
FROM FUNCIONARIOS
ORDER BY SAL_FUNC DESC



Agora desejamos encontrar os três funcionários que possuem os menores salários:

SELECT TOP 3
NOM_FUNC NOME, SAL_FUNC SALARIO
FROM FUNCIONARIOS
ORDER BY SAL_FUNC


Podemos perceber que ambos os códigos são idênticos, precisamos apenas mudar a ordem na cláusula ORDER BY.

quinta-feira, 26 de junho de 2008

Centralizar Texto em Edit

Como todos sabemos o Edit mantém todo texto digitado a esquerda, o que não fica bem quando o usamos para a entrada de números, pois bem, o exemplo abaixo apresenta uma alternativa para centralizar um determinado valor dentro de um Edit:

procedure EditChange(Sender: TObject);
var
vl_label : TLabel; //variável do tipo Label


begin

vl_label := TLabel.Create(self); //criamos um label
WITH vl_label DO
BEGIN
Font.Name := TEdit(sender).Font.Name; //pegamos a fonte usada no edit
Caption := TEdit(sender).Text; //pegamos o conteúdo do edit
SendMessage(TEdit(sender).Handle, EM_SETMARGINS, EC_LEFTMARGIN,
(TEdit(sender).Width-vl_label.Width) div 2); //centraliza no label e retorna para o edit
END;

vl_label.Free;
end;

quarta-feira, 25 de junho de 2008

Remover pontos de nome de arquivo (Delphi)

O exemplo a seguir nos mostra como remover pontos de um nome de arquivo, deixando é claro o da extensão:

procedure TForm1.Button1Click(Sender: TObject);
var
vl_a: integer;
vl_i: integer;

begin
//verifica indice do ultimo ponto
FOR vl_i:= Length(LabeledEdit1.Text) DOWNTO 1 DO
BEGIN
IF Copy(LabeledEdit1.Text, vl_i, 1) = '.' THEN
BEGIN
vl_a := vl_i;
Break;
END;
END;

//copia texto ignorando os pontos, exceto quando o ponto estiver no inidice encontrado
//anteriormente

FOR vl_i:= 1 TO Length(LabeledEdit1.Text) DO
BEGIN
IF ( Copy(LabeledEdit1.Text, vl_i, 1) <> '.' ) THEN
LabeledEdit2.Text := LabeledEdit2.Text + Copy(LabeledEdit1.Text, vl_i, 1)
ELSE IF ( vl_i = vl_a ) THEN
LabeledEdit2.Text := LabeledEdit2.Text + Copy(LabeledEdit1.Text, vl_i, 1)
END;
end;

Baixe o exemplo aqui.

terça-feira, 24 de junho de 2008

Mover ponteiro do Mouse automaticamente (Delphi)

Em certas ocasiões desejamos fazer com que o usário veja determinada funcionalidade, ou mesmo tentamos indicar o melhor procedimento a tomar naquele momento, nada melhor como mover o ponteiro do mouse, já que concentramos certa atenção nele, então vamos ao exemplo:

var
vl_p: TPoint;

begin
vl_p.X := 315;
vl_p.Y := 89;
vl_p := ClientToScreen(vl_p);
SetCursorPos(vl_p.X, vl_p.Y);
end;

Baixe o exemplo completo aqui.

segunda-feira, 23 de junho de 2008

Descobrir tipo do Arquivo (Delphi)

Segue um exemplo de como verificar o tipo de um determinado arquivo, digita-se o nome do arquivo juntamente com o caminho no Edit1, e ao clicar no botão o Edit2 recebe o tipo do arquivo:

Function TipoArquivo(const p_File: String): String;
var
v_Inf: TSHFileInfo;

begin
IF SHGetFileInfo(PChar(p_File),0,v_Inf,Sizeof(v_Inf),SHGFI_TYPENAME) <> 0 THEN
Result := StrPas(v_Inf.szTypeName)
ELSE
BEGIN
Result := ExtractFileExt(p_File);
Delete(Result,1,1);
Result := Result +' File';
END;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := TipoArquivo(Edit1.Text);
end;

Baixe o exemplo aqui.

domingo, 22 de junho de 2008

Trigger no Mysql

Uma trigger é um objeto de banco de dados associado a uma tabela, e de acordo com uma determinada ação executada nesta tabela a trigger é executada.

Sintaxe:
DELIMITER |

CREATE TRIGGER trigger_nome   -- nome da trigger
trigger_tempo  -- quando a trigger dispara(AFTER, BEFORE)
trigger_evento -- evento que a dispara(INSERT, UPDATE, DELETE)
ON tabela_nome -- tabela que a trigger faz referência
FOR EACH ROW   -- deve ser disparada para todos os registros trigger_comandos
END;

|DELIMITER ;


Exemplo:
DELIMITER |

CREATE TRIGGER log_usuario
AFTER INSERT ON usuarios
FOR EACH ROW
BEGIN
INSERT INTO log SET user_id=NEW.id, data=NOW();
END;

|DELIMITER ;

Nesse exemplo foi criada uma trigger de log, que para cada inserção na tabela usuarios insere também um registro na tabela log.

sábado, 21 de junho de 2008

Mudar Cursor de Edit Criado Dinamicamente

Temos o seguite caso, devemos criar Edits em tempo de execução, onde sempre que o ponteiro do mouse passar por um Edit, seja ele qual for, o ponteiro do Mouse deve mudar, apresentando dois tipos distintos, um para o caso do Edit estar vazio e outro quando ele estiver preenchido, além do fato de que quando um certo formulário for aberto o conteúdo do Edit selecionado deve ir para um Edit do novo formulário, segue abaixo o código, ou baixe aqui o exemplo:


var
Form1 : TForm1;
Edt : TEdit;
Cont : integer = 1;
vLeft : integer = 8;
vTop : integer = 40;
vWidth : integer = 81;
vHeight: integer = 21;
vSelect: string;


implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.criaEdt(p_left: integer; p_top: integer; p_width: integer; p_nome: string);
begin
Edt := TEdit.Create(Self);
WITH Edt DO
BEGIN
Parent := Self;
Left := p_left;
Top := p_top;
Width := p_width;
Height := 21;
Name := 'A'+p_nome;
OnMouseMove:= EdtMouseMove;
OnEnter := EdtEnter;
SetFocus;
END;
end;

procedure TForm1.EdtMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
IF (Sender as TEdit).Text = '' THEN
(Sender as TEdit).Cursor := crHandPoint
ELSE
(Sender as TEdit).Cursor := crMultiDrag;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IF Cont = 1 THEN
criaEdt(vLeft, vTop, vWidth, IntToStr(Cont))
ELSE IF Cont <= 4 THEN
BEGIN
vTop := vTop + 32;
criaEdt(vLeft, vTop, vWidth, IntToStr(Cont));
END
ELSE
ShowMessage('Não é possivel criar mais!');

Inc(Cont);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.Edit1.Text := TEdit( FindComponent( vSelect ) ).Text;
Form2.ShowModal;
Form2.Release;
end;

procedure TForm1.EdtEnter(Sender: TObject);
begin
vSelect := (Sender as TEdit).Name;
end;

end.

quarta-feira, 18 de junho de 2008

Manipular o Registro do Windows

Algumas vezes surge a necessidade de se utilizar os valores do registro do windows, então em primeiro lugar devemos ter em mente exatamente qual a chave devemos procurar, no nosso exemplo vamos buscar o nome do usuário logado no windows, então vamos ao exemplo:

var
objRegistro : TRegistry;


begin
vl_objRegistro := TRegistry.Create;
TRY
vl_objRegistro.RootKey := HKEY_CURRENT_USER;
IF vl_objRegistro.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Explorer', True) THEN
Edit.Text := UpperCase( vl_objRegistro.ReadString('Logon User Name') );
FINALLY
objRegistro.Free;
END;

end;

terça-feira, 17 de junho de 2008

Inserir e retirar itens de ListBox

Nesse exemplo temos uma lista de itens em um ComboBox e quando clicamos no botao inserir o ListBox é verificado, caso não haja um item igual ele insere, e o botao remove faz o oposto, verifica se o item existe, caso exista ele é removido.

Baixe aqui o exemplo.


procedure TForm1.InserirClick(Sender: TObject);
var
v_i: integer;
v_a: boolean;

begin
//VERIFICA SE JÁ EXISTE ALGUM ITEM IGUAL, SE TIVER NÃO INSERE
TRY
FOR v_i := 0 TO ListBox1.Items.Count-1 DO
BEGIN
IF ComboBox1.Text = ListBox1.Items[v_i] THEN
BEGIN
v_a := TRUE;
Break;
END;
END;
IF v_a = FALSE THEN
ListBox1.Items.Add(ComboBox1.Text);
EXCEPT
END;
end;

procedure TForm1.RemoverClick(Sender: TObject);
var
v_i: integer;

begin
//VERIFICA SE JÁ EXISTE ALGUM ITEM IGUAL, SE TIVER DELETA
TRY
FOR v_i := 0 TO ListBox1.Items.Count-1 DO
BEGIN
IF ComboBox1.Text = ListBox1.Items[v_i] THEN
ListBox1.Items.Delete(v_i);

END;
EXCEPT
END;
end;

segunda-feira, 16 de junho de 2008

Armazenando BMP's em arquivo de recurso ".RES"

1. Crie um arquivo texto, com um nome qualquer e a extensão ".RC", para o exemplo usaremos "RECURSO.RC". Nesse arquivo digite o seguinte:
GRAFICO BITMAP "C:\Imagens\Grafico.bmp"
Lembrando que para cada imagem teremos uma linha.
2. Após salvar o arquivos devemos Compilar o mesmo usando o programa BRCC32.EXE localizdo no diretorio BIN do Delphi, feito isso, sera gerado o arquivo RECURSO.RES.
3. Na Unit que usará o recuro devemos colocar o seguinte:
{$R RECURSOS.RES}
Para usar a imagem contida no arquivo de recurso precisamos apenas criar uma variavel do tipo bitmap e depois executar o seguinte comando:
VarTipoTBitmap:= LoadBitmap(HInstance,'BITMAP_1');

terça-feira, 3 de junho de 2008

Consulta Top-N Oracle

Esse tipo de consulta é útil em situações onde precisamos encontrar, por exemplo, os N maiores ou menores dentro de determinado grupo, os funcionários mais bem pagos, os que vendem mais, as mercadorias menos vendidas e assim por diante.
Para conseguirmos isso no Oracle precisaremos implementar uma consulta interna (ou view em linha), que irá retornar todos os registros necessários, e na consulta externa iremos limitar a exibição num total desejado.
Baixe aqui o script com a criação da tabela e os inserts para o teste.
No exemplo abaixo desejamos encontrar os três funcionários que ganham mais:
SELECT NOME, SALARIO
FROM
(
SELECT FU.NOM_FUNC
NOME, FU.SAL_FUNC SALARIO
FROM FUNCIONARIOS FU

ORDER BY FU.SAL_FUNC DESC
)

WHERE ROWNUM <= 3


Agora desejamos encontrar os três funcionários que possuem os menores salários:
SELECT NOME, SALARIO
FROM
(
SELECT FU.NOM_FUNC
NOME, FU.SAL_FUNC SALARIO
FROM FUNCIONARIOS FU
ORDER BY FU.SAL_FUNC
)
WHERE ROWNUM <=
3


Podemos perceber que a consulta interna é muito parecida em ambos os exemplos, mudamos apenas a ordem em que os registros seriam retornados, e na consulta externa definimos o total de registros a serem mostrados, três para as duas situações.