sexta-feira, março 30, 2007

Operador Ternário em C#

Como já comentei, comecei minha aventura rumo ao badalado C#. Apesar de já ter lido uma coisa ou outra sobre ele e de conhecer a base da programação orientada a objetos, preferi partir do zero, estudando o seu "core", ou seja, seus comandos básicos e suas sintaxes. Também estou procurando me livrar dos vícios de programador orientado a ambientes RAD, não que não se possa programar orientado a eventos em C#, mas se fizer isso, não se pode usufruir de todos os benefícios da POO.
O primeiro recurso diferente que encontrei foi o operador ternário. Para quem já usou o MS Excel, o operador ternário pode ser comparado à função "SE", onde em uma única instrução podemos escolher entre dois valores. A sintaxe do operador ternário é:

condicao ? valor_se_verdadeiro : valor_se_falso

Abaixo eu mostro um exemplo; nele declaro 3 variáveis A, B e C. A e B recebem valores quaisquer, enquanto C vai receber o maior valor entre A e B.

Para os valores sugeridos no exemplo o resultado será:



Neste exemplo usei o Turbo C# da Code Gear, uma excelente ferramenta.

Abraços.

quinta-feira, março 29, 2007

Yahoo lançará e-mail ilimitado

A partir de Maio, o Yahoo Mail, que hoje oferece 1 GB de espaço por conta, passará a oferecer gradativamente a seus usuários espaço ilimitado. Com isso, o Yahoo Mail ultrapassará o GMail (Google), que lançou seu serviço há alguns anos com capacidade inicial de 1 GB e teve sua capacidade expandida a 2,8 GB.

A novidade foi divulgada por John Kremer, vice-presidente do Yahoo Mail, em post no blog Yodel Anecdotal.

Resta saber agora como será a reação dos concorrentes, mas uma coisa é certa: com essa "briga", quem certamente sairá ganhando serão os usuários.

Até +

quinta-feira, março 22, 2007

Quanto cobrar pelo seu sistema?

Hoje, em uma das listas de discussão que assino, ocorreu um debate ferrenho sobre quanto e como cobrar por um sistema. Lá eu vi de tudo; há quem cobre por hora, por licença, por módulo, por pacote, etc.

O preço depende, é claro, da complexidade do sistema, mas discrepância é que não faltou, sendo que uns cobram R$100,00 por sistema e R$ 0,00 de manutenção (acreditam nisso?), outros cobram R$1.000,00 de implantação mais R$ 150,00 por licença mensalmente, o que é um valor no mínimo razoável. Há aqueles que cobram exageros, que acho melhor nem comentar.

Um texto muito bom, publicado pelo colega José Carlos Macoratti, pode ser lido aqui. Neste texto ele faz uma explanação séria e muito coerente sobre tema, vale a pena ler.

quarta-feira, março 21, 2007

TADOQuery trabalhando com dados em cache

Esse é um recurso do TADOQuery pouco conhecido, mas bastante útil. Assim como já se fazia nos tempos do TQuery + TUpdateSQL, onde os dados ficavam no cache local é só eram enviados para o banco através do método ApplyUpdates, o TADOQuery também pode manter os dados localmente e só enviar os dados ao banco no momento desejado e não após o método Post, comportamento que ele tem por padrão.

Isso é muito bom quando trabalhamos com tabelas do tipo mestre-detalhe, onde na maioria das vezes é necessário setar os campos relacionados antes do envio dos dados ao banco. O processo fica ainda mais tranquilo se for usado TADOConnection para controlar a transação, pois, você pode "commitar" os dados da tabela mestre e em seguida os da tabela detalhe e, caso ocorra algum erro, pode abortar, tratar o erro e tentar a gravação novamente sem que o usuário perca seu trabalho.

Bem, vamos ao que interessa! Para isso tudo funcionar primeiro altere a propriedade LockType do TADOQuery para ltBatchOptimistic, isso já fará com que os dados fiquem no cache local. Agora, para postar efetivamente os dados no banco, chame o método UpdateBatch(), que é semelhante ao método ApplyUpdates do TQuery. Fácil, não? :)

Como eu já disse, esse é um recurso muito útil, mas pouco conhecido. Espero que gostem da dica.
Até a próxima.

terça-feira, março 20, 2007

Salvando o seu formulário como imagem

Dia desses, um colega de uma lista de discussão precisava gerar um JPEG a partir de um formulário de seu sistema, algo como um "Print Screen" para usuários menos íntimos com a coisa. Postei lá a solução e, como achei a solicitação interessante, decidi postá-la aqui também. Vamos a solução:

Imaginemos o exemplo clássico, um formulário "Form1" e um botão "Button1", o evento OnClick do botão ficaria como abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var JPEG: TJPEGImage;
begin

JPEG := TJPEGImage.Create;
JPEG.Assign(form1.GetFormImage);
JPEG.SaveToFile('caminho\meuform.jpg');

end;

Fácil né? :) Vocês podem dar um rebuscada na solução usando um TSaveDialog para que o usuário possa escolher o local e o nome do arquivo a ser salvo.

