Você Sabia?
O Delphi que você (talvez) não conhecia
Você certamente deve ter um amigo, ou mesmo um parente, que conhece há muito tempo (dez anos ou mais) e que, mesmo convivendo freqüentemente com ele, às vezes se surpreende ao descobrir alguma característica ou história “do arco da velha”. Você pensa consigo mesmo: “Mas esse é o Fulano que eu conheço?”
Pois é... Todos nós, leitores da ClubeDelphi, temos um grande amigo em comum chamado Delphi, que já completou seus dez anos e ainda terá uma vida longa pela frente. Entretanto, nos recônditos mais escuros das diversas camadas que compõem o produto, podemos encontrar relíquias antiqüíssimas, que remontam à época pré-Windowsiana, onde reinavam os terríveis monstros verdes (não, não são dinossauros, mas os monitores CGA com a tela de fósforo verde).
Prepare-se, pois a partir deste artigo você vai conhecer alguns dos pontos mais obscuros do Delphi. Você nunca mais verá seu companheiro da mesma forma!
Nos tempos da linha de comando
O que é conhecido hoje como o “prompt de comando”
, ativado no Windows NT e XP ao executar o arquivo cmd.exe (ou mesmo o antigo command.com, este também disponível nos Windows 9x), é um “emulador” do ambiente MS-DOS, que foi durante muitos anos a plataforma de trabalho de muita gente por aí (alô Clippeiros!).
Tudo era feito a partir da linha de comando: a passagem de parâmetros, a construção da interface (geralmente em modo texto), a interação com o usuário (por exemplo, pegar o código da tecla pressionada), a entrada e saída de dados, a exibição de erros etc. Alguém perguntou sobre o mouse? Isso seria coisa do futuro ainda. Calma que chegaremos lá.
Bom, comecemos pelo começo então. Quando executamos um programa, a primeira forma de interagir com ele é pela passagem de parâmetros. Mas o que são parâmetros para um programa? Certamente você sabe muito bem como passar parâmetros para um procedimento ou função, mas para um programa?
O esquema a seguir ilustra como o sistema operacional (S.O.) entende a linha de comando ao ativar um programa:
Figura 1.
O nome do programa executável é o parâmetro número zero e é o único obrigatório (claro, senão como o S.O. saberia o que executar, né?). O resto fica a critério do usuário.
Desde os tempos mais remotos o Turbo Pascal já fornecia uma forma bastante elegante e prática para acessar os parâmetros passados na linha de comando, através das funções ParamCount (que retorna o número de parâmetros) e ParamStr(N) (que retorna o parâmetro N).
Curiosidade: se os parâmetros são separados por espaços, como passar um parâmetro que precisa conter espaços? Hoje em dia é só usar as aspas (?) para delimitar o texto desejado. Mas naquela época... Tínhamos que fazer isso “na unha”...
A Listagem 1 mostra uma aplicação do tipo console no Delphi, mas que era o único tipo de aplicação que podíamos fazer no Turbo Pascal. Você pode testar esse exemplo em qualquer versão do Delphi (incluindo .NET) ou do Turbo (visite o museu da Borland para baixar algumas versões e se divertir).
Listagem 1. Trabalhando com parâmetros da linha de comando
program SuperParam;
{$APPTYPE CONSOLE}
var
p: Integer;
begin
WriteLn('Super-Param V. 1.0');
WriteLn;
if ParamCount = 0 then
WriteLn('Nenhum parametro digitado.')
else
begin
WriteLn('Numero de parametros: ', ParamCount);
WriteLn;
for p := 0 to ParamCount do
WriteLn('Parametro ', p, ': ', ParamStr(p));
end;
ReadLn; // só necessário se for executar dentro do IDE
end.
Para brincar com o programa depois de compilado, abra um prompt de comando, mude o diretório atual para aquele onde o executável foi gerado e escreva apenas o nome do arquivo. A resposta deverá ser:
C:\...>SuperParam
Super-Param V. 1.0
Nenhum parametro digitado.
Agora execute-o com alguns parâmetros na frente, como por exemplo:
C:\...>SuperParam 123 /n:7 “Oi, tudo bem?”
Super-Param V. 1.0
Numero de parametros: 3
Parametro 0: C:\...\SuperParam.exe
Parametro 1: 123
Parametro 2: /n:7
Parametro 3: Oi, tudo bem?
Como disse, o parâmetro zero é o caminho completo para o arquivo executável (o que é bastante útil) e o parâmetro digitado entre aspas aparece inteiro (mas note que as aspas são eliminadas da string). Interessante: na VCL, o código para a propriedade ExeName da classe TApplication (na unit Forms) é:
function TApplication.GetExeName: string;
begin
Result := ParamStr(0);
end;
Para executar a aplicação dentro do IDE, utilize o menu Run | Parameters... para poder especificar os parâmetros a serem passados para ela. Também é importante deixar como última linha do programa o comando ReadLn (conforme comentário na Listagem 1), senão você não verá a tela de saída. Para terminar o programa basta pressionar a tecla Enter.
Você pode trabalhar com parâmetros nas aplicações Windows “normais”. As funções são exatamente as mesmas.
Se quiser acessar a linha de comando inteira, tal como digitada pelo usuário, acesse a variável CmdLine (definida na unit System como do tipo PAnsiChar, mas que pode ser manipulada como uma string).
Canais de entrada e saída
Uma das formas de comunicação entre programas é através da utilização de certos “arquivos” especiais, chamados de padrões para entrada e saída (standard input and output). Através de um mecanismo conhecido como tubo (pipe, simbolizado pela barra vertical | ) podemos direcionar a saída de um programa para a entrada de outro.
Usando as variáveis Input e Output, definidas na unit System como sendo do tipo Text, podemos ler e escrever, respectivamente, nos arquivos padrões. A Listagem 2 mostra um pequeno exemplo.
Listagem 2. Arquivos padrões para entrada e saída
program SuperPipe;
{$APPTYPE CONSOLE}
var
Linha: string;
begin
WriteLn(Output, 'Super-Pipe V. 1.0');
WriteLn(Output);
WriteLn(Output, 'Inicio da entrada');
WriteLn(Output, '-----------------');
while not EOF(Input) do
begin
ReadLn(Input, Linha);
WriteLn(Output, Linha);
end;
WriteLn(Output, '-----------------');
WriteLn(Output, 'Fim da entrada');
end.
Para testar, abra um prompt de comando, mude para o diretório do executável e digite a seguinte linha (após o prompt, claro):
C:\...>dir | SuperPipe
Super-Pipe V. 1.0
Inicio da entrada
-----------------
Volume in drive C is Adail.
Volume Serial Number is 38B1-C70C
Directory of C:\...<">
...