segunda-feira, 22 de dezembro de 2008

Novo cargo

Mais uma conquista!

Recebi na semana passada (17/12) um convite para participar do grupo de moderadores na seção Delphi do fórum IMASTERS. A partir de agora, além de responder, estarei monitorando tópicos, encaminhando e editando quando necessário.

Irei procurar desempenhar a função com esforço e dedicação, auxiliando mais este canal de ajuda da comunidade Delphiana.

O fórum pode ser acessado diretamente clicando AQUI.

Sucesso a todos!

terça-feira, 16 de dezembro de 2008

Converter caracteres para maiúsculo

Navegando nas listas de discussão da Web, encontrei a seguinte dúvida de um programador:
-> Tenho um componente DBMemo, e na medida que vou digitando nele, quero que o texto vá aparecendo em maiúsculo, como fazer?

Bom, parece ser bem simples, usando UpperCase, onde poderíamos colocar no evento KeyPress o código:
procedure TForm1.DBMemo1KeyPress(Sender: TObject; var Key: Char);
begin
Key := UpCase(key);
end;

Bom, fazendo um teste e digitando "avião", aparece na tela escrito dessa forma: "AVIãO", e o ã, porque não foi convertido?
O ã é um caractere ANSI, e precisa ser tratado de uma forma um pouco diferente, como um caracter ANSI, e como converter?
Em uma nova codificação, basta que seja alterado o comando de transformação de UpCase para AnsiUpperCase, assim:
procedure TForm1.DBMemo2KeyPress(Sender: TObject; var Key: Char);
begin
Key := AnsiUpperCase(key)[1];
end;

O "[1]" no final significa que estamos copiando 1 caracter da String, ou seja, convertendo String para Char. Agora ao digitarmos novamente a mesma palavra, teremos "AVIÃO", onde todas as letras, acentuadas ou não, foram transformadas para maiúsculas. Até a próxima.

quarta-feira, 3 de dezembro de 2008

Criando uma Type Array Dinâmica em ASP.NET

Muitas vezes quando trabalhamos com funções precisamos retornar uma lista de resultados, e em muitos casos, não sabemos ao certo a quantidade de registros a serem retornados. Sendo na plataforma Win32 ou .NET teríamos várias formas de resolver o problema, algumas mais trabalhosas, é claro, mas poderíamos optar por um caminho simples também, criando uma matriz de forma dinâmica, ou seja, utilizando arrays.

Veremos um exemplo onde defino um novo Type, que por sua vez retornará um array do tipo String. Este Type usaremos na declaração das variáveis, bem como ao passar o Result à function.

Crie uma nova unit, e adicione a ela o seguinte código:

unit uArrayTest;

interface

type

MinhaArray = array of String;//Declaração do tipo

function PreencherArray : MinhaArray;//declara a function

implementation

function PreencherArray : MinhaArray;//implementa a function
var
I: Integer;
Lista : MinhaArray;//variável usando o type
begin
{Precisamos definir o comprimento do array, que pode ser de duas formas:
1 - Quando já sei o comprimento que deverá assumir
2 - Quando o comprimento do mesmo for desconecido
* Utilizaremos o segundo neste caso}
//** SetLength(Lista,10);{Quando eu sei o Length do Array}
for I := 0 to 10 -1 do
begin
SetLength(Lista,Length(Lista) + 1);{Quando não sei o Length do Array, adiciona de 1 em 1}
{Preenche valores de acordo com legth do array}
Lista[i] := 'Preenchendo valor na linha '+i.ToString+'<br>';
end;
SetLength(Result,Length(Lista));//Define comprimento do resultado
{escreve o resultado da função}
Result := Lista;

end;

end.

Ao final, após criada e implementada a função, crie uma nova página e adicione a ela um Button, inserindo o seguinte código no seu evento OnClick:

