Pesquise no Blog

 

segunda-feira, 30 de agosto de 2010

DeleteRow e DeleteColumn em TStringGrid

Quem já trabalhou com TStringGrid com certeza já sentiu falta dos métodos DeleteRow e DeleteColumn. Por algum motivo, a classe TStringGrid não herdou esses métodos de seu ancestral TCustomGrid.

Como esses métodos estão disponíveis de forma protegida em seu ancestral, para resolver este problema podemos criar uma classe herdando TStringGrid e simplesmente acessar os métodos, como exemplo abaixo:

terça-feira, 8 de junho de 2010

Criando uma Tela Inicial (Splash Screen)

1 - Crie um novo form que será sua Splash Screen, não esqueça de mudar o Visible deste form para True.
2 - No menu Project > Options > Forms: retire o form que você criou da lista de auto-create.
3 - Menu Project > View source: isso vai abrir o fonte do projeto.
O bloco begin-end do projeto deve ser algo assim:

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(TForm5, Form5);
Application.Run;
end.

Abaixo um exemplo de como colocar a Splash Screen pra funcionar enquanto o resto do sistema está carregando:


begin

// isso mostra a Splash Screen
wSplash:= TwSplash.Create( Application );
try
// seu sistema carregando normalmente
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TForm4, Form4);
Application.CreateForm(TForm5, Form5);

finally
// fechando Splash Screen
wSplash.Free;
end;

// Sistema carregado e pronto
Application.Run;
end.


------
Isso é o básico, a partir disso você pode ir melhorando, colocar uma imagem na Splash Screen, tirar as bordas. Use a imaginação!

terça-feira, 16 de dezembro de 2008

Relatórios com quebras/grupos usando Quick Report

Vamos criar um relatório agrupando por data e no processo ver algumas dicas.

Em uma nova aplicação defina o Name do Form principal para 
wMain e coloque um botão Name btnRelat. Salve o Form como uMain.pas.

Crie um novo Form com name wRelat, salve como uRelat.pas.
No Form wRelat coloque um componente TQuickRep e um TADOQuery.

Defina o name da Query para qryDados.
Faça conexão da Query com a ba
se que quiser e da forma que quiser, para esse exemplo basta saber que a tabela que usei tem 3 campos: Data(date), Nome(char), Valor(decimal).
Defina a SQL para "select ( year(data) * 100 ) + month(data) as anomes , * from dados order by data".

No QuickRep1 defina a DataSet para qryDados.


Atenção para o campo "anomes" que criamos no Select e no Order, isso é parte importante para o grupo do relatório funcionar.

No QuickRep1 coloque um TQRGroup e defina a Expression para "anomes".

No TQRGroup coloque 2 TQRLabel. Um TQRLabel defina Caption para "Ano / Mês:", o outro defina o Name para lblData.


Coloque no QuickRep1 um TQRBand com Name bandDetail e BandType rbDetail.

No bandDetail coloque:
TQRDBText DataSet qryDados e DataField Data.
TQRDBText DataSet qryDados e DataField Nome.
TQRDBText DataSet qryDados e DataField Valor.


Coloque outro TQRBand Name bandFooter e BandType rbGroupFooter.

No bandFooter coloque um TQRExpr e defina o a Expression para "sum(valor)" e ResetAfterPrint para True.
Esse será o totalizador de valor por grupo.


No TQRGroup defina a FooterBand para bandFooter e no evento BeforePrint:

begin
  lblData.Caption:= FormatDateTime( 'yyyy/mm' , qryDados.FieldByName( 'data' ).AsDateTime );
end;

No Form wMain adicione na Uses uRelat e no evento Click do btnRelat:

begin
  wRelat.qryDados.Open;
  wRelat.QuickRep1.Preview;
end;


Execute e clique no botão para ver o resultado.

quarta-feira, 3 de setembro de 2008

Convertendo imagens BMP/JPG(JPEG)

try
// carrega o BMP
aBMP:= TBitmap.Create;
aBMP.LoadFromFile( 'c:\pasta\figura.bmp' );

