sexta-feira, 14 de maio de 2010

Tecnologias Bluetooth / Parte 1

. sexta-feira, 14 de maio de 2010
0 comentários

Advanced Audio Distribution Profile (A2DP)
Perfil de distribuição de áudio avançada.
Define como áudio de alta qualidade (estéreo ou mono) pode ser transferido em tempo real de um dispositivo para o outro sobre uma conexão Bluetooth. Por exemplo, músicas podem ser transferidas de um telefone celular para um fone de ouvido sem fio.

Ele foi inicialmente usado em conjunto com um transmissor Bluetooth intermediário que se conectava à uma saída de áudio padrão e codificava o áudio de entrada para um formado compatível com Bluetooth, que era assim enviado por sinais sem fio para fones de ouvido Bluetooth que decodificavam e executavam o áudio. Porém, vários players portáteis e telefones celulares não suportam nativamente o A2DP, enquanto vários fones recentes Bluetooth 2.0 o suportam.

Fones de ouvido Bluetooth, especialmente os modelos mais avançados, geralmente vem com um microfone e suportam os perfis Headset (HSP), Hands-Free (HFP) e Audio/Video Remote Control (AVRCP).

O A2DP foi designado para transferir em tempo real áudio estéreo uni-direcional de dois canais, como música de um MP3 player, para um fone de ouvido ou sistema de som de um automóvel. Esse perfil depende do AVDTP e GAVDP e inclui suporte obrigatório para o codec de baixa complexidade SBC e opcionalmente para MPEG-1 (usualmente inclui o MP3), MPEG-2, MPEG-4, AAC e ATRAC, e é extensível para suportar codecs definidos pelo fabricante. Vários sistemas Bluetooth também implementaram o sistema de DRM SCMS-T (Serial Copy Management System). Nesses casos é possível conectar fones de ouvido Bluetooth A2DP para escutar áudio de alta qualidade.

Read More »»

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

Nokia 5530

. terça-feira, 23 de março de 2010
0 comentários

Mal falamos do N97 e já saiu mais um irmãozinho da linha touchscreen da Nokia: agora é o 5530, versão “menor” do 5800, anunciado nesta segunda. Ficam o Wi-Fi, a interface sensível ao toque e o Bluetooth, saem a conexão 3G, o cartão de 8 GB e as teclas físicas (!). Ah, sim, tem um novo E-series na parada também: é o E72.

O design do 5530 me lembrou o do LG Arena, bem fino e compacto. A Nokia diz que o 5530 tem uma nova tela inicia e barra de contatos (provavelmente uma melhoria da existente no 5800), câmera de 3,2 megapixels com flash LED, Bluetooth, Wi-Fi e EDGE, além de reproduzir vídeos a 640 x 360, vir com um cartão microSD de 4 GB e ter uma entrada para fone padrão 3,5 mm (e, pelas fotos abaixo, é o primeiro fone in-ear a vir com um celular musical da Nokia – corrijam-me se estiver errado).

 

http://www.top10.co.uk/_img/library/hardware_big1/nokia_5530_xpressmusic_png_w450h450s2.png

Read More »»

segunda-feira, 8 de março de 2010

Listar Impressoras Instaladas no Windows

. segunda-feira, 8 de março de 2010
0 comentários

{Em uses acrescentar Printers}

var
  i: Integer;
  Printer: TPrinter;
begin
  Printer:=TPrinter.Create;
try
for i := 0 to Printer.Printers. Count - 1 do
begin
      ComboBox1.Items. Add(Printer. Printers. Strings[i] );
      ComboBox1.ItemIndex:=0;
end;
finally
    Printer.free;
end;
end;

Read More »»

sexta-feira, 5 de março de 2010

Identação de Código

. sexta-feira, 5 de março de 2010
0 comentários

Olá pessoal, estou enviando essa dica pois passei a utilizar dessa forma a identação do meu codigo, acho que assim fica muito mais fácil, veja bem, vejo as pessoas utilizando identacao do if dessa forma:
If condicao then
   faz a parte do then