Até a próxima.
Ah! Não esqueçam de declarar o unit JPEG na cláusula Uses.

terça-feira, março 13, 2007

Code Gear - Delphi Tour


De 20 a 30 de março estará ocorrendo o Code Gear - Delphi Tour, um evento gratuíto cuja finalidade é apresentar as novas ferramentas da Code Gear: o Delphi 2007 for Win32 (com suporte ao Windows Vista) e o Delphi for PHP.
Este é um evento que, para quem tiver oportunidade de ir, pode ser bem interessante. É claro que se trata de um evento puramente comercial, mas entre uma apresentação e outra um novo recurso pode ser avaliado.
As inscrições e a consulta das cidades em que o acontecerá o evento podem ser feitas no site aqui.
Abraços

Declaração de Imposto de Renda 2007

Declaração IR 2007

Neste ano, mais uma vez, sentirei a mordida do leão da Receita Federal. Juntamente com o IPVA, esse é um dos impostos que mais protesto na hora do pagamento, mas, infelizmente, não há como fugir dele. Aliás, ter até tem, mas não quero que diminuam meu salário :), e tentar evitar seu pagamento através de certas "técnicas" não faz o meu tipo, mais cedo ou mais tarde acabamos tendo problema.

Hoje dando uma vasculhada na Internet sobre as formas de declaração, encontrei um artigo bem interessante e resolvi transcrevê-lo aqui. Acredito que pode ser valia para muitos que estejam fazendo a declaração pela primeira vez.


Diferença entre Declaração simplificada ou completa

Quem ainda não fez a declaração do IR, tem duas opções para prestar contas à Receita Federal: a declaração simplificada ou a completa.

A declaração simplificada é indicada para que tem deduções abaixo de R$ 11.177,20. Serve para quem não têm muitas deduções a fazer ou que não têm como comprovar os gastos. Além disso, o contribuinte terá um desconto de 20% nos rendimentos tributáveis. Contribuintes com ganhos
acima de R$ 55.886,00 também poderão fazer a declaração simplificada, mas terão apenas o desconto limite.

Já a declaração completa é para os contribuintes que têm deduções comprovadas acima de R$11.177,20 ou que superem os 20% de rendimentos tributáveis. Neste caso, o desconto será maior que os 20% da declaração simplificada.

Podem ser deduzidos do IR gastos com dependentes, médicos, dentistas, hospitais, clínicas, escola, faculdade, pensão alimentícia, previdência privada, pagamento de advogados, engenheiros, arquitetos, aluguéis, arrendamento rural e outros.

A entrega da declaração pode ser feita pela Internet até o dia 30 de abril. Para enviar as informações à Receita Federal pela Web é necessário utilizar outro programa, o Receitanet.

Não há previsão para prorrogação do prazo por isso é importante não deixar para a última hora. Além de enviar pela Web, o contribuinte também pode mandar por disquete ou formulário. O pagamento da restituição - aos contribuintes que têm esse direito - acontece por ordem de entrega, priorizando idosos com 60 anos ou mais e declarações entregues por meio magnético

Fonte: Yahoo Notícias

quarta-feira, fevereiro 28, 2007

Incursões em C#

Salve,

Como profissionais em desenvolvimento de software, precisamos sempre
ficar atentos as novas tecnologias e linguagens que surgem de tempos
em tempos. Confesso que sou um pouco cético (ou conservador, como
queiram) com relação a novas tecnologias, não costumando ir na onda de
modismos ou de entusiastas que elegem uma tecnologia como
revolucionária e bradam aos quatro cantos que ela é melhor, sem que
uma análise profunda seja feita.

Claro que muitas tecnologias boas emergem nesse meio fecundo que é a
área da tecnologia da informação, mas prefiro me nortear pelo
movimento do mercado, ou seja, me orientar pelas tecnologias que as
empresas estão usando ou naquelas que elas estão investindo, pois
sejamos francos: a coisa só vai pra frente quando há grana na parada,
num é mesmo?

Vejam por exemplo o caso do Java. Tenho certeza que ela só chegou onde
está, se tornando uma das tecnologias mais difundidas e usadas no
mundo, graças ao investimento e apoio de grandes como IBM e Oracle.

Partindo desse cenário, estou iniciando uma reciclagem, pois como não
deve ser novidade para ninguém, programo "fluentemente" em Delphi, e
vejo que já está na hora de respirar novas sintaxes. :)

Ao longo deste ano quero estudar seriamente C# e Java, e se até o ano
que vem os ventos continuarem soprando a favor do Ruby on Rails, que em 2006
foi eleita a linguagem do ano pelo TPC Index, certamente ela será uma
das eleitas para 2008.

Um abraço e até a próxima.
--
Nappe

quarta-feira, fevereiro 07, 2007

Dica de Delphi - Exportar dataset para arquivo texto de largura fixa

Saudações,

