sexta-feira, novembro 24, 2006

Gafe fenomenal

Saudações,
Não é o principal tema desse blog, mas encontrei um vídeo que é o máximo, desafio vc a assistir e não rir.
Abraços.

Assista

sexta-feira, outubro 27, 2006

Dica de Delphi - Mudando de célula com ENTER no dbGrid

Quando o usuário está editando dados em um dbGrid, ele sempre espera que ao se pressionar a tecla "ENTER", a ação seja mudar para a célula seguinte (a da direita), mas o dbGrid não tem esse comportamento por padrão.

Pensando nisso, elaborei uma rotina, que deverá ser escrita no evento OnKeyUp do dbgrid. Sempre que se atinge a última célula em uma linha, automaticamente ele passa para a linha seguinte e, se estiver na última, uma nova será inserida.

Segue a rotina:

if Key = #13 then
begin
if dbgrid.SelectedIndex = dbgrid.Columns.Count - 1 then
//verifica se e a ultima celula
begin
if DatasetConectadoNoGrid.Eof then
DatasetConectadoNoGrid.Insert
else
DatasetConectadoNoGrid.Next;
//se for o ultimo registro insere um novo,
//caso contrario ele passa para o proximo
registro

dbgrid.SelectedIndex := 0;

//Posiciona na primeira celula
end
else
dbgrid.SelectedIndex := dbgrid.SelectedIndex + 1;
//Se nao estive na ultima celula passa a proxima
end;


Como sempre, em caso de dúvidas, escrevam.

--
Fernando D. Nappe
Analista de Sistemas

quinta-feira, outubro 19, 2006

Colocando zeros a esquerda em valor

Hoje, um dos meus colegas de trabalho estava precisando colocar zeros a esquerda no resultado de uma consulta no MS SQL Server, e ao invés de se mostrar o valor inteiro, por exemplo o nro. 10, ele precisa mostrar 00010. Aí veio a pergunta como fazer isso? Acabamos montando um "solução", não muito elegante eu confesso, mas que resolveu o problema.

Usamos a função STUFF, que insere uma string em outra, e que recebe como parâmetros a string a ser "estufada", o valor inicial aonde a outra string será inserida, o valor a ser deletado e por fim, a string a ser inserida na original.

Abaixo transcrevemos um trechinho que pode ser usado como exemplo para mais alguém que tenha o mesmo problema.

/* Variaveis do exemplo */
declare
@valor_inteiro int,
@valor_string char(6),
@string_com_zeros char(6)

/* Atribucao dos valores */
select
@valor_inteiro = 151,
@valor_string = convert(char(6), @valor_inteiro),
/* Funcao STUFF , esse é o pulo do gato! */
@string_com_zeros = stuff('00000', 7 - Len(@valor_string), Len(@valor_string), @valor_string)

select
@valor_inteiro valor_inteiro,
RTrim(@string_com_zeros) campo_preenchido

Dúvidas é só escrever...abraços
--
Fernando D. Nappe
Analista de Sistemas

terça-feira, outubro 17, 2006

Turbos

Após a iniciativa de vender os direitos sobre suas IDE's, a Borland lançou as versões Turbo (http://www.turboexplorer.com) para várias linguagens. Há o Turbo C++, Turbo Delphi, Turbo Delphi for .NET e Turbo C#. As versões que estão no site podem ser baixadas e usadas sem limitação, inclusive comercialmente. A única restrição é que não se pode adicionar componentes de terceiros nas IDE's, no entanto, eles podem instanciados via programação. Seguem alguns screenshots do Turbo Delphi:

Splash


IDE


Code Explorer

--
Fernando D. Nappe
Analista de Sistemas

segunda-feira, outubro 16, 2006

Sonho de consumo


Honda CB-500 Four!
Ainda compro uma dessas...
hehehehe

Motos clássicas

Pra quem curte motos clássicas (década de 70 pra trás), um excelente site é o www.motosclassicas70.com.br. Vale a pena!