procedure TDefault.Button1_Click(sender: TObject; e: System.EventArgs);
var
I: Integer;
begin
{Exibe o comprimento do Array}
Response.Write(Convert.ToString(Length(PreencherArray))+' linhas no array<br>');
{Percorre registros e escreve informações na tela}
for I := 0 to Length(PreencherArray) - 1 do
Response.Write(PreencherArray[i]);
end;

Bom, através deste exemplo, você agora poderá implementar esta ferramenta aos seus códigos deixando as operações rápidas e customizadas de acordo com a necessidade de registros que deseja exibir. Abraço e até a próxima.

quinta-feira, 13 de novembro de 2008

Dicas de DBGrid - Final [Mostrando Imagens]

Mostrando Imagens no DBGrid

Muito útil também na analise das informações de um DBGrid, um recurso que este componente também possibilita é o uso de imagens em agregadas à colunas e valores do mesmo. Para configurar o recurso de imagens, adicione ao formulário um componente ImageList da paleta de componentes Win32 e com um duplo clique sobre o mesmo, utilize o botão “Add” para adicionar dois ícones que utilizaremos na representação de aprovado ou reprovado quanto a nota média obtida pelo aluno. Os ícones poderão normalmente ser encontrados nos diretório “C:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Images\Buttons”.

Após adicionados os ícones, vá até o evento DrawColumnCell do gdRegistros, onde criamos a pouco as linhas de código responsáveis por zebra o DBGrid. Os códigos de adição de imagens serão conciliados aos códigos já adicionados, onde o evento deverá ter o seguinte código exibido na Listagem 3.

Listagem 3. Utilizando imagens no DBGrid

procedure TfrmPrincipal.gdRegistrosDrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

var

bitmap : TBitmap;

fixRect : TRect;

bmpWidth : integer;

imgIndex : integer;

begin

//Deixa o DBGrid Zebrado

if not Odd (cdsRegistros.RecNo) then

if not (gdSelected in State) then

begin

gdRegistros.Canvas.Brush.Color := clSilver;

gdRegistros.Canvas.FillRect(Rect);

gdRegistros.DefaultDrawDataCell(Rect,Column.Field,State);

end;

//Incrementa as inagens no DBGrid

fixRect := Rect;

if Column.Field = cdsRegistrosNotaMedia then

begin

//Utilizaremos uma condiçao simulando a média de aprovação 8

if cdsRegistrosNotaMedia.Value >= 8 then

imgIndex := 0

else

imgIndex := 1;

//Criar em runtime um TBitmap

bitmap := TBitmap.Create;

try

//Selecionando a imagem...

ImageList1.GetBitmap(imgIndex,bitmap);

//Fixar as dimensões do bitmap

bmpWidth := (Rect.Bottom - Rect.Top);

fixRect.Right := Rect.Left + bmpWidth;

//Desenhar o bitmap (imagem)

gdRegistros.Canvas.StretchDraw(fixRect,bitmap);

finally

//Limpa o TBitmap

bitmap.Free;

end;

//Ajustar o espaço do Retângulo para a imagem

fixRect := Rect;

fixRect.Left := fixRect.Left + bmpWidth;

end;

//Desenhar o texto no Grid

gdRegistros.DefaultDrawColumnCell(fixRect,DataCol,Column,State);

end;

Ao executar agora nossa aplicação, observe que o Grid ficou organizado de uma forma bem diferente, onde todas as médias de alunas iguais ou acima de 8 foram agregadas a uma imagem e o restante dos resultados a um outro Bitmap representando que os mesmos foram reprovados (Figura 5).

Figura 5. Aparência do DBGrid após implementação do uso de imagens

Opções do DBGrid

Ao selecionar o DBGrid observe uma propriedade chamada Options, na qual poderemos ainda fazer uma série de configurações na aparência do DBGrid. Irei apresentar algumas das opções mais utilizadas:

- dgEditing: deixe esta opção habilitada com True. É responsável por permitir a edição e cadastro de registros diretamente no Grid, recurso que no caso desta aplicação está sendo utilizado por não termos uma tela especifica para cadastros e edições.