// cria um novo JPEG
aJPG:= TJPEGImage.Create;
// atribui o BMP ao JPEG
aJPG.Assign( aBMP );
// salva o JPEG
aJPG.SaveToFile( 'c:\pasta\figura.jpg' );
finally
// libera as variáveis
FreeAndNil( aBMP );
FreeAndNil( aJPG );
end;

Não esqueça de incluir as units Graphics e JPEG na cláusula Uses.

terça-feira, 26 de fevereiro de 2008

Evitar múltiplas instâncias do Programa

O tratamento de múltiplas instâncias do executável é uma praticamuito útil, principalmente quando não queremos que os usuários trabalhem com mais de uma instância de nossas aplicações.

Ja vi muitas gambiarras bizzarras e pouco elegantes para resolver esse problema, neste tutorial vou mostrar uma maneira simples e elegante pare resolver de uma vez por todas esse prblema:

Declare a variável global
var
{...} HMutex: THandle; //Essa variável deve ser GLOBAL


No onCreate do seu form digite o seguinte código
Var
{...} FileName : PChar;
begin
{...}FileName := PChar( ExtractFilePath( Application.Exename ) );
{...} HMutex := createMutex(nil, True, FileName);

{...}if ( HMutex = 0 ) or ( GetLastError = ERROR_ALREADY_EXISTS ) then
{...}{...}raise Exception.Create('O programa já está em execução.');

(* Restante da sua lógica.... *)
end;


No on close

ReleaseMutex( HMutex );

Pronto.

Para saber mais: Exclusão Mútua ( Mutex )
: Win32 Error codes

terça-feira, 29 de janeiro de 2008

Trabalhando com Web Services

Bem, hoje vou falar um pouco sobre como trabalhar com web services. Como esse assunto é muito longo, vou passar apenas o básico do básico.

1º Passo: Antes de cair de cara neste artigo certifique-se que vc está por dentro dos seguintes assuntos:

.Conceito de Webservices: http://pt.wikipedia.org/wiki/Webservices
.SOAP: http://pt.wikipedia.org/wiki/Soap
.XML: http://pt.wikipedia.org/wiki/Xml

Os conceitos acima são de suma importância, não deixe de estuda-los.

Ok, agora que vc já leu todo material que citei, estamos prontos para entrar no mundo dos web services. Para este exemplo utilizei:

.Turbo Delphi Explorer;
.IIS

Não vou entrar em detalhes de como configurar o IIS, já que isso pode ser encontrado facilmente aqui:

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/bc0c4729-e892-4871-b8f3-fcbf489f2f09.mspx?mfr=true

Ok, vamos primeiro criar o servidor: Vá em File/New/Other/Webservices e selecione SOAP Server Application



2º Passo:Selecione a opção ISAPI/NSAPI Dynamic Link Library.

Essa é a carinha da nossa aplicação. Geralmente nada é programado nela, tudo dese ser deixado como está.

3º Passo: Ok, agora vamos criar um SOAPDataModule. Vá em File/New/Other/webservices/SOAP Server Data Module

Uma SoapApplication pode ter vários soap data módules. O soapDataModule pode ser entendido como o webservice em si. A quantidade de SOAPDataModule depende de seu projeto.

4ºPasso, Antes de começar a programar salve e faça os seguintes ajustes no código.

Substitua a linha NomeDaUnit = interface(IAppserverSOAP)

por

NomeDaUnit = interface(IAppserver)

e

nomedaClasse = class(TSoapDataModule, NomeDaInterface, IAppServer, IAppServerSOAP)

por

nomedaClasse = class(TSoapDataModule, NomeDaInterface, IAppServer)

Veja a fugura abaixo:

Agora vamos declarar um método chamodo testeWebService. Repare que podemos declarar métodos que serão usados internamente(só será utilizado dentro do web service) e externamente(Utilizado por outros aplicativos).

Para declarar um método externo precisamos utilzar a diretiva stdcall após a declaração do cabeçalho do método e copia-lo para dentro de interface, veja na figura abaixo:


