Mostrando postagens com marcador Delphi. Mostrar todas as postagens
Mostrando postagens com marcador Delphi. Mostrar todas as postagens

quinta-feira, agosto 19, 2021

Por que não usa Lazarus?

Já ouvir falar na IDE Lazarus? Não? Pois então dê uma olhada https://www.lazarus-ide.org.

Lazarus é uma IDE compatível com Delphi para desenvolvimento rápido de aplicativos (RAD). Possui um grande número de componentes nativos, permitindo criar interfaces gráficas bem ricas, inclusive para Linux. Ele usa como linguagem padrão o Free Pascal, e o código-fonte pode facilmente ser portado o para o Delphi. Aliás, para quem já programa em Delphi a dificuldade será nula, pois o Lazarus é muito parecido com as versões mais antigas da famosa plataforma.

Na próxima postagem  mostraremos como montar uma aplicação de banco de dados simples, conectando-se ao MS SQL Server.

Té+

sábado, abril 21, 2018

Melhorando suas atribuições booleanas

Salve leitor.

No dia--a-dia de um desenvolvedor é muito comum associar um retorno booleano a um valor inteiro, ou outro retorno. Seria algo do tipo (exemplo em Delphi Language):

procedure QualquerCoisa();
begin
if (numPedidos > 0) then
  begin
    existePedidos := True;
  end
else
  begin
    existePedidos := False;
  end;
end;

Isso funciona? Sim, funciona. Mas e se houvesse uma forma mais simples e bem menor. E há!
Qualquer linguagem de programação moderna suporta uma comparação diretamente na atribuição, tornando o código bem mais enxuto. Veja como seria:

procedure QualquerCoisa();
begin
  existePedidos := numPedidos > 0;
end;

Simples, não é? Com o código acima a variável existePedido recebe o valor da comparação "numPedidos > 0", sem a necessidade de uso do IF.

sexta-feira, abril 06, 2012

TimeOut TSoapConnection

Salve,

Essa semana enfrentei um sério transtorno com erro de TimeOut em um Webservice consumido via SoapConnection. Depois pesquisar bastante descobri que o tempo de retorno de um Webservice é algo definido pelo Windows, e que a atualização do Internet Explorer pode alterar tal configuração. A boa notícia é que dá pra configurar isso via Delphi, invocando uma procedure disponível na unit WinInet. Bom chega de prosa e vamos à solução!

No componente TSoapConnection, procure pelo evento OnBeforeExecute, e codifique-o conforme exemplo abaixo:


procedure TForm1.soapConnBeforeExecute(
  const MethodName: String; var SOAPRequest: WideString);
  var timeOut: Integer;
begin
  timeOut := 360000;
  InternetSetOption(nil, INTERNET_OPTION_RECEIVE_TIMEOUT, pointer(@timeOut), sizeof(timeOut));
end;


Não se esqueça de adicionar na cláusula Uses a unit WinInet.

Té+

quarta-feira, junho 03, 2009

Validando Campos no Delphi

Salve,

Um coisa particularmente chata (porém fundamental) é a validação dos campos de um Dataset antes do salvamento. Afim de evitar o uso de estruturas condicionais (vulgo IF) desenvolvi uma rotina que faz essa validação de forma simples, bastando apenas a configuração de algumas propriedades e o uso de apenas um evento.

A primeira coisa a se fazer é setar através do FieldsEditor a propriedade Required dos campos que serão obrigatórios. Aproveite e ajuste também a propriedade DisplayLabel, que será usada pela rotina de validação para exibir uma mensagem amigável ao usuário. A seguir pode ser visto como deve ficar cada campo obrigatório no FieldsEditor:



Agora é necessário criar a function que fará a checagem dos campos. Abaixo temos seu código:

function TfrmExemplo.CheckFields(Dataset: TDataset): Boolean;
var i: Integer;
begin

i := 0;
Result := True;