else faz a parte do else;
eu utilizo assim:
If condicao
then faz a parte do then
else faz a parte do else;
pode parecer bobo, mas se adotarmos essa forma de identar o codigo o nosso trabalho fica bem mais claro, pra exemplificar vou colocar um pedaco de um codigo com uma identacao normalmente adotada.
{Copie essa função da dica de Roberto Claudio}
function TestaCgc(xCGC: String):Boolean;
{Testa se o CGC é válido ou não}
Var
d1,d4,xx,nCount,fator,resto,digito1,digito2 : Integer;
Check : String;
begin
xcgc := sonumeros(xcgc);
d1 := 0;
d4 := 0;
xx := 1;
for nCount := 1 to Length( xCGC )-2 do
begin
if Pos( Copy( xCGC, nCount, 1 ), '/-.' ) = 0 then
begin
if xx < 5 then
begin
          fator := 6 - xx;
end
else
begin
          fator := 14 - xx;
end;
       d1 := d1 + StrToInt( Copy( xCGC, nCount, 1 ) ) * fator;
if xx < 6 then
begin
          fator := 7 - xx;
end
else
begin
          fator := 15 - xx;
end;
       d4 := d4 + StrToInt( Copy( xCGC, nCount, 1 ) ) * fator;
       xx := xx+1;
end;
end;
    resto := (d1 mod 11);
if resto < 2 then
begin
       digito1 := 0;
end
else
begin
       digito1 := 11 - resto;
end;
   d4 := d4 + 2 * digito1;
   resto := (d4 mod 11);
if resto < 2 then
begin
      digito2 := 0;
end
else
begin
      digito2 := 11 - resto;
end;
   Check := IntToStr(Digito1) + IntToStr(Digito2);
if Check <> copy(xCGC,succ(length(xCGC)-2),2) then
begin
      Result := False;
end
else
begin
      Result := True;
end;
end;
nao hora de fazer manutenção no codigo fica muito dificil saber onde esta o bloco q vc esta procurando, entao, adotando a minha tecnica ficaria assim:
function TestaCgc(xCGC: String):Boolean;
{Testa se o CGC é válido ou não}
Var d1,d4,xx,nCount,
    fator,resto,digito1,digito2 : Integer;
    Check : String;
begin
  xcgc := sonumeros(xcgc);
  d1 := 0;
  d4 := 0;
  xx := 1;
for nCount := 1 to Length( xCGC )-2 do
begin
if Pos( Copy( xCGC, nCount, 1 ), '/-.' ) = 0
then begin
if xx < 5
then begin
                      fator := 6 - xx;
end
else begin
                      fator := 14 - xx;
end;
              d1 := d1 + StrToInt( Copy( xCGC, ,Count, 1 ) ) * fator;
if xx < 6
then begin
                      fator := 7 - xx;
end
else begin
                      fator := 15 - xx;
end;
              d4 := d4 + StrToInt( Copy( xCGC, nCount, 1 ) ) * fator;
              xx := xx+1;
end;
end;
  resto := (d1 mod 11);
if resto < 2
then begin
          digito1 := 0;
end
else begin
          digito1 := 11 - resto;
end;
  d4 := d4 + 2 * digito1;
  resto := (d4 mod 11);
if resto < 2
then begin
          digito2 := 0;
end
else begin
          digito2 := 11 - resto;
end;
  Check := IntToStr(Digito1) + IntToStr(Digito2);
if Check <> copy(xCGC,succ(length(xCGC)-2),2)
Then begin
          Result := False;
end
else begin
          Result := True;
end;
end;
Agora pra localiza um bloco basta achar onde o begin comeca, o primeiro end que vc achar na mesma posicao do begin é o end que fecha esse begin. Espero ter ajudado

Read More »»

sexta-feira, 26 de fevereiro de 2010

Grid Zebrada

. sexta-feira, 26 de fevereiro de 2010
0 comentários

1º - Crie o procedimento conforme mostrado a baixo.