repare que os metodos testeWebservice e getErrorCode são externos, já que tem a diretiva stdcall e foram declaradas na interface.

vamos fazer uma implementeção simples para o método testeWebservice:

result := 'seu web service está funcionando!'; //Melhor que Olá Mundo....

Pronto, nosso web service está pronto.

Agora basta salvar e dar um build. Pegue a dll compilada e jogue no seu servidor. Depois disso acesse-a pela browser:
localhost//[SuaDLL].dll

Você verá algo assim:

repare que nossos métodos aparecem logo abaixo. Clique no link WSDL, você vai visualizar um xml, copie o endereço que aparece no browser.

Agora vamos fazer o cliente:

Dê um file/New/VCL Forms Application

Depois dê um FILE/New/Other/WebServices/WSDL Importer


Na tela seguinte, cole o link do WSDL:

Clique em Next. Se tudo ocorrer bem, vc verá a seguinte tela:

Clique em finish. Salve a interface com um nome qqr. Se vc não conseguir importar o wsdl significa:

.Seu Servidor pode não estar funcionando;
.Vc não fez os ajustes corretamente.

Ok, Vá agora para o seu form principal e importe a interface do Webservice:
Ok, compile.

Agora coloque um button na tela e no evento Onclick coloque o seguinte código:

procedure TForm1.Button1Click(Sender: TObject);
var
ls_WsMessage: String;
begin
ls_WsMessage := IWebService.GetIUWebService().testeWebService;
try
ShowMessage( ls_WsMessage );
except
raise Exception.Create( 'Erro ao acessar o web service!' );
end;
end;



Resultado:


Espero que este pequeno tutorial ajude. Vou disponibilizar este exemplo em public.box.net/hatsumomo

Logo logo mais artigos.

sábado, 26 de janeiro de 2008

Tutorial Firebird - Criando banco de dados

Bom pessoal, creio que muitos dos nossos amigos que estão iniciando na programação em delphi, já utilizaram o paradox ou o access para armazenamento de dados, sei que muitos deles ainda não tiveram tantos problemas como eu tive com esses dois "bancos de dados", por isso, escreverei esta série de tutoriais para ajudar essa turma.