for i := 0 to Dataset.Fields.Count - 1 do
begin
if (Dataset.Fields[i].Required) and (Dataset.Fields[i].IsNull) then
begin
MessageDlg('
O campo ' + Dataset.Fields[i].DisplayLabel + ' não foi informado!', mtWarning, [mbOk], 0);
Result := False;
Break;
end;
end;

end;

Como podemos ver, a função recebe como parâmetro um TDataset, que pode ADO, DBX, BDE, ClientDataSet, enfim, um Dataset. Dentro dela o campos são varridos e aqueles que forem obrigatórios e tiverem valor = nulo será considerado inválido. Neste caso, a função retorna false.

Feito isso, o próximo passo é codificar o evento OnBeforePost do Dataset, para que através da nossa function, o salvamento seja impedido em caso de algum campo em branco.


procedure TfrmExemplo.cdsImpostoDespesaBeforePost(DataSet: TDataSet);
begin

if (CheckFields(Dataset) = False) then
begin
Abort;
end;

end;

Pronto! Agora, sempre antes do salvamento, os campos de nosso Dataset serão validados e, caso algum campo obrigatório tenha ficado em branco, uma mensagem será exibida. A figura a seguir mostra um cadastrinho onde o usuário tentou salvar e deixou um campo obrigatório em branco. Notem que o registro continuará em edição. Ah! Vc pode compartilhar o evento entre vários Datasets, assim a mesma função valida qualquer campo. Bacana né?



Té+

PS: o crédito pela formatação do código fonte é do programinha Delphi2Html, desenvolvido pelo colega Diego Silva.

terça-feira, março 03, 2009

Ranking das Linguagens 2009

Salve,

Periodicamente a TIOBE Software publica um ranking, uma lista, com a participação (rating) de mercado das linguagens mais usadas. Com relação ao Delphi, meu ganha pão, sua participação permaneceu inalterada entre 2008 e 2009, ocupando a 9º posição. Honestamente, acho uma posição muito boa, tendo em vista toda a nuvem de lambanças da Borland/Codegear/Embarcado/ETC.

Certamente essa posição é mantida pelo legado que o Delphi criou até sua versão 7. Bons tempos aqueles...

A lista pode ser vista nesse link.

Abraços

terça-feira, julho 08, 2008

Preview Personalizado com Quick Report

Salve,

Muitos não gostam dele, mas ainda acho que o QuickReport é um dos mais práticos (não disse um dos melhores) geradores de relatório para Delphi. Não precisa de nenhuma configuração especial, é levinho, funcional, e é por isso que eu ainda o utilizo ostensivamente em meus sistemas.

Pensando nos desenvolvedores que como eu usam o QReport, revolvi publicar o código e formulário de um Preview Personalizado que desenvolvi, que inclui algumas funcionalidades interessantes, como a possibilidade de se exportar o relatório para um arquivo CSV, que pode ser aberto DIRETAMENTE em planilhas eletrônicas sem a necessidades de codificações mirabolantes, e de ser totalmente em português, que ajuda muito aos usuários "monoglotas" :)



A primeira providência a se tomar é a atualização do QReport para a versão 3.5, pois a que acompanha o Delphi não é a versão mais atual do pacote, e por isso não inclui o componente QRPreview, fundamental nesse exemplo. As atualizações podem se baixadas no seguintes links: D5, D6 e D7. Após baixar o arquivo basta instalá-lo normalmente, o instalador atualizará o Delphi, não precisa se preocupar em reconfigurar nada.

Depois de instalada a atualização já pode executar a aplicação de exemplo (Delphi 7), que inclui um form com um ClientDataSet, um QuickReport e o formulário do Preview, além é claro, dos códigos utilizados na exibição do mesmo. Chamo a a atenção para o evento OnPreview do QuickReport, pois é onde reside a codificação que exibe o preview.

Importante: é necessário adicionar a Unit QRPrntr na unit do relatório.

Até +

terça-feira, maio 20, 2008

Zeos

Salve,

Nas aplicações que desenvolvo sempre usei o Firebird, principalmente a versão 1.5, mas agora que a versão 2.0 (estou usando a 2.0.3) já está bem madura e consistente, decidi que é hora de migrar algumas aplicações já existentes e começar a usá-la nos novos produtos.

A primeira dúvida foi qual driver de acesso usar. Nas outras versões do FB, sempre usei DBExpress com Driver UIB (Unified Interbase), mas ele mudou muito, deixou de ser apenas um Driver e passou a ser um pacote de componentes, aí desanimei. Não sou fã desse negócio de configurar isso, compilar aquilo, sou simplista e ponto! Ainda mais porque uso o UserControl para controle de acesso, o que me faz pensar muito na ora de mudanças profundas.

Não precisei perquisar quase nada pra encontrar boas referências aos Zeos, que é usado principalmente pra acessar o PostgreSQL, decidi então testá-lo, e que maravilha! Ele só tem me trazido alegrias.

Primeiro, é fácil de instalar, bastou compilar os DPK's e pronto. Segundo, é facílimo de configurar e utilizar, principalmente em rede! Que tranquilidade. Como uso ClientDataSet, bastou trocar o SQLConnection do DBExpress pelo ZConnection do Zeos, configurar algumas propriedades e estabelecer a conexão com o FB 2.0.

Componentes da Palete Zeos Access

No entanto, ainda acho cedo pra aclamá-lo, vou fazer mais testes e postar os resultados aqui. Provavelmente, vou desenvolver uma "aplicaçãozinha" de exemplo.

Até+

sábado, janeiro 26, 2008

Exportando tabelas do MS Access para Excel ou HTML usando ADO

Salve pessoal,