procedure GridZebrada(cds: TClientDataSet; Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
procedure TTelaPrincipalF.GridZebrada(cds: TClientDataSet;
  Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
if odd(cds.RecNo) then
    TDBGrid(Sender).Canvas.Brush.Color := $00B9FFFF
else
    TDbGrid(Sender).Canvas.Brush.Color:= clCream;
    TDbGrid(Sender).Canvas.font.Color:= clBlack;
if gdSelected in State then
with (Sender as TDBGrid).Canvas do
begin
      Brush.Color := $004080FF;
      FillRect(Rect);
      Font.Style := [fsbold]
end;
  TDbGrid(Sender).DefaultDrawDataCell(Rect, Field, State);
end;


2º - Para utilizar este procedimento é preciso programar o mesmo no evento DrawDataCell do grid desejado.

Onde ficará assim:


procedure TTelaPrincipalF.DBGrid1DrawDataCell(Sender: TObject;
const Rect: TRect; Field: TField; State: TGridDrawState);
begin
  GridZebrada(cdsAplicativo, Sender, Rect, Field, State);
end;

Read More »»

quarta-feira, 24 de fevereiro de 2010

Colocando valor por extenso

. quarta-feira, 24 de fevereiro de 2010
0 comentários

1º temos que criar uma função assim :
  function Extenso( pValor:Extended ):String;
depois de criada pressioner a tecla ctrl+shift+c para colocar a implementação da função.
2º depois só usar esta funcção :
}
function Extenso( pValor:Extended ):String;
const
  aCifra : Array[1..6,1..2] of String = (('TRILHÃO,','TRILHOES,'),
('BILHAO,' ,'BILHÕES,' ),
('MILHAO,' ,'MILHÕES,' ),
('MIL,'     ,'MIL,' ),
('    '     ,'   ' ),
('CENTAVO' ,'CENTAVOS'));
var
  tStr,tExtenso,tSubs:String;
  tX,tCentavos:Integer;
begin
  tSubs := ' ';
  tExtenso := ' ';
  tStr := StrZero(pValor,18,2);  {funcao disponível neste livro}
  tCentavos := StrToInt( Copy(tStr,17,2) );
if pValor > 0 then
begin
if tCentavos > 0 then
      tExtenso := ExtCem( StrZero( tCentavos,3,0 )) + aCifra[6,Trunc(iif(tCentavos =1,1,2))];
if trunc( pValor ) > 0 then
      tExtenso := iif(trunc( pValor ) = 1,'REAL',' REAIS')+iif(tCentavos > 0, ' E   ','')+tExtenso;
for tX := 5 Downto 1 do
begin
      tSubs := Copy(tStr,(tX*3)-2,3);
if StrToInt( tSubs ) > 0 then
        tExtenso := ExtCem( tSubs ) + aCifra[tX,Trunc(iif(StrToInt( tSubs )=1,1,2))]+'   '+tExtenso;
end;
end;
  Result := StripDouble( tExtenso );
end;
{3º como usar ?
crie uma nova aplicação no delphi, depois de criada coloque no form.
Label
Edit
Colocado na tela vai no evento do onchange de um click, e coloque este codigo :
label.Caption := Extenso(strtoFloat(edit.text));
depois de feito isto rode sua aplicação e digite o valor que automaticamente será mostrado do label o valor por extenso.

Read More »»

quarta-feira, 23 de dezembro de 2009

Converter botão e título do messagedlg

. quarta-feira, 23 de dezembro de 2009
0 comentários

function MessageDlg(const Mensagem : String; aDlgType : TMsgDlgType; aBotao : TMsgDlgButtons) : Word;overload;
function TForm1.MessageDlg(const Mensagem: String; aDlgType: TMsgDlgType; aBotao: TMsgDlgButtons): Word;
var
  Form : TForm;
begin
  Form:= CreateMessageDialog(Mensagem,aDlgType, aBotao);
(Form.FindComponent('Yes') as TButton).Caption:= 'Sim';
(Form.FindComponent('No') as TButton).Caption:= 'Não';
(Form.FindComponent('Cancel') as TButton).Caption:= 'Cancelar';
if adlgtype=mtwarning then form.Caption:='Atenção';
if adlgtype=mtconfirmation then form.Caption:='Confirmação';
if adlgtype=mterror then form.Caption:='Erro';
if adlgtype=mterror then form.Caption:='Erro';
  Result:= Form.ShowModal;
end;

Read More »»
Robôs 19