- dbTitles: recurso onde você poderá optar entre exibir ou ocultar a linha de apresentação dos títulos do DBGrid, deixe-a como True.

- dgIndicator: permite que você escolha em exibir ou não a seta de indicação na linha do Grid que está selecionada. Altere o recurso para False.

- dgColLines: nesta opção você poderá configurar se deseja exibir ou ocultar as linhas das colunas do DBGrid. Deixe habilitada como True esta função.

- dgRowLines: altere esta opção para False e observe que as linhas entre os registros do DBGrid não estarão mais sendo exibidas.

- dgMultiSelect: propriedade que permite a configuração de permitir que o usuário selecione mais de uma linha por vez no DBGrid. Altere a opção para True.

Após estas configurações execute sua aplicação novamente e verifique uma aparência diferenciada da qual obteve na execução anterior. A aparência do Grid será semelhante a imagem ilustrada na Figura 6.

Figura 6. DBGrid modificado através da propriedade Options

Conclusão

Vimos nestes post formas praticas e interessantes de trabalhar e customizar a aparência do componente DBGrid em suas aplicações. Estas dicas aqui mostradas foram poucas comparado com o grande número de situações e customizações possíveis ao componente, fica então o desafio de você mesmo descobrir novos recursos, como por exemplo implantação de campos Lookup em um DBGrid ou ainda em tempo de execução estar adicionando outros componentes em Runtime como por exemplo um CheckBox. Grande abraço e até a próxima.

quarta-feira, 12 de novembro de 2008

Dicas de DBGrid - Parte III [Zebrando colunas]

Zebrando o DBGrid

Um outro recurso também bastante interessante e útil para melhor visualização dos registros de um DBGrid é sua capacidade de estar organizando os registros de forma “zebrada”, que em casos de números muito grandes e de linhas extensas facilita muito a localização dos registros. Para implantar o recurso no Grid da nossa aplicação, selecione no evento DrawColumnCell e adicione o código da Listagem 2.

Listagem 2. Zebrando as linhas dos DBGrid

procedure TfrmPrincipal.gdRegistrosDrawColumnCell(Sender: TObject;

const Rect: TRect; DataCol: Integer; Column: TColumn;

State: TGridDrawState);

begin

if not Odd (cdsRegistros.RecNo) then

if not (gdSelected in State) then

begin

gdRegistros.Canvas.Brush.Color := clSilver;

gdRegistros.Canvas.FillRect(Rect);

gdRegistros.DefaultDrawDataCell(Rect,Column.Field,State);

end;

end;

Ao executar mais uma vez nossa aplicação, observe que agora todo Grid foi organizado de uma forma com suas linhas intercaladas por cores diferentes, separando assim os registros (Figura 4).
Figura 4. Aplicação com DBGrid “zebrado”.

terça-feira, 11 de novembro de 2008

Dicas de DBGrid - Parte II [Destacando coluna selecionada]

Destacando a coluna selecionada

Ao utilizarmos o recurso de ordenação de registros em um DBGrid, geralmente usa-se um destaque para diferenciar a coluna que esta selecionada, alterando-se a cor do titulo ou a fonte. O recurso também será implementado no evento OnTitleClick, em conjunto com o código de ordenação dos registros. Para usar o recurso, digite no evento o código da Listagem 1.

Listagem 1. Ordenação e destaque de coluna do Grid

procedure TfrmPrincipal.gdRegistrosTitleClick(Column: TColumn);

Var

i:Integer;

begin

Try

cdsRegistros.IndexFieldNames := Column.FieldName;//Ordenação dos registros do Grid

for i:=0 to Column.Grid.FieldCount - 1 do

begin

gdRegistros.Columns.Items[i].Title.Font.Color:=ClBlack;//Cor da Fonte

gdRegistros.COLUMNS.ITEMS[I].TITLE.FONT.STYLE := [];//Estilo da Fonte