terça-feira, junho 06, 2006

Obtendo as impressoras instaladas II - Dica de Delphi

Mais uma "rotininha" pra obter as impressoras instaladas na máquina. Essa é cortesia do site www.guiadodelphi.com.br

// Esta rotina lê todas as impressoras instaladas no windows
// e coloca dentro de um ComboBox e não se esqueça de adicionar
// na cláusula uses a unit Printers

procedure TForm1.FormShow(Sender: TObject);
var I : Integer;
begin
ComboBox1.Items.Clear;
For I:= 1 to Printer.Printers.Count do
Begin
if Pos('LPT', printer.Printers.Strings[I-1]) > 0Then
ComboBox1.Items.Add('LPT1')
Else if Pos('\\', printer.Printers.Strings[I-1]) > 0 Then
ComboBox1.Items.Add(Copy(printer.Printers.Strings[I-1],
Pos('\\', printer.Printers.Strings[I-1]),
length(printer.Printers.Strings[I-1]) -
Pos('\\', printer.Printers.Strings[I-1]) + 1));
End;
End;
// e quando apertar o botao imprimir, o evento pega qual a impressora
// que você escolheu atravéz do ComboBox e Imprimi.
procedure TForm1.btImprimirClick(Sender: TObject);
var I:Integer;
Arquivo : TextFile;
begin
AssignFile(Arquivo,ComboBox1.Value);
Rewrite(Arquivo);
WriteLn(Arquivo, 'TESTE DE IMPRESSAO - 1');
WriteLn(Arquivo, 'TESTE DE IMPRESSAO - 2');
WriteLn(Arquivo, 'TESTE DE IMPRESSAO - 3');
WriteLn(Arquivo, 'TESTE DE IMPRESSAO - 4');
CloseFile(Arquivo);
end;

Obtendo as impressoras instaladas - Dica de Delphi

Quando vamos imprimir diretamente para a impressora é necessário saber quais são as que estão instaladas na máquina, sejam elas locais ou de rede. A rotina abaixo tem essa finalidade. Ela foi obtida através do colega Mgrasser, do Forum Active Delphi.

unit VerificaImpressora;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Printers, Buttons, WinSpool;

type
TPrinterInfo = record
SeverName : PChar;
PrinterName : PChar;
ShareName : PChar;
PortName : PChar;
DriverName : PChar;
Comment : PChar;
Location : PChar;
DeviceMode : PDeviceModeA;
SepFile : PChar;
PrintProcessor : PChar;
DataType : PChar;
Parameters : PChar;
SecurityDescriptor: PSecurityDescriptor;
Attributes : Cardinal;
DefaultPriority : Cardinal;
StartTime : Cardinal;
UntilTime : Cardinal;
Status : Cardinal;
Jobs : Cardinal;
AveragePPM : Cardinal;
end;