Um recurso bem interessante porém pouco conhecido sobre o ADO, é que ele permite através do JET (mecanismo usado para acessar bancos de dados Access) a possibilidade de exportação direta para planilhas do Excel (XLS) e arquivos HTML. Pensando nisso, revolvi postar um exemplo de como se fazer isso em Delphi, vamos lá!

Primeiramente, criamos um formulário com os elementos mostrados abaixo:

Temos aí:
  • 3 Tbitbtn: btnAbrir, btnExportaXLS e btnExportaHTM;
  • 1 TListbox: listTabelas, que seá usado para exibir as tabelas presentes no database;
  • 1 TADOConnection: conAccess, responsável por estabelecer a conexão com o database;
  • 1 TOpenDialog: openDialog, que será usado para selecionar o banco de dados a ser usado;

Codificação

Declare uma função na sessão private da unit, com o seguinte header:

function TabelasADO(ADOConnection: TADOConnection):TStringList;

Seu corpo deve ficar como abaixo:

function TfrmExemplo.TabelasADO(ADOConnection: TADOConnection): TStringList;
var ADODataSet: TADODataSet; Tabelas: TStringList;
begin
Tabelas := TStringList.Create;
ADODataSet := TADODataSet.Create(nil);
ADODataSet.Connection := ADOConnection;
ADOConnection.OpenSchema(siTables, EmptyParam, EmptyParam, ADODataSet);

//Filtra somente as tabelas
ADODataSet.Filter := adicionaFiltro(ADODataSet.Filter, '(TABLE_TYPE = ''TABLE'')');
ADODataSet.Filtered := True;

with ADODataSet do
begin
First;
while not EOF do
begin
Tabelas.Add(FieldByName('TABLE_NAME').AsString);
Next;
end;
end;

ADODataSet.Free;
Result := Tabelas;
end;

Precisaremos também de outra função:
function adicionaFiltro(string1, string2: string): string;
Com o código listado abaixo:
function TfrmExemplo.adicionaFiltro(string1, string2: string): string;
begin
if string1 <> '' then
Result := string1 + ' or ' + string2
else
Result := string2;
end;

O evento onClick do botão btnAbrir fica como a seguir:

procedure TfrmExemplo.btnAbrirClick(Sender: TObject);
var stringConexao: string;
begin
stringConexao := EmptyStr;

if openDialog.Execute then
begin
stringConexao := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Persist Security Info=False',[openDialog.FileName]);
conAccess.ConnectionString := stringConexao;
conAccess.Connected := True;
listTabelas.Items := TabelasADO(conAccess);
end;
end
;

Por fim, o evento onClick do botão btnExportaXLS, que também é compartilhado com o botão btnExportaHTM, reaproveitando código:

procedure TfrmExemplo.btnExportaXLSClick(Sender: TObject);
var nomeTabela, instrucaoSQL: string;
begin

nomeTabela := listTabelas.Items[listTabelas.ItemIndex];

if Sender = btnExportaXLS then
instrucaoSQL := 'select * into ' + nomeTabela + ' in "c:\doctemp\' + nomeTabela + 'FromAccess.xls" "Excel 8.0;" from ' + nomeTabela
else
instrucaoSQL := 'select * into [' + nomeTabela + '.htm] in "c:\doctemp" "HTML Export;" from ' + nomeTabela;

try
conAccess.Execute(instrucaoSQL);
MessageDlg('A tabela ' + nomeTabela + 'foi exportada com sucesso para o formato selecionado!', mtInformation, [mbOk], 0);
except
MessageDlg('Não foi possível exportar a tabela "' + nomeTabela + '"', mtError, [mbOK], 0);
end;

end;

Algumas consideração a fazer: meu formulário se chama frmExemplo; eu possuo uma pasta chamada "doctemp" em minha máquina, que é para onde eu exporto meus arquivos, uso isso no código e é provável que precisem modificar isso.

Bem, quem estiver precisando, pode fazer o teste e, em caso de dúvidas sobre algum trecho do código, é só comentar.

Abraços e até a próxima.

quinta-feira, novembro 22, 2007

Máscara em Campos Agregados - Alternativa

Salve,

Não me lembro de ter feito isso antes, e hoje precisei colocar máscara (DisplayFormat) em um campo Agregado (TAggregate) de um ClientDataSet, e não sei por que cargas d'água não consegui. O negócio simplesmente não funciona de jeito nenhum! Tentei várias máscaras, mudei propriedades, mas nada.

Como estava com pressa, não "googlei" muito, e acabei resolvendo o problema de forma caseira. A solução foi implementar o evento OnGetText do campo agregado e depois compartilhar o evento entre os agregados. Ficou assim:

procedure TfrmMeuFormulario.cdsExemplototal_pesoGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
//Outras mascaras podem ser usadas
Text := FormatFloat('#,##0', Sender.Value);
end;