Estou utilizando o FIREBIRD 2.0 e administrando este banco de dados com o IBEXPERT FREE 2005.03.12, mas qualquer IBEXPERT TRIAL ( http://www.ibexpert.com/ ) já vale para o nossa aventura.

Bom primeiro, abra seu IBEXPERT...

Depois no menu database, selecione create database em server name,
colocar 127.0.0.1,

em protocolo, deixar TCP/IP,

em DATABASE, informar a pasta e o nome do novo banco de dados... eu coloquei: C:\tutorial_blog_fernando\dados.fdb

em cliente libray file,

colocar: C:\Arquivos de programas\Firebird\Firebird_2_0\bin\fbclient.dll

em user name, colocar SYSDBA em password, colocar masterkey

em dialect, colocar DIALECT 3

Clique em OK

Abrirá uma tela de registro...

em server version, coloque firebird 2.0,

em database alias, coloque um apelido para este banco de dados que pode ser simplesmente TUTORIAL

clique em register.

Pronto, seu banco de dados está criado e devidamente registrado.

segunda-feira, 21 de janeiro de 2008

Classes Progenitoras para Desenvolvimento de Componentes Visuais

Para a criação de componentes no Delphi, o desenvolvedor pode utilizar outro componente ou uma classe-base para ser seu progenitor. A VCL (Visual Component Lybrary) contém a classe TControl (classe derivada de TComponent) que possui informações sobre componentes visuais como: posição (Left, Top), tamanho(Width, Height), cor (Color), entre outras. As classes de importância para a criação de componentes são TWinControl e TGraphicControl. Estas são subclasses de TControl.


Características da classe TControl e suas subclasses (TWinControl e TGraphicControl)

TComponent: Classe base de todos os componentes. Esta pode ser herdada de outros componentes não visuais.

TControl (TControl é uma classe derivada de TComponent): Controles contém informações como: posição (Left, Top), tamanho(Width, Height), cor (Color), fonte (Font), Ativação (Enabled) e visibilidade (Visible). TControl não podem receber foco ou ser pintado.

TWinControl (TWinControl é uma classe derivada de TControl): Controles de janelas são componentes visuais baseados em janelas. Estes podem receber foco, serem pintados e conter outros controles. Os controles de janelas são utilizados para o desenvolvimento de componentes que realizam determinadas funções dependendo do que acontece no sistema.

TGraphicControl (TGraphicControl é uma classe derivada de TControl): Controles gráficos são componentes visuais. Estes não podem receber foco e conter outros controles. Os controles gráficos são utilizados para o desenvolvimento de componentes com funções básicas de apresentar uma imagem, reduzindo o uso de recursos do sistema.


Por Felipe Ferreira da Silva

sexta-feira, 18 de janeiro de 2008

Queries com Parâmetros

Um recurso muito útil é a utilização de parâmetros em queries.
Com eles, é possível escrever uma query genérica e alterar apenas os valores desejados.

Exemplo: Uma query para pesquisar um cliente pelo código.
Sem usar parâmetros, precisaria duplicar a query várias vezes.


select nome from clientes where id = 1
select nome from clientes where id = 2
select nome from clientes where id = 3

Agora veja como fica melhor usando parâmetros:

select nome from clientes where id = :id

Os ':' (dois pontos) indicam que isso é o valor que será passado como parâmetro.

Com isso, podemos fazer uma consulta bem mais simples:

SQL = 'select nome from clientes where id = :id';

procedure
pesquisarCliente(id: integer);
begin
query.Close;
query.ParamByName('id').AsInteger := id;
query.Open;
end;

Canvas - O que é?

Boas pessoal, meu primeiro post no blog e resolvi fazer uma introdução sobre o que é e como utilizar o Objeto Canvas.
Apesar de ter varias citaçoes sobre canvas na internet, nao achei nenhuma que aborde de forma clara o que seja, em sua maioria, são código ja utilizando a propriedade (ou Objeto) para algum tipo de resultado gráfico.
Na verdade a classe TCanvas é um encapsulamento de controles graficos que possui propriedades e metodos que permitem desenhar linhas, graficos, textos, acessar caracteristicas de uma imagem, e acesso ao Windows GDI(Dispositivo de interface grafica), permitindo assim que aplicações possam exibir graficos e textos tanto na tela como na impressora.
Bom, e qual a aplicação real do Canvas?
Durante o desenvolvimento de um projeto qualquer, utilzamos os componentes padrões do IDE como Buttons, edits, toolbars, forms, etc, estes componentes ja tem uma aparencia padrão herdada do Sistema Operacional, e as vezes esta parencia é uma pouco desagradável qua fogem um pouco da interface da Aplicação.
Podemos utilizar entao a propriedade Canvas de alguns desses componentes ou entao instanciar o Objeto Tcanvas para desenhar uma nova aparencia para os controles, um exemplo disso são os componentes Skins.
Outra possibilidade e talvez uma das mais utilizadas é de se poder desenhar gráficos e textos nas areas dos componentes e até mesmo poder acessar suas caracteristicas.
Se utilizarmos a propriedade canvas do form por exemplo, poderemos desenhar linhas, formas(retangulos, circulos, etc), imagens na area do form, se for um TImage, o procedimento sera praticamente o mesmo.

Exemplos:

//Escrevendo um texto no form utilizando canvas:

F
orm1.canvas.TextOut(10,10,'Isto é um teste');

//Desenhando uma linha

form1.canvas.LineTo(10,50);

//Desenhar uma figura na área do form, que esteja em um TImage:

form1.canvas.StretchDraw(form1.ClientRect,image1.Picture.Graphic);

Podemos trabalhar com o canvas para varias finalidades que necessitem de gráficos desde desenhar uma figura em uma determinada área até plotagem de gráficos de funçoes matematicas.

Bom é isso, espero que este texto possa ser util para seu aprendizado.

Um abraço

NewZeek