gdRegistros.Columns.Items[i].Title.Color:=clBtnFace;//Cor do Fundo do Titulo Normal

Column.Title.Color :=clSilver;//Cor do Fundo do Titulo Selecionado

COLUMN.TITLE.FONT.STYLE := [FSBOLD];//Estilo NEGRITO da coluna selecionada

Column.Title.Font.Color:=ClBlue;//Cor da fonte Selecionada

Column.Font.color:=clTeal;//Cor dos registros na coluna selecionada

gdRegistros.Columns.Items[i].Font.color:=ClBlack;//Cor dos registros nas colunas normais

end;

Except

ShowMessage('Ordenação não pode ser aplicada!');

End;

end;

Ao executar a aplicação e utilizar o recurso da ordenação veja as diferentes características assumidas pela coluna ordenada (Figura 3).

Figura 3. Seleção e ordenação dos registros no Grid

segunda-feira, 10 de novembro de 2008

Dicas de DBGrid - Parte I [Configurando e ordenando registros]

Considerado um dos componentes mais populares presentes na VCL do Delphi o DBGrid é um componente que é utilizado nas mais diversas situações em aplicações Delphi Win32, sua riqueza de propriedades permite ao programador que o utilize das mais variadas formas e maneiras, possibilitando ao usuário aplicações com layouts de boa aparência e fácil integração com a visualização, inclusão ou manutenção dos registros de uma base de dados.

Sua compatibilidade de conexão de componentes com os presentes na VCL do Delphi é muito grande, sendo possível seu uso com os mais diferentes tipos de acessos e formatos de arquivos de dados.

Neste artigo veremos algumas dicas praticas que irão ajudar muito na hora do desenvolvimento do seu sistema quanto ao uso do DBGrid, faremos uma total personalização dos registros que serão apresentados no DBGrid, adotaremos um método de ordenação de dados além da exibição dos registros em grid “zebrado”. Antes da finalização do artigo, veja também uma dica interessante de como utilizar imagens no DBGrid, configurando-as em tempo de execução a partir de informações obtidas da conexão com a base de dados Employee.fdb, a qual acompanha a instalação do Firebird.

Criando aplicação

Neste artigo utilizarei o Delphi 7 para criação da aplicação e demonstração dos exemplos e dicas de DBGrid, mas fique livre para utilizar outra versão do Delphi para criação do projeto na plataforma Win32.

Crie uma nova aplicação através do menu File|New>Application. Altere a propriedade Name do formulário inicial para “frmPrincipal” e a propriedade Caption para “Dicas DBGrid”. Salve a Unit principal do projeto como “uPrincipal.pas” e o projeto salve como “prjDBGrid.dpr”.

Para melhor demonstrar algumas funcionalidade do DBGrid, criaremos através de um ClientDataSet nossa própria estrutura de dados, salvando as informações do mesmo em um arquivo XML. Adicione ao formulário principal um novo componente ClientDataSet (“cdsRegistros”) da paleta de componentes DataAcces e com um duplo clique sobre o mesmo abra o Fields Editor onde criaremos os campos da nossa base. Utilizando um clique de botão direito do mouse no espaço do Fields Editor selecione a opção New Field criando a seguinte estrutura de componentes:

Name | Type | Size |

----------------------------------
Codigo | AutoInc | |
----------------------------------
Aluno | String | 50 |
----------------------------------
DataNasc | Date | |
----------------------------------
NotaMedia | Integer | |

Tabela 1. Estrutura de dados do ClientDataSet

Após criada esta estrutura no Fields Editor, utilize o botão direito do mouse sobre o cdsRegistros e escolha a opção Create DataSet que fará a criação de uma base de dados em memória. Para salvar os registros do ClientDataSet em uma base XML, utilize novamente o botão direito do mouse sobre o componente selecionando a opção Save to MyBase Xml table (Figura 1), onde você devera mapear o mesmo diretório onde está salvando os fontes do sistema e informar ao nome do arquivo XML que está sendo solicitado o valor “dados.xml”. Ainda nas propriedades do cdsRegistro, localize agora através de sua propriedade FileName o arquivo dados.xml que acabamos de criar, o qual será localizado em tempo de execução e fará com que os registros salvos sejam carregados.