Aliás, quem tiver a solução definitiva para esse problema podem apresentar à vontade, pois eu também gostaria de saber.

quarta-feira, setembro 26, 2007

Versões mais usadas de Delphi

Salve Pessoal,

Há alguns dias estava no ar no meu blog uma enquete sobre a versão mais utilizada do Delphi, que foi submetida à votação de desenvolvedores de todo o país, que participam de comunidades e foruns relacionados ao Delphi. O resultado está a seguir, e confesso que não fiquei surpreso.
Abraços.

Versão Utilização
Delphi 7 57,35%
Delphi 2006 16,18%
Delphi 5/6 8,82%
Delphi 2007 7,35%
Outra versão 5,88%
Delphi 2005 4,41%

sábado, setembro 08, 2007

Criptografia sem frescura

Hoje precisei criptografar uma string, nada muito sofisticado, apenas não deixar que ela ficasse totalmente exposta na tabela do banco de dados. Dei uma procurada na WEB e encontrei várias soluções, mas a que usei foi uma que encontrei no site Planeta Delphi, enviada pelo colega Roberto Oliveira, que me atraiu pela simplicidade de uso, sem frescura, mas com total funcionalidade. Abraço a todos e segue abaixo a função.

function Criptografar(wStri: String): String;
var Simbolos: array [0..4] of String;
x : Integer;
begin

Simbolos[1]:= 'ABCDEFGHIJLMNOPQRSTUVXZYWK ~!@#$%^&*()\';

Simbolos[2]:= 'ÂÀ©Øû׃çêùÿ5Üø£úñѪº¿®¬¼ëèïÙýÄÅÉæÆôöò»Á';
Simbolos[3]:='abcdefghijlmnopqrstuvxzywk1234567890';
Simbolos[4]:='áâäàåíóÇüé¾¶§÷ÎÏ-+ÌÓ߸°¨·¹³²Õµþîì¡«½';

for x := 1 to Length(Trim(wStri)) do
begin

if pos(Copy(wStri,x,1),Simbolos[1]) > 0 then
Result := Result + Copy(Simbolos[2],Pos(copy(wStri,x,1),Simbolos[1]),1)
else if Pos(Copy(wStri,x,1),Simbolos[2]) > 0 then

Result := Result + Copy(Simbolos[1],Pos(copy(wStri,x,1),Simbolos[2]),1)
else if Pos(Copy(wStri,x,1),Simbolos[3]) > 0 then

Result := Result + Copy(Simbolos[4],Pos(copy(wStri,x,1),Simbolos[3]),1)
else if Pos(Copy(wStri,x,1),Simbolos[4]) > 0 then

Result := Result + Copy(Simbolos[3],Pos(copy(wStri,x,1),Simbolos[4]),1);
end;
end;

Abraços

sexta-feira, agosto 31, 2007

Enquete

Essa semana me perguntaram: "qual é a versão mais usada do Delphi? " Honestamente, não tive resposta, já que o que possuía eram apenas respostas aleatórias de um e outro colega. Pensando nisso e aproveitando esse novo recurso do Blogger, decidi montar uma enquete para que a comunidade possa responder a essa pergunta, e assim também servir de amostra para o que acontece no mercado. Um abraço e obrigado a todos que responderem.

terça-feira, abril 10, 2007

Será que já não vi esse filme?

Hoje, em uma lista de discussão sobre Delphi onde participam alguns funcionários da CodeGear, perguntei sobre o futuro dos Turbos, a sua linha de ferramentas populares e, como já imaginava, a resposta que tive não foi das mais animadoras, pois fiquei sabendo de que eles só serão atualizados depois do lançamento do BDS 2007 (codinome Highlander).
No fundo compreendo que a CodeGear tenha um interesse maior em seu "top de linha", pois, pra se ter uma idéia, o BDS 2006 Professional (D2006, C++Builder 2006 + C# Builder 2006) para novos usuários (a versão mais barata) custa hoje, em promoção, R$ 2.452,50, enquanto que qualquer um dos Turbos sai por R$ 1.200,00, ou seja, metade do preço. Será que já não vimos esse filme com o Kylix (alguém se lembra dele)?
Honestamente, acho que a CodeGear deveria focar mais nessa linha, afinal, quantos de nós desenvolvemos comercialmente em mais de uma linguagem? Eu pessoalmente, uso o Delphi e comecei agora a "brincar" com o C#, então pra quê eu quero Delphi, C++ e C# no mesmo pacote?
Tudo bem, se o preço fosse acessível como o do Visual Studio, que custa entre R$ 1.200,00 e R$ 1.700,00 e vem com IDE para C# e VB.NET. E com todo respeito a CodeGear, o VS dá um banho em termos de produtividade.

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

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

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, 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

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