TStringAlignGrid: Uma Alternativa Para o TStringGrid

Documentos relacionados
Criando uma agenda com o Lazarus

OBJETOS : Timer1 e RadioGroup

Escrito por Adriano Neres Rodrigues Qua, 30 de Dezembro de :00 - Última atualização Qua, 30 de Dezembro de :01

LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho DESPERTADOR

LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho

Microsoft Word 2010 NORMA ABNT para Trabalhos Acadêmicos Conceitos Básicos

LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho CONTADOR

LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho

QBalança Biblioteca de comunicação com balanças

Relé. PdP. Autor: Tiago Lone Nível: Básico Criação: 12/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

DEPURAÇÃO DESVENDADA

Linguagem de Programação II. Introdução à programação em VB Professor: Armando Hage

O AMBIENTE DE PROGRAMAÇÃO VISUAL -PLANO DE ENSINO. Prof. Angelo Augusto Frozza, M.Sc.

Linguagem de Programação I. Formulários

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string

LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho BROWSER

Fortes Report Parte 1 Desenvolvendo o Primeiro Relatório

Projeto Supermercado - Produtos

Delphi 7 Aula 03 Progressão Geométrica

VBA USANDO TABELA DO WORD COMO BANDO DE DADOS

LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho ÁLBUM DE IMAGENS

User Manager 1.0. edtusuario Nome do novo Usuário a ser criado edtsenha Senha do novo usuário Label

Interface. Movimentação na planilha

Computação II MAB EPT/EP1. Interface Gráfica - Tkinter. Brunno Goldstein.

Programando Jogos em Delphi Animação, Lógica e Controle versão orientada à objetos

Introdução a Javascript

FastCube 2.0 Programmer Manual

Recursos Complementares (Tabelas e Formulários)

Linguagem de Programação II Professor: Luiz Claudio Ferreira de Souza Assunto: Linguagem Pascal (Ambiente Lazarus) com Banco de Dados

LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho MULTIMÍDIA

Delphi IDE. Jocélio Passos Delphi - IDE. Integrad Development Enviroment Ambiente de Desenvolvimento Integrado

Fundamentos Programação

Passa a passo para construir uma página pessoal - Parte 1

Sumário PRIMEIRO PROGRAMA 14 ADAPTAR AS PROPRIEDADES DOS OBJETOS 16 SALVAR 25 SALVANDO O PRIMEIRO PROGRAMA 26

ANEXO I CALENDÁRIO ACADÊMICO PARA O ANO LETIVO DE 2018 DA GRADUAÇÃO E PÓS-GRADUAÇÃO DA UNIVERSIDADE FEDERAL DA FRONTEIRA SUL

Como criar menus para as suas planilhas

Uma vez no form, dê um clique duplo sobre o objeto e insira a tela conforme abaixo. Não esqueça do & e das teclas de atalho.

Bootstrap: Uma solução rápida para sites web

ETEC DR. EMÍLIO HENRNANDEZ AGUILAR PROGRAMAÇÃO DE COMPUTADORES II PROFESSOR RAFAEL BARRETO DELPHI FORMULÁRIO COM ABAS E BUSCAS DE REGISTROS

Linguagem de programação: Pascal

Bertolo Por que Laços no VBA?

CALENDÁRIO ACADÊMICO 2019 GAROPABA Aprovado pel pelo COLEGIADO DO CAMPUS RESOLUÇÃO Nº 01 DE 04 DE JANEIRO DE 2019.

Estrutura de Dados Polinómio

CALENDÁRIO ACADÊMICO ARARANGUÁ 2018 Aprovado pela RESOLUÇÃO do CODIR Nº XX, DE XX DE XXXXX DE 2017.

CRIANDO UM SCREEN SAVER (Protetor de tela)

Windows Forms Applications - Introdução. Prof. Robinson Alves IFRN

RESOLUÇÃO N o 304 de 11/12/2017- CAS

Inserção de Dados no banco de Dados através dos componentes Combobox, Radio e Checkbox

CALENDÁRIO ACADÊMICO UNIFICADO CAÇADOR Aprovado pela RESOLUÇÃO do COLEGIADO DO CAMPUS Nº 16, DE 27 DE SETEMBRO DE 2018