Figura 1. Salvando base de dados em arquivo XML.

Para visualização e cadastro dos registros precisamos ainda adicionar ao formulário um componente DataSource (“dsRegistros”) da paleta DataAcces e também um componente DBGrid (“gdRegistros”) da paleta DataControls. No dsRegistros relacione sua propriedade DataSet ao cdsRegistros e no gdRegistros atribua a propriedade DataSource relacionada ao componente dsRegistros, onde já deverão ser listados no Grid as colunas que criamos no cdsRegistros.

Configurando as colunas do Grid

Uma característica bastante interessante do DBGrid já é a sua capacidade de configuração e Layout das colunas de dados, onde poderá ser aplicado um estilo diferente para cada situação e descrição da coluna. Essa atividade também poderia ser realizada diretamente no cdsRegistros alterando a propriedade DisplayLabel de cada campo no Fields Editor, mas faremos a customização dos nomes dos campos na própria estrutura do Grid.

Com um clique duplo sobre o gdRegistros, selecione na nova caixa de diálogos que está aparecendo o ícone Add All Fields que irá exibir todas as colunas que criamos na base (Figura 2). Selecione de forma individual o primeiro Field, observando no Object Inspector do Delphi a quantidade de propriedades e situações onde poderemos estar configurando a aparência da coluna no noss gdRegistros. Na propriedade Alignment do Field selecione a opção taCenter, que irá centralizar os valores na coluna. Altere a propriedade Title>Alignment também para taCenter que fará com que o titulo da coluna também fique centralizado, além de alterar ainda o Caption para “Código”. Observe que as alterações já tomaram formas no gdRegistros do formulário. Faça a configuração das demais colunas do gdRegistros, observando apenas uma propriedade muito interessante que iremos configurar para o Field “NotaMedia”. Com o Field selecionado, abra o editor da propriedade PickList onde em linhas individuais digite os números partindo de 0 até o numero 10.

A configuração da propriedade PickList será a responsável em tempo de execução quando clicamos sobre o item “NotaMedia” no Grid de abrir uma lista de registros pré-configurados para serem utilizados no cadastro. É uma característica muito importante e bastante utilizadas em cadastros de pessoas, onde informa-se siglas de estados, sexo, entre outras situações.

Figura 2. Editando colunas do DBGrid

Executando sua aplicação pela primeira vez, carregue o Grid com cerca de dez registros com as informações de diferentes alunos, informando o nome, data de nascimento e notas médias variadas para cada aluno. A coluna código não necessita de ser preenchida, uma vez que definimos seu DataType como sendo AutoInc. Após o cadastro dos cerca de dez registros, perceba que você poderá fechar sua aplicação e ao abri-la novamente todos os registros cadastrados serão carregados novamente, comprovando que a estrutura foi salva na base XLM criada.

Ordenando registros no DBGrid

Muito interessante também o recurso da ordenação de registros por meio do Click sobre uma coluna do Grid pela qual o usuário deseja que os registros sejam ordenados. Para implementar a funcionalidade, adicione ao evento OnTitleClick do gdRegistros a seguinte linha de códigos:

cdsRegistros.IndexFieldNames := Column.FieldName;

O código será responsável por alterar o campo de criação do índice do ClientDataSet, em Runtime a cada clique do mouse sobre o titulo de alguma coluna com valores exatos (Campos do tipo Blob ou Memo não poderão ser ordenados) fará com que os registros da mesma sejam organizados de forma ordenada.

Por hoje seria isto, até a próxima.

Substituindo Strings em Delphi for Win32

Estou trabalhando com Delphi for Win32 e preciso substituir caracteres de uma String, como posso resolver?