Vez ou outra sempre há a necessidade de se gerar um arquivo texto de
largura fixa, seja para enviar para algum, lugar seja para exportação
para outro sistema. A rotina a seguir faz isso, usando como referencia
para a largura das colunas o próprio tamanho do campo. Detalhe: no
caso de campos Float, eles serão formatados com 3 casas após a
virgula, mas basta uma "mexidinha" no código para adequar à sua
necessidade.

Divirtam-se!

GeraTextoLarguraFixa(Dataset: TDataset; Separador: Char);
var
intI, intII, intIII: Integer;
strLista: TStringList;
strLinha: string;
dlgSalvar: TSaveDialog;
vetLarguraColuna: array of Byte;
begin

if Dataset.Active = False then
begin
MessageDlg('O arquivo texto não poderá ser gerado porque o
Dataset está fechado!',
mtWarning, [mbOk], 0);
Exit;
end;

dlgSalvar := TSaveDialog.Create(Self);
dlgSalvar.Title := 'Salvar Arquivo Texto';
dlgSalvar.Filter := 'Arquivos Texto|*.txt|Todos os arquivos|*.*';


strLista := TStringList.Create;
strLinha := EmptyStr;


SetLength(vetLarguraColuna, Dataset.FieldCount);

for intI := 0 to Dataset.FieldCount - 1 do
if Dataset.Fields[intI].DisplayWidth >
Length(Dataset.Fields[intI].DisplayLabel) then
vetLarguraColuna[intI] := Dataset.Fields[intI].DisplayWidth
else
vetLarguraColuna[intI] := Length(Dataset.Fields[intI].DisplayLabel);


//Cria a primeira linha com os nomes das colunas
for intI := 0 to Dataset.Fields.Count - 1 do
begin
strLinha := strLinha + Dataset.Fields[intI].DisplayLabel;

if vetLarguraColuna[intI] >
Length(Dataset.Fields[intI].DisplayLabel) then
for intII := Length(Dataset.Fields[intI].DisplayLabel) to
vetLarguraColuna[intI] do
strLinha := strLinha + ' '
else
strLinha := strLinha + ' ';
end;

strLista.Add(strLinha);
strLinha := EmptyStr;


for intI := 1 to Dataset.RecordCount do
begin
for intII := 0 to Dataset.Fields.Count - 1 do
begin

if Dataset.Fields[intII].DataType in [ftFloat, ftCurrency,
ftBCD, ftFMTBcd] then
begin
for intIII := Length(FormatFloat('##0.000',
Dataset.Fields[intII].AsFloat)) to vetLarguraColuna[intII] - 1 do
strLinha := strLinha + '0';

strLinha := strLinha + FormatFloat('##0.000',
Dataset.Fields[intII].AsFloat) + ' ';
end
else
begin
strLinha := strLinha + Dataset.Fields[intII].AsString;

for intIII := Length(Dataset.Fields[intII].AsString) to
vetLarguraColuna[intII] do
strLinha := strLinha + ' ';
end;

end;

strLista.Add(strLinha);
strLinha := EmptyStr;
Dataset.Next;
end;


if dlgSalvar.Execute then
try
strLista.SaveToFile(dlgSalvar.FileName);
MessageDlg('O arquivo "' + dlgSalvar.FileName + '" foi gerado
com sucesso!',
mtInformation, [mbOK], 0);
except
on Erro: Exception do
MessageDlg('Não foi possível gerar o arquivo ' +
dlgSalvar.FileName + '.' +
#13#13 + 'Erro:' + #13 + Erro.Message, mtError, [mbOk], 0);
end;

dlgSalvar.Destroy;
strLista.Free;

end;


--
Fernando D. Nappe
Analista de Sistemas

terça-feira, janeiro 23, 2007

Ranking das Linguagens mais usadas

Salve PessoALL,

Para aqueles que são desenvolvedores é sempre importante saber a quantas andam as linguagens de programação, assim é possível decidir em quais delas vale a pena investir estudos.

Baseado em pesquisas nos mecanismos de busca e atualizado mensalmente, o TPC Index é uma espécie de índice de popularidade das linguagens de programação.


Anotem o link aí e fiquem de olho: http://www.tiobe.com/tpci.htm

Abraços

quinta-feira, janeiro 18, 2007

Dica de Delphi - Ativando e desativando objetos em formulários

Salve Galera,

É muito comum precisarmos habilitar e desabilitar objetos em um formulário em função de outro objeto. Veja o exemplo abaixo:


O Edit do conjuge só poderá ser habilitado se a opção "Casado" for selecionada. Nestes casos é muito comum fazer algo do tipo:

If GroupBox.ItemIndex = 1 then
edtConjuge.Enabled := True
else
edtConjuge.Enabled := False;

É uma forma que funciona, mas poderia ser bem mais simples:

edtConjuge.Enabled := GroupBox.ItemIndex = 1;

Neste caso, estamos condicionando o a propriedade Enabled à igualdade ItemIndex = 1. Desta forma, além de ser mais elegante exige menos código.

É isso aí Galera, espero que curtam a dica. Se tiverem dúvidas é só postar.
Abraços

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é+