CanonTG Posted March 10, 2014 at 03:23 PM Report #548080 Posted March 10, 2014 at 03:23 PM Boas, alguém sabe como aumentar o componente MonthCalendar e só aparecer apenas um mês?
nunopicado Posted March 10, 2014 at 03:31 PM Report #548083 Posted March 10, 2014 at 03:31 PM O TMonthCalendar é um wrapper para um controlo do próprio Windows: http://msdn.microsoft.com/en-us/library/windows/desktop/bb760917(v=vs.85).aspx O teu nível de controlo sobre ele é mínimo. Nomeadamente, o tamanho é definido pelo próprio Windows, e a característica de mostrar o antes e depois do mês actual, creio que também. Precisas de um componente de calendário não descendente do TMonthCalendar para poderes alterar isso! "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
CanonTG Posted March 10, 2014 at 03:39 PM Author Report #548087 Posted March 10, 2014 at 03:39 PM A minha ideia é fazer um calendário para clicar num dia e adicionar uma visita a uma empresa, so estou a ver este componente para isto, é o único que se pode andar pelos meses todos, a questão é mesmo do tamanho
thoga31 Posted March 10, 2014 at 03:51 PM Report #548090 Posted March 10, 2014 at 03:51 PM Bom, este é o 5º tópico que tenho de mover para o subquadro de Delphi. Uma coisa é Pascal, outra coisa é Delphi. Quando o assunto é acerca de Delphi, cria-se o tópico no subquadro de Delphi e não no quadro de Pascal. 😉 1 Report Knowledge is free!
CanonTG Posted March 10, 2014 at 04:26 PM Author Report #548095 Posted March 10, 2014 at 04:26 PM Estou a usar um TCalendar e preciso de colorir um dia ou meter a negrito mas não estou a encontrar como fazer isso, alguém sabe como?
nunopicado Posted March 10, 2014 at 04:34 PM Report #548096 Posted March 10, 2014 at 04:34 PM Eu precisei de algo parecido, para um software que suporta touchscreen, e o TMonthCalendar era pequeno demais para usar com os dedos. Resultado: Criei eu um. Uma Form, com os botões do tamanho que quis, e todas as características que eu precisava, para igualar ao restante ambiente do programa. Claro que para usar só o calendário é um overkill, mas podes fazer algo parecido, para as tuas necessidades. Em alternativa, pesquisar por um componente semelhante, mas com possibilidade de alterar o tamanho. O Negrito é a mesma coisa... Um componente que não se baseio no do Windows permitirá certamente esse tipo de controle. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
CanonTG Posted March 10, 2014 at 04:53 PM Author Report #548098 Posted March 10, 2014 at 04:53 PM (edited) O pior é que o componente TCalendar nao tem TCalendar.BoldDays. Não sabes como eu tenho de fazer para meter o dia a negrito? Edited March 10, 2014 at 05:21 PM by CanonTG
Kline777 Posted March 10, 2014 at 05:37 PM Report #548107 Posted March 10, 2014 at 05:37 PM Assim visto de repente o TCalendar descent da TCustomGrid... deve haver uma especie customdrawcell la algures perdido. talvez com um class helper lá consigas chegar.
CanonTG Posted March 10, 2014 at 05:42 PM Author Report #548108 Posted March 10, 2014 at 05:42 PM Não ha esse componente. E já pesquisei na net em varios sites e não ha nada para resolver o meu problema -.-
I-NOZex Posted March 10, 2014 at 07:22 PM Report #548117 Posted March 10, 2014 at 07:22 PM jedi jvcl é a soluçao pelo que vi 😄 http://www.activedelphi.com.br/forum/viewtopic.php?t=77713&highlight=agenda awn, outras coisas q encontrei: http://sourceforge.net/projects/tpvplanit/ http://delphi.about.com/od/toppicks/tp/aatpplaner.htm http://www.torry.net/pages.php?s=98 B2R » Beat2Revolution v3.0b | Regista e divulga-nos beat2revolution.net
Kline777 Posted March 10, 2014 at 09:05 PM Report #548124 Posted March 10, 2014 at 09:05 PM (edited) Isto foi assim visto rápido... mas dá como eu tinha dito... pode é estar com demasiado lixo. Basicamente o texto do TCalendar é desenhado no evento DrawCell, por isso tens de fazer um override a esse método e colocar a Bold as celulas que quiseres Uma solução é TMyCalendar=class(TCalendar) procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override; end; procedure TMyCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); var TheText: string; begin TheText := self.CellText[ACol, ARow]; Canvas.Font.Style:=[fsbold]; // esta linha poe o texto da celula a bold with ARect, Canvas do TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2, Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText); end; Só tens de criar o teu calendario a partir deste tipo e mudar o código do DrawCell para o que queres. Isto quase de certeza que pode ser simplificado usando um class interceptor para o TCalendar mas assim de repente nao consegui, se calhar o nunopicado pode dar uma dica sobre isto 😛 Edited March 10, 2014 at 09:06 PM by Kline777
nunopicado Posted March 10, 2014 at 09:45 PM Report #548134 Posted March 10, 2014 at 09:45 PM (edited) Neste caso, penso que nada como um Class Interceptor... 🙂 Kline, pegando no teu código, e com algumas alterações, ficaria: Na secção Interface, antes da declaração da form, mete-se o interceptor. No caso, vamos interceptar o constructor Create e o método DrawCell: type TCalendar = Class(Vcl.Samples.Calendar.TCalendar) // Dependendo da versão do Delphi, pode não ser necessário meter o namespace completo) public procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override; constructor Create(AOwner: TComponent); override; End; TForm1 = class(TForm) calendar1: TCalendar; // Esta linha tem de ser posterior ao interceptor, caso contrario não funciona. private { Private declarations } public { Public declarations } end; De seguida, a implementação dos novos métodos. Aqui a ordem é indiferente, logo que esteja na secção Implementation da unit. constructor TCalendar.Create(AOwner: TComponent); begin DefaultDrawing := false; inherited; end; procedure TCalendar.DrawCell(ACol: Integer; ARow: Integer; ARect: TRect; AState: TGridDrawState); begin Canvas.Font.Style := [fsbold]; // esta linha poe o texto da celula a bold inherited; end; Claro que no DrawCell podes personalizar, meter Bold só onde te interessa por exemplo, e não em todas as células. Mas a moral da história é que com o Interceptor, podes dar nova vida ao TCalendar. Edited March 10, 2014 at 09:53 PM by nunopicado "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
nunopicado Posted March 10, 2014 at 09:56 PM Report #548137 Posted March 10, 2014 at 09:56 PM Por exemplo, se alterares o DrawCell de cima, por este, só mete a bold o dia actual: procedure TCalendar.DrawCell(ACol: Integer; ARow: Integer; ARect: TRect; AState: TGridDrawState); begin if CellText[ACol,ARow] = FormatDateTime('d',date) then Canvas.Font.Style:=[fsbold]; inherited; end; 1 Report "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Kline777 Posted March 10, 2014 at 10:00 PM Report #548138 Posted March 10, 2014 at 10:00 PM Eu vi logo que davas aí um toque de classe ^^ Melhor que isto só componentes externos, mas sinceramente é uma brutal oportunidade para 'fuçar' no código dos componentes e aprender uma coisas novas. Tive recentemente o mesmo problema mas foi com um calendar para FireMonkey (Android) e a solução foi parecida...
nunopicado Posted March 10, 2014 at 10:08 PM Report #548139 Posted March 10, 2014 at 10:08 PM lol Tá boa... A ideia do interceptor é só para que não seja preciso registar o novo componente, ou criá-lo em runtime. Até pode ser preciso mais do que um TCalendar e já nem é preciso fazer mais nada, o interceptor apanha tudo o que estiver declarado depois dele. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
Kline777 Posted March 10, 2014 at 10:12 PM Report #548141 Posted March 10, 2014 at 10:12 PM Eu tinha tentado isso assim de repente mas acho que o meu erro foi não me lembrar de por o namespace completo
nunopicado Posted March 10, 2014 at 10:17 PM Report #548142 Posted March 10, 2014 at 10:17 PM Pois, primeiro não pus também, e deu barraca. 🙂 "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
CanonTG Posted March 11, 2014 at 09:23 AM Author Report #548163 Posted March 11, 2014 at 09:23 AM (edited) Eu estou no delphi 2009 e não tem o método TCalendar.DrawCell :/ Edited March 11, 2014 at 09:26 AM by CanonTG
nunopicado Posted March 11, 2014 at 09:30 AM Report #548166 Posted March 11, 2014 at 09:30 AM Eu estou no delphi 2009 e não tem a propriedade TCalendar.DrawCell :/ Não é que não tenha, tu é que não a vês... 🙂 O TCalendar é descendente da TCustomGrid, que tem o DrawCell. Logo, o TCalendar também o tem. No entanto, quem construiu o TCalendar achou por bem que quem o usasse não tivesse direito a ele, e como tal, escondeu-a. O Class Interceptor que te mostrei em cima serve para isso mesmo: Ir buscar métodos e propriedades escondidas e/ou adicionar novos(as). Ou seja, se meteres o Class Interceptor tal como meti no exemplo em cima, antes da chamada ao TCalendar (apenas com a noção que no D2009 não deverá ser necessário meter todo o namespace do TCalendar como eu meti), o DrawCell não só vai ficar visível, como será alterado pelo que eu meti. "A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!" > Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.
CanonTG Posted March 11, 2014 at 09:40 AM Author Report #548169 Posted March 11, 2014 at 09:40 AM Meti o primeiro código no form principal que depois no menu chamo o form onde tenho a agenda mas dá-me erros: ->TGridDrawState ->Class ->constructor P.s: Desculpem sou nova nesta linguagem de programação :/
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now