Produção de tutoriais. Suellem Oliveira

5. NOÇÕES DE PROGRAMAÇÃO

AnsiLowerCase Converte todos os caracteres de uma string para minúsculo; Sintaxe: AnsiLowerCase(const S: string): string;

Aula 01 Microsoft Excel 2016

Delphi. Criando Ajuda Online. Criando Ajuda Online. Criando Ajuda Online. Jocélio Passos Criando Ajuda Online

WORD 2010 PARA INICIANTES

Aula 2 - Barra de Rolagem, botões de rádio, CheckBox, Memo e Main Menu

CURSO BÁSICO DE CRIAÇÃO DE SITES MÓDULO 2 AULA 5

Selecione o menu FILE NEW PROJECT como apresentado a seguir:

Transcrição:

TStringAlignGrid: Uma Alternativa Para o TStringGrid Há muito tempo eu tive dificuldades em fazer um grid sem que o mesmo estivesse vinculado a um Dataset. Obviamente para isto existe o componente TStringGrid. Porém este é muito limitado. Por exemplo: Tente colocar o texto uma de suas células centralizado, ou mesmo numa fonte diferente das demais células, ou ainda trocar a cor de fundo de apenas uma das células. Eu não vi como fazer isto! Procurando por um componente que me atendesse achei o TStringAlignGrid. Foi desenvolvido pelo Andreas Hoerstemeier (da Alemanha, eu acho). Este componente é uma derivação do TStringGrid com todos os recursos que eu precisei e muitos outros. Vejamos as principais propriedades e qualquer um pode notar suas notórias vantagens: HintCell[Coluna, Linha] (String) ShowCellHints Alignment AlignCell[Coluna, Linha] AlignCol[Coluna] AlignRow[Linha] Editing EditCell[Coluna, Linha] EditCol[Coluna] EditRow[Linha] ColorCell[Coluna, Linha] (TColor) ColorCol[Coluna] (TColor) ColorRow[Coluna] (TColor) CellFont[Coluna, Linha] (TFont) ColFont[Coluna] (TFont) RowFont[Coluna] (TFont) É um hint específico para uma determinada célula. Ou seja, quando o ponteiro do mouse estiver sobre a célula especificada, o texto deste hint vai aparecer. Com esta propriedade ligada (TRUE), o hint das células serão mostrados. Semelhante à propriedade ShowHint (que também deve estar ligada para que o hint das células sejam mostrados). Alinhamento global do texto de todas as células do grid. Se todas as células têm o mesmo alinhamento, basta setar esta propriedade. Alinhamento individual de uma célula em específico. Alinhamento global de todas as células de uma determinada coluna. Alinhamento global de todas as células de uma determinada linha. Informa se o texto das células do grid poderá sofrer alterações em tempo de execução. Efeito global, ou seja, em todas as células do grid. Informa se o texto de uma célula em específico poderá sofrer alterações em tempo de execução. Informa se o texto de todas as células de uma coluna poderá sofrer alterações em tempo de execução. Informa se o texto de todas as células de uma linha poderá sofrer alterações em tempo de execução. Informa a cor de fundo de uma determinada célula. Informa a cor de fundo de todas as células de uma determinada coluna. Informa a cor de fundo de todas as células de uma determinada linha. Informa a fonte do texto de uma determinada célula. Como esta propriedade é do tipo TFont, pode-se informar o nome da fonte, o tamanho, o estilo, a cor, etc. Exemplo: Arial, tamanho 12, cor vermelho, negrito. Informa a fonte do texto de todas as células de uma determinada coluna. Informa a fonte do texto de todas as células de uma determinada linha.