Fácil, não há necessidade de nenhuma rotina de repetição como for ou while para percorrer todos os caracteres do texto verificando se é igual ao caracter que deverá ser substituído. Da mesma forma que há o "ToString.Replace" do ASP.NET temos o StringReplace no Win32.

Declare a uses SysUtils e logo após implmente o comando da seguinte forma:

StringReplace(String,Antigo,Novo,Flags) ;

Ex.: StringReplace('Substituido Strings com Delphi Win32','s','Ass',[rfReplaceAll,rfIgnoreCase]);
rfReplaceAll: realiza a substituição de todos os caracteres encontrados
rfIgnoreCase: ingora diferenças entre maiúsculas e minúsculas.


Por hoje fica ai a dica... abraço e até a próxima.

quinta-feira, 16 de outubro de 2008

Customizando tamanho de upload de arquivos em páginas asp.net

Em algumas das situações de desenvolvimento, faz-se necessário que rotinas de upload de arquivos para o servidor sejam configuradas. Há porém situações de upload que podem variar desde carregar uma foto, arquivo de texto até o upload de softwares, executáveis e arquivos compactados, de diferentes tamanhos.

Provavelmente quem já tenha utilizado esta rotina de upload já possa ter sido barrado pelo tamanho de limite do Framework (2.0) que fica em uma margem aproximada do tamanho máximo de 5 MB, de acordo com configurações default da instalação. Mas se a idéia for realizar um upload de software, por exemplo, que poderá chegar a 30 MB, como poderíamos fazer?

A solução para este problema é bem simples, trata-se nada mais do que uma configuração a ser realizada no arquivo Web.Config da aplicação, reescrevendo assim as limitações originais do Framework. No Web.Config, logo após o final da implementação da tag </system.net>, crie uma nova implementação chamada de location. Neste bloco, definiremos para qual página vamos reescrever as configurações do tamanho de upload, adicionando o seguinte trecho:


<location path="upload_page.aspx">
<system.web>
<httpRuntime maxRequestLength="20480" />
</system.web>
</location>


Observe que junto a tag location atribuímos um path, que se trata o nome para a página que iremos reescrever o limite de tamanho, e logo em seguida, na propriedade maxRequestLength, definimos em KB o tamanho permitido, no caso, 20 MB = (20 x 1024 Kb), chegando ao valor de 20480 que será configurado.

Ao executar a aplicação, o novo limite já poderá ser utilizado, lembrando que será valido apenas para a página configurada. No caso de reescrever para mais páginas, reescreva o bloco na quantidade de vezes que for necessário, um abaixo o outro. Em breve, farei um post apresentando alguns cuidados no momento de fazer upload de arquivos e a rotina de códigos necessários. Até a próxima.

quarta-feira, 15 de outubro de 2008

Utilizando javascript para manipular a visibilidade de painéis de pesquisa

Quem já não sentiu a necessidade de exibir ou ocultar painéis de pesquisa em uma aplicação asp.net? Uma solução interessante seria a utilização da propriedade Visible, definindo-a como True ou False de acordo com a necessidade, mas com desvantagens, pode ser apenas aplicado a componentes da VCL (runatserver) e é muito demorado, pelo fato que toda vez que uma manipulação necessita ser feita, toda a página é recarregada.

Uma das soluções para otimizar a situação é a utilização de blocos javascript integrados com os componentes da aplicação Delphi for asp.net. No RAD 2007 vamos criar uma nova asp.net application e simular um formulário de pesquisa, com possibilidade de filtrar por um período de dados, filtro este que se tornará visível a partir da seleção de um componente CheckBox.

Adicione ao formulário um componente CheckBox(ckFiltrar) da paleta Web Controls, da paleta HTML Elements arraste um componente HTML Flow Panel (Painel) que na verdade trata-se de uma div HTML e dentro da mesma adicione os textos “Data Inicial:” e “Data Final” seguido de dois componentes TextBox. Por último, logo abaixo a div, adicione um componente Button que irá simular a aplicação do filtro.

