function TForm1.TamanhoArquivo(Arquivo: string): Integer;
begin
with TFileStream.Create(Arquivo, fmOpenRead or fmShareExclusive) do
try
Result := Size;{resultado em bytes}
finally
Free;
end;
end;
Agora para mostrar um resultado, você pode adicionar à tela um componente OpenDialog e um Button, adicionando ao evento OnClick do button o seguinte código:
if OpenDialog1.Execute then
begin
ShowMessage('Tamanho do arquivo é '+FloatToStr(TamanhoArquivo(OpenDialog1.FileName)/1024));
end;
Agora simples, implemente a função nas suas rotinas de programação, deixando seus sistemas mais funcionais. Por ora seria isto, até a próxima.
Blog com atividades voltadas ao ambiente de desenvolvimento utilizando a ferramenta de linguagem Delphi. Ao visitar o blog, encontrará dicas úteis para seu dia-a-dia atualizadas diariamente.
quarta-feira, 21 de janeiro de 2009
Obtendo tamanho de arquivos
Destacando palavras no RichEdit
De início, crie um novo projeto Windows Forms (Win32) no Delphi, em seguida, adicione os seguintes componentes: Edit (Edit1), ColorBox (ColorBox1) da paleta additional,um Button (Button1) e um RichEdit (RichEdit1) da paleta Win32.
Agora, no código, no corpo da unit, crie um novo tipo (nova declaração de tipo), adicionando as seguintes linhas logo após a linha "type":TRPalavras = Record
DS_PALAVRA: String;
VR_COR : TColor;
ESTILO : TFontStyles;
end;
TAPalavras = array of TRPalavras;
APalavras : array of TRPalavras;
Esta varável irá descender do tipo TRPalavras criado anteriormente.Acessando agora o evento OnClick do botão, adicione o código a seguir, o qual será responsável por armazenar no array quais as palavras e respectivas cores que devem ser destacadas no texto a ser digitado no componente RichEdit.
{ Adicionando as palavras a lista }
SetLength( APalavras, Length( APalavras )+1 );
APalavras[ High( APalavras ) ].DS_PALAVRA := Edit1.Text;
APalavras[ High( APalavras ) ].VR_COR := ColorBox1.Selected;
APalavras[ High( APalavras ) ].ESTILO := [fsBold];
procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
const
LetrasValidas = ['a'..'z', 'A'..'Z', '0'..'9', '<', '>', '!', '='];
var
iPosIni: Integer;
iPosFim: Integer;
iSelStart: Integer;
iSelLength: Integer;
iLoopFor: Integer;
sText: String;
begin
LockWindowUpdate(RichEdit1.Handle);
{ guardaremos a posição inicial }
iSelStart := RichEdit1.SelStart;
iSelLength := RichEdit1.SelLength;
sText := RichEdit1.Text;
{ Acharemos o inicio da palavra }
iPosIni := iSelStart;
if sText[ iPosIni ] in LetrasValidas then
begin
for iLoopFor := iSelStart-1 downto 0 do
begin
if sText[ iLoopFor ] in LetrasValidas then
iPosIni := iLoopFor
else
Break;
end;
end;
{ Acharemos o final da palavra }
iPosFim := iSelStart;
for iLoopFor := iSelStart+1 to Length( RichEdit1.Text ) do
begin
if RichEdit1.Text[ iLoopFor ] in LetrasValidas then
iPosFim := iLoopFor
else
Break;
end;
{ Selecionaremos a palavra }
RichEdit1.SelStart := iPosIni-1;
RichEdit1.SelLength := (iPosFim)-RichEdit1.SelStart;
{ setaremos a cor original e estilo original }
RichEdit1.SelAttributes.Color := clBlack;
RichEdit1.SelAttributes.Style := [];
{ Atribuiremos a nova cor e estilo caso encontre a palavra }
for iLoopFor := 0 to High( APalavras ) do
begin
if UpperCase(APalavras[ iLoopFor ].DS_PALAVRA) = UpperCase(RichEdit1.SelText) then
begin
RichEdit1.SelAttributes.Color := APalavras[ iLoopFor ].VR_COR;
RichEdit1.SelAttributes.Style := APalavras[ iLoopFor ].ESTILO;
Break;
end;
end;
{ Posicionaremos o cursor na posição original }
RichEdit1.SelStart := iSelStart;
RichEdit1.SelLength := iSelLength;
LockWindowUpdate(0);
end;
Assim, faça a implementação em seus sistemas, boa leitura e até a próxima.
Obs.: Deixe um comentário com seu nome / e-mail para receber os fontes.
segunda-feira, 22 de dezembro de 2008
Novo cargo
terça-feira, 16 de dezembro de 2008
Converter caracteres para maiúsculo
-> 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
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]
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]
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
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]
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
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).segunda-feira, 10 de novembro de 2008
Dicas de DBGrid - Parte I [Configurando e ordenando registros]
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 | |
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:
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
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.