TForm1 = class(TForm)
// Memo1: TMemo;
// ComboBox1: TComboBox;
Memo1: TMemo;
ComboBox1: TComboBox;
procedure FormShow(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

function GetCurrentPrinterInformation: TPrinterInfo;
function GetCurrentPrinterHandle: THandle;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetCurrentPrinterHandle: THandle;
var
Device, Driver, Port : array[0..255] of char;
hDeviceMode: THandle;
begin
Printer.GetPrinter(Device, Driver, Port, hDeviceMode);
if not OpenPrinter(@Device, Result, nil) then
RaiseLastWin32Error;
end;

function GetCurrentPrinterInformation: TPrinterInfo;
var
hPrinter : THandle;
pInfo: PPrinterInfo2;
bytesNeeded: DWORD;
begin
hprinter := GetCurrentPrinterHandle;
try
Winspool.GetPrinter( hPrinter, 2, Nil, 0, @bytesNeeded );
pInfo := AllocMem( bytesNeeded );
try
Winspool.GetPrinter( hPrinter, 2, pInfo, bytesNeeded, @bytesNeeded );
Result.SeverName := pInfo^.pServerName;
Result.PrinterName := pInfo^.pPrinterName;
Result.ShareName := pInfo^.pShareName;
Result.PortName := pInfo^.pPortName;
Result.DriverName := pInfo^.pDriverName;
Result.Comment := pInfo^.pComment;
Result.Location := pInfo^.pLocation;
Result.DeviceMode := pInfo^.pDevMode;
Result.SepFile := pInfo^.pSepFile;
Result.PrintProcessor := pInfo^.pPrintProcessor;
Result.DataType := pInfo^.pDatatype;
Result.Parameters := pInfo^.pParameters;
Result.SecurityDescriptor := pInfo^.pSecurityDescriptor;
Result.Attributes := pInfo^.Attributes;
Result.DefaultPriority := pInfo^.DefaultPriority;
Result.StartTime := pInfo^.StartTime;
Result.UntilTime := pInfo^.UntilTime;
Result.Status := pInfo^.Status;
Result.Jobs := pInfo^.cJobs;
Result.AveragePPM := pInfo^.AveragePPM;
finally
FreeMem( pInfo );
end;
finally
ClosePrinter( hPrinter );
end;
end;


procedure TForm1.FormShow(Sender: TObject);
begin
ComboBox1.Items.Assign(Printer.Printers);
ComboBox1.ItemIndex := 0;
ComboBox1.OnChange(nil);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
PrinterInfo: TPrinterInfo;
begin
Printer.PrinterIndex := ComboBox1.ItemIndex;
PrinterInfo := GetCurrentPrinterInformation;
memo1.Clear;
with memo1.Lines do
begin
Add('GENERAL INFORMATION');
Add('');
Add('ServerName: ' + PrinterInfo.SeverName);
Add('PrinterName: ' + PrinterInfo.PrinterName);
Add('ShareName: ' + PrinterInfo.ShareName);
Add('PortName: ' + PrinterInfo.PortName);
Add('DriverName: ' + PrinterInfo.DriverName);
Add('Comment: ' + PrinterInfo.Comment);
Add('Location: ' + PrinterInfo.Location);
Add('SepFile: ' + PrinterInfo.SepFile);
Add('PrintProcessor: ' + PrinterInfo.PrintProcessor);
Add('DataType: ' + PrinterInfo.DataType);
Add('Parameters: ' + PrinterInfo.Parameters);
Add('Attributes: ' + IntToStr(PrinterInfo.Attributes));
Add('DefaultPriority: ' + IntToStr(PrinterInfo.DefaultPriority));
Add('StartTime: ' + IntToStr(PrinterInfo.StartTime));
Add('UntilTime: ' + IntToStr(PrinterInfo.UntilTime));
Add('Status: ' + IntToStr(PrinterInfo.Status));
Add('Jobs: ' + IntToStr(PrinterInfo.Jobs));
Add('AveragePPM: ' + IntToStr(PrinterInfo.AveragePPM));
Add('');
Add('DEVICEMODE INFORMATION');
Add('');

Add('DeviceName: ' + PrinterInfo.DeviceMode.dmDeviceName);
Add('SpecVersion: ' + IntToStr(PrinterInfo.DeviceMode.dmSpecVersion));
Add('DriverVersion: ' + IntToStr(PrinterInfo.DeviceMode.dmDriverVersion));
Add('Size: ' + IntToStr(PrinterInfo.DeviceMode.dmSize));
Add('DriverExtra: ' + IntToStr(PrinterInfo.DeviceMode.dmDriverExtra));
Add('Fields: ' + IntToStr(PrinterInfo.DeviceMode.dmFields));
Add('Orientation: ' + IntToStr(PrinterInfo.DeviceMode.dmOrientation));
Add('PaperSize: ' + IntToStr(PrinterInfo.DeviceMode.dmPaperSize));
Add('PaperLength: ' + IntToStr(PrinterInfo.DeviceMode.dmPaperLength));
Add('PaperWidth: ' + IntToStr(PrinterInfo.DeviceMode.dmPaperWidth));
Add('Scale: ' + IntToStr(PrinterInfo.DeviceMode.dmScale));
Add('Copies: ' + IntToStr(PrinterInfo.DeviceMode.dmCopies));
Add('DefaultSource: ' + IntToStr(PrinterInfo.DeviceMode.dmDefaultSource));
Add('PrintQuality: ' + IntToStr(PrinterInfo.DeviceMode.dmPrintQuality));
Add('Color: ' + IntToStr(PrinterInfo.DeviceMode.dmColor));
Add('Duplex: ' + IntToStr(PrinterInfo.DeviceMode.dmDuplex));
Add('YResolution: ' + IntToStr(PrinterInfo.DeviceMode.dmYResolution));
Add('TTOption: ' + IntToStr(PrinterInfo.DeviceMode.dmTTOption));
Add('Collate: ' + IntToStr(PrinterInfo.DeviceMode.dmCollate));
Add('LogPixels: ' + IntToStr(PrinterInfo.DeviceMode.dmLogPixels));
Add('BitsPerPel: ' + IntToStr(PrinterInfo.DeviceMode.dmBitsPerPel));
Add('PelsWidth: ' + IntToStr(PrinterInfo.DeviceMode.dmPelsWidth));
Add('PelsHeight: ' + IntToStr(PrinterInfo.DeviceMode.dmPelsHeight));
Add('DisplayFlags: ' + IntToStr(PrinterInfo.DeviceMode.dmDisplayFlags));
Add('DisplayFrequency: ' + IntToStr(PrinterInfo.DeviceMode.dmDisplayFrequency));
Add('ICMMethod: ' + IntToStr(PrinterInfo.DeviceMode.dmICMMethod));
Add('ICMintent: ' + IntToStr(PrinterInfo.DeviceMode.dmICMIntent));
Add('MediaType: ' + IntToStr(PrinterInfo.DeviceMode.dmMediaType));
Add('DitherType: ' + IntToStr(PrinterInfo.DeviceMode.dmDitherType));
Add('ICCManufacturer: ' + IntToStr(PrinterInfo.DeviceMode.dmICCManufacturer));
Add('ICCModel: ' + IntToStr(PrinterInfo.DeviceMode.dmICCModel));
Add('PanningWidth: ' + IntToStr(PrinterInfo.DeviceMode.dmPanningWidth));
Add('PanningHeight: ' + IntToStr(PrinterInfo.DeviceMode.dmPanningHeight));
end;
end;

end.

quarta-feira, maio 31, 2006

Carta de David I à comunidade Delphi do Brasil

Recentemente a notícia de que a Borland estava vendendo suas IDE's, entre elas o Delphi, gerou uma série de especulações, como a do fim do Delphi e até uma certa histeria.

Na verdade, a Borland pretende focar em desenvolvimento de outras ferramentas do ciclo de desenvolvimento, deixando o desenvolvimento das IDE's para uma outra empresa. Mas isso não significa o fim de nenhumas das plataformas já consagradas da Borland.



Veja a seguir a carta de David I, vice presidente de Relacionamento com Desenvolvedores da Borland:

"Para a nossa maravilhosa e amável comunidade de desenvolvedores do Brasil.

Por vários anos vocês tem recebido a Borland (e eu) como parte da família brasileira de desenvolvedores. Nós compartilhamos o sucesso do seu e do nosso negócio. Nós aprendemos e crescemos juntos a fim de endereçar tecnologias e oportunidades de negócio desafiadoras. Passamos o tempo juntos nas reuniões e nas conferências anuais dos desenvolvedores. Minha viagem ao Brasil em novembro (BorCon 2005) foi maravilhosa. Obrigado por todas as palavras amáveis, pelas fotos, pelas sugestões e os abraços (especialmente os abraços).

A recente notícia de que estamos criando uma nova companhia focada em desenvolvedores é para ser comemorada. Nós estamos criando uma companhia 100% focada no sucesso de vocês. Sim, esta notícia significa uma mudança de nome e existem perguntas que só terão respostas com o tempo. Nós temos trabalhado juntos por muitos e muitos anos e estaremos trabalhando juntos por muito mais tempo.. As soluções de desenvolvimento foram nosso negócio durante estes 22 anos desde a versão 1.0 do Turbo Pascal.

Nós continuamos no mercado e focados no seu sucesso. Nós temos um roadmap (cronograma de versões), nós estamos executando o roadmap e continuaremos focados em auxiliar nossos clientes. Estamos trabalhando para escolher o mais rápido possível o investidor, e o mais importante é que estamos concentrados em encontrar o investidor certo. A Borland continuará no negócio de desenvolvimento de software, isso não vai mudar. A Borland apenas não estará mais criando IDEs. Nós estaremos em conjunto com outras empresas, como a nova companhia focada em IDEs para continuar inovando nesse setor. Os desenvolvedores possuem um papel crucial no processo de desenvolvimento, portanto a Borland irá trabalhar próxima a companhias como a nossa enquanto avançam sua estratégia ALM. Temos a continuidade de diversas frentes: vendas continuando vendendo, o orçamento de marketing está intacto, o suporte continua atendendo os chamados, BDN continua ativo e R&D(equipe de desenvolvimento) continua desenvolvendo. Todo nosso programa está sendo executado. Tod Nielsen e nosso conselho diretor tem sido muito transparente, tanto que estamos procurando por um investidor que esteja interessado em fazer coisas do interesse de nossos clientes, nossos produtos, nossos funcionários e não apenas aquele que tenha a melhor oferta.

Seu investimento em nossos produtos, seus projetos, seu conhecimento e seu tempo está preservado.

Eu sei que nós tivemos que ganhar sua confiança ao longo dos anos. Nós continuamos a trabalhar duramente para continuar merecendo sua confiança no futuro. Eu serei parte desta nova companhia. Eu continuarei como um líder para os desenvolvedores do mundo todo. Mantenha sua fé na Borland e em nossos produtos. Este período terminará logo e você verá que nós continuamos aqui e focados no seu sucesso.

Sinceramente,
David I
"

Como veem, a modificação será pra melhor...

Até+

terça-feira, maio 30, 2006

Zipmail

Hoje eu estava dando uma "geral" em minhas contas de email e me lembrei de uma conta, na verdade, a minha primeira conta de email, criada em meados de 1997, estou de uma conta do ZipMail!!!

Eu nem lembrava quando tinha sido meu último acesso, muito menos da senha! Mas para minha surpresa, consegui logar tentando uma série de senhas "default", vê se pode!

O que me impressiona é a mensagem na tela e abertura:

"Veja o que você só tem no ZIPMAIL
1Mb de espaço para guardar suas mensagens"

Kra, o que se faz com uma caixa postal de 1MB, alguém pode me dizer??? Na época, o Zipmail foi um dos pioneiros no fornecimento de webmail, vejam de lá pra cá quanto coisa mudou. De qualquer forma, foi bacana acessar novamente o zipmail, pois me fez lembrar de um bom tempo, o tempo da faculdade, onde tudo era novo, onde um punhado de idéia afloravam e os desafios se desdobravam diante da gente. Hoje vejo que podia ter explorado mais esse tempo, um tempo que ficou...

Valeu Zipmail! Realmente tem que coisas que só o Zipmail tem pra você!!

segunda-feira, abril 10, 2006

No início...

Não havia mais como evitar, tive que criar meu Blog! Eu já estava me sentindo meio ET, todo mundo tinha esse negócio, só se fala nisso, eu não podia mais ficar fora dessa "mania". No entanto, não pretendo colocar fotos do meio cotidiando, pra sorte de vocês! :-)

A idéia e publicar as experiências do meu dia-a-dia como desenvolvedor de software, vamos ver no que dá! Terei que reservar um tempinho diário para isso...espero conseguir.

Valeu