Iniciando pela criação dos blocos de javascript, vá até a página de código aspx e posicionando-se no head da página, adicione as seguintes funções javascript:

<head runat="server">
<title></title>
<script>
function FecharFiltro()
{
document.getElementById("Painel").style.

visibility="hidden";
}
function Filtro()
{
if (document.getElementById("ckFiltrar").

checked == true)
{
document.getElementById("Painel").style.

visibility="visible";
}
if (document.getElementById("ckFiltrar").

checked == false)
{
document.getElementById("Painel").style.

visibility="hidden";
}
}
</script>
</head>


Estas funções são responsáveis por manipular a visibilidade do painel de pesquisa, seja no momento em que a página for carregada ou seja na seleção do componente ckFiltrar onde utilizamos o if para verificar se o mesmo está marcado ou não.

Por último, precisamos vincular o código a página e ao componente ckFiltrar, vinculo este que será realizado no evento Load da página. Acessando o evento, digite as seguintes linhas de código:

ClientScript.RegisterStartupScript(GetType,

'OnLoad','<script>javascript:

FecharFiltro();</script>');
ckFiltrar.Attributes.Add('onClick',

'javascript:Filtro();');

Neste código, na primeira linha definimos que toda vez que a página for recarregada, a função javascript “FecharFiltro” será executada, ocultando o painel de pesquisa. Na segunda linha, atribuímos ao evento onClick do ckFiltrar a função “Filtro”, que fará a manipulação de visibilidade do painel de pesquisa.

Executando a aplicação, ao marcar e desmarcar o componente observe que o painel será exibido ou ocultado de acordo com a opção. Se estiver marcado, o painel estará visível.

Dessa mesma forma, poderá implementar mais funcionalidades em outros componentes utilizando javascript ou criar novos blocos de códigos. Até a próxima.

terça-feira, 14 de outubro de 2008

Erro com Blackfish no RAD 2007 for asp.net

Ao criar uma nova aplicação no RAD Studio 2007 for asp.net, logo na primeira compilação e debug do projeto, geralmente uma tela de erro nos é apresentada. Ao ler algumas das linhas da mensagem de erro, é possível contatar que há problemas nas configurações do arquivo Web.config do projeto, e que o problema está relacionado ao banco de dados da CodeGear, o Blackfish. O erro é apresentado conforme tela a seguir, relacionado ao nome da sua aplicação, veja:


A solução do problema, no entanto é bem simples, vá até o arquivo Web.config, e quase ao seu final localize o seguinte trecho:

<roleManager enabled="true" defaultProvider="AspNetAdoRoleProvider">
<providers>
<remove name="AspNetAdoRoleProvider"/>
<add name="AspNetAdoRoleProvider" type="Borland.Web.Security.AdoRoleProvider, Borland.Web.Provider, Version=11.0.5000.0, Culture=neutral, PublicKeyToken=91d62ebb5b0d1b1b"
connectionStringName="BlackfishSQLAspNet"
applicationName="/"/>
</providers>
</roleManager>


Observe que logo na primeira linha há uma opção de habilitar ou desabilitar o provider de conexão para o banco de dados, que por default está como True, e altere o mesmo para False, deixando o trecho da seguinte forma:


<roleManager enabled="false" defaultProvider="AspNetAdoRoleProvider">
<providers>
[…]
</roleManager>


Salve as alterações realizadas e faça um novo debug da sua aplicação, que irá agora ser normalmente executado no browser. Bom, fica ai a dica para quem procura resolver o problema. Abraço e até a próxima.

segunda-feira, 13 de outubro de 2008

Criando um relógio em asp.net utilizando recursos AJAX

Geralmente quando se falava em colocar um relógio na página, pensamos imediatamente em procurar algum javascript específico que desempenhe a função, ou algum script de Flash que necessita ser importado na página, porém, isso pode ser deixado de lado tratando-se em desenvolvimento Delphi for asp.net com RAD 2007, onde temos disponíveis a utilização de recursos AJAX, nativos da ferramenta.

No RAD 2007, crie uma nova aplicação ASP.NET Web Application for asp.net, nomeando-a como “AjaxTimer”.

Adicione ao corpo da página da paleta AJAX Extensions os componentes ScriptManager e um componente UpdatePanel. Estes componentes fazem com que apenas o espaço utilizado pelo UpdatePanel seja recarregado ao sofrer um solicitação no browser, e o restante da página ficará estático, não sofrendo alterações. Adicione dentro do UpdatePanel um componente Label (“lblTimer”) onde será exibido o horário atualizado de segundo em segundo e adicione também à ele um componente Timer, também da paleta AJAX Extensions, finalizando desta forma a definição gráfica do ambiente da página.


O processo de codificação também se dá de forma bastante simples, selecionando o componente Timer, primeiramente defina sua propriedade Interval para o tempo de 1000 milissegundos, da mesma forma como em aplicações Win32 utilizando este componente e em seguida, adicione ao seu evento Tick a seguinte linha de código:

lblTimer.Text := DateTime.Now.ToString('HH:mm:ss');

O código fará com que a hora atual do sistema seja capturada e formatada conforme máscara de horário aplicada. O tempo (de 1 em 1 segundo) será definido pela propriedade Interval do Timer que acabamos de configurar.

Prevenção de Problemas: caso execute sua aplicação e o relógio não ser exibido, acusando erro de javascript na página, verifique no seu web.config a existência da seguinte declaração no corpo da tag .

<httpModules>

  <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>

  </httpModules>

Faça a formatação necessária no componente Label, ou importe imagens dentre outros controles visuais que deseja exibir, executando em seguida sua aplicação, que trará a hora atual do sistema sendo atualizada a cada segundo.


Bom, para esta dica seria isto, faça a implementação e aperfeiçoamento do recurso em sua página. Até a próxima.

quarta-feira, 6 de agosto de 2008

Dicas para facilitar a interratividade com o Delphi

ASP.NET
Sabe aquele código na página do aspx que está sempre uma bagunça? É uma série de linhas em branco, tags da caracteres desalinhados, tags sobrando, ao trabalhar no design da página tudo vira uma desorganização total. Mas, espere ai, nem tudo está perdido, o Delphi possui uma ferramenta que corrige e organiza toda essa bagunça. Posicionado na página do .aspx, clique no menu Edit>Format Document fazendo com que todos os alinhamentos, espaçamentos sejam organizados de forma correta.
* Uma dica interessante também é a validação do aspx de acordo com normas estabelecidas pela W3C, onde no menu Edit>HTML Tidy>Check Document for Erros que irá retornar na paleta de mensagens todas as falhas encontradas.

WIN32
Dúvido que vocês nunca não tenham movido de forma acidental algum componente do Form. Principalmente aos que usam notebook, é muito comum ocorrer de você selecionar um componente para atribuir algum evento ou alterar alguma propriedade do mesmo e acabar arrastando ele, desalinhando-o dos demais componentes. Este pequeno e irritante problema pode ser contornado utilizando o menu Edit>Lock Controls que irá simplesmente travar os componentes na posição atual, podendo clicar a vontade e não conseguirá arrastá-los. Para desbloquear os componentes, basta utilizar o mesmo menu.

sexta-feira, 18 de janeiro de 2008

Bem vindo ao meu Blog

Boas Vindas!

Sinta-se a vontade para navegar pelo meu blog, explorar conteúdos e com certeza aprender muita coisa nova.
Acompanhe constantes atualizações relacionadas a área de Tecnologia de Informações, Análise e Desenvolvimento de Software. Veja exemplos de dicas e downloads sobre tudo o que rola e é possível para a linguagem Delphi.
Faça os comentários dos posts e ajude com o crescimento do blog.

Agradeço por sua visita.