É óbvio que não colocamos aqui todas as propriedades nem todas as características deste componente. Mas apenas algumas propriedades que não encontrei no TStringGrid e que são muito úteis. Existem outras propriedades igualmente interessantes, métodos e eventos que devem ser observados quando formos utilizar o componente. Colocamos aqui um exemplo de um calendário feito utilizando o componente TStringAlignGrid. O formulário principal (e único) ficou assim: Formulário Label StringAlignGrid BorderStyle BsSingle Caption Calendário Height 252 Frm_Calend Position PoScreenCenter Width 312 Alignment tacenter AutoSize False Left 8 Lbl_Mes Width 289 Alignment tacenter ColCount 7 DefaultColWidth 40 DefaultRowHeight 20 Editable False FixedCols 0 FixedRows 1 Left 8 Grid RowCount 7 ScrollBars ssnone ShowCellHints True ShowHint True Top 32 Width 291

TButton TButton Caption Mês &Anterior Left 8 Btn_MesAnt Top 192 Width 97 Caption &Próximo Mês Left 200 Btn_ProxMes Top 192 Width 97 Com o formulário criado e os componentes devidamente configurados (conforme especificações acima), vamos adicionar funcionalidades ao nosso calendário. Primeiramente devemos criar uma procedure para limpar o grid. A procedure é a seguinte: procedure TFrm_Calend.ResetGrid; var Lin, Col: Integer; Limpa todo o conteúdo do Grid (apenas da segunda linha para baixo) Colocando as cores, estilo de texto e hints zerados. for Lin := 1 to 6 do for Col := 0 to 6 do Grid.Cells[Col,Lin] := ''; Grid.CellFont[Col, Lin].Style := [ ]; Grid.CellFont[Col, Lin].Color := clwindowtext; Grid.ColorCell[Col, Lin] := clwindow; Grid.HintCell[Col, Lin] := ''; Agora uma outra procedure para montar o grid em um determinado mês: procedure TFrm_Calend.MontaGrid(Data: TDateTime); var DatFim: TDateTime; Dia, Mes, Ano, DiaFim: Word; Lin, Ind, DiaSem, DiaOld: Integer;

DatFer: array[0..7] of String; HntFer: array[0..7] of String; Reseta o grid ResetGrid; Feriados fixos Devem ter outros, mas não me lembrei... DatFer[1] := '01/01'; DatFer[2] := '01/05'; DatFer[3] := '07/09'; DatFer[4] := '12/10'; DatFer[5] := '02/11'; DatFer[6] := '15/11'; DatFer[7] := '25/12'; Descrição dos feriados HntFer[1] := 'Confraternização Universal'; HntFer[2] := 'Dia do Trabalho'; HntFer[3] := 'Dia da Independência'; HntFer[4] := 'Feriado Religioso'; HntFer[5] := 'Dia de Finados'; HntFer[6] := 'Proclamação da República'; HntFer[7] := 'Natal'; Coloca a primeira linha com a fonte em Negrito Grid.FixedRowFont[0].Style := [ fsbold ]; Seta o texto da primeira linha (cabeçalho) Grid.Cells[0,0] := 'DOM'; Grid.Cells[1,0] := 'SEG'; Grid.Cells[2,0] := 'TER'; Grid.Cells[3,0] := 'QUA'; Grid.Cells[4,0] := 'QUI'; Grid.Cells[5,0] := 'SEX'; Grid.Cells[6,0] := 'SAB'; Obtém o mês para setar o label no alto do calendário DecodeDate(Data, Ano, Mes, Dia); case Mes of 01: Lbl_Mes.Caption := 'Janeiro - '+IntToStr(Ano); 02: Lbl_Mes.Caption := 'Fevereiro - '+IntToStr(Ano); 03: Lbl_Mes.Caption := 'Março - '+IntToStr(Ano); 04: Lbl_Mes.Caption := 'Abril - '+IntToStr(Ano); 05: Lbl_Mes.Caption := 'Maio - '+IntToStr(Ano); 06: Lbl_Mes.Caption := 'Junho - '+IntToStr(Ano); 07: Lbl_Mes.Caption := 'Julho - '+IntToStr(Ano); 08: Lbl_Mes.Caption := 'Agosto - '+IntToStr(Ano); 09: Lbl_Mes.Caption := 'Setembro - '+IntToStr(Ano); 10: Lbl_Mes.Caption := 'Outubro - '+IntToStr(Ano); 11: Lbl_Mes.Caption := 'Novembro - '+IntToStr(Ano); 12: Lbl_Mes.Caption := 'Dezembro - '+IntToStr(Ano);

Obtém o último dia do mês, isto é feito assim: - Se o mês for 12 (dezembro). Mês é igual a 1 e incrementa o ano. Senão incrementa o mês. - Transformo para data, levando em consideração que o dia é sempre 1 e o mês/ano será o calculado no passo anterior - Subtraio 1 da data encontrada no passo anterior. Teremos a última data do mês. - Extraio o dia da data encontrada no passo anterior. if Mes = 12 then Mes := 1; Inc(Ano); end else Inc(Mes); DatFim := EncodeDate(Ano, Mes, 1); DatFim := DatFim - 1; DecodeDate(DatFim, Ano, Mes, DiaFim); Loop do dia 1 até o último dia do mês Lin := 0; DiaOld := 9; for Dia := 1 to DiaFim do Transformo o ano, mês e dia para uma variável do tipo TDateTime Obtenho o dia da semana correspondente a data. Data := EncodeDate(Ano, Mes, Dia); DiaSem := DayOfWeek(Data)-1; Se o dia da semana encontrado for menor que o dia da semana da data anterior é sinal que devemos mudar de linha... if DiaSem <= DiaOld then DiaOld := DiaSem; Inc(Lin); Escrevo o dia na célula Grid.Cells[DiaSem, Lin] := FormatFloat('00;00', Dia); Verifico se o dia é feriado... for Ind := 0 to High(DatFer) do if FormatDateTime('dd/mm', Data) = DatFer[Ind] then Grid.ColorCell[DiaSem, Lin] := clred; Grid.CellFont[DiaSem, Lin].Color := clwhite; Grid.HintCell[DiaSem,Lin] Break; := HntFer[Ind];

Se for o dia de hoje, coloco em negrito if Data = Date then Grid.CellFont[DiaSem, Lin].Style := [ fsbold ]; Se for o dia 01 coloco o foco do grid nesta célula if Dia = 1 then Grid.Col := DiaSem; Grid.Row := Lin; Será necessário criar duas variáveis que devem ser visíveis em toda a Unit. Para isto coloque a definição das mesmas na cláusula Private: private { Private declarations } MesRef, AnoRef: Word; A seguir colocaremos no evento OnCreate do formulário o seguinte código: procedure TFrm_Calend.FormCreate(Sender: TObject); var Tmp: Word; DecodeDate(Date, AnoRef, MesRef, Tmp); MontaGrid(Date); Agora colocaremos no evento OnClick do botão Btn_MesAnt o seguinte código: procedure TFrm_Calend.Btn_MesAntClick(Sender: TObject); Dec(MesRef); if MesRef < 1 then MesRef := 12; Dec(AnoRef); MontaGrid(EncodeDate(AnoRef, MesRef, 1));

E para finalizar o projeto só falta o evento OnClick do botão Btn_ProxMes que terá o seguinte código: procedure TFrm_Calend.Btn_ProxMesClick(Sender: TObject); Inc(MesRef); if MesRef > 12 then MesRef := 1; Inc(AnoRef); MontaGrid(EncodeDate(AnoRef, MesRef, 1)); O aplicativo rodando fica, mais ou menos, assim: Com tudo isto o nosso calendário está pronto. Como o componente é simples de usar não é difícil de fazer coisas até mais complexas do que este exemplo. Numa utilização profissional deste código seria interessante ter uma tabela de feriados (fixos e móveis) com sua devida descrição, daí seria fácil colocar uma busca da data nesta mesma tabela e caso a data se tratar de um feriado, fazer as alterações que estão demonstradas no exemplo (ou outras). É evidente que muita coisa pode ser implementada e melhorada. Mas o objetivo desta aplicaçãoexemplo é apenas didático. Portanto (aos programadores mais experientes) sejam caridosos ao avaliar o código. O motivo pelo qual não coloquei o componente juntamente com o exemplo é que acho interessante que todos os interessados fizessem uma breve visita ao site do autor. Lá tem recomendações importantes para quem usa Delphi 6 em diante. O endereço é: http:www.hoerstemeier.com Chegando lá, clique no link Delphi e verá o componente TStringAlignGrid (além de outros). Divirtam-se! Marcelo Torres