Jump to content
dellnou

Retirar dados de um calendario num panel

Recommended Posts

dellnou

Boas Pessoal...

Como sou autodidacta, há limites a mais para mim e neste caso (talvez simples para vocês) os limites foram atingidos,  😳.

Eu estou a tentar construir um cálculo salarial, que resumidamente é o seguinte;

Depois de inserir um determinado horário e a escolha dos dias para tal, ele me calcule o vencimento, coisa simples para vocês, eu sei 😳.

Neste momento acho que estou a exagerar nos meus limites, encontrei um calendário que escolhendo o dia e mês ele preenche um Panel com label´s dos dias que formam o mês escolhido. Eu simplesmente alterei o código de label para button e esta assim (código do load, mas para as escolhas é igual).

Public Class Form1
    Dim btnDayz As Button
    Dim y As Int32 = 0
    Dim x As Int32
    Dim ndayz As Int32
    Dim Dayofweek, CurrentCulture As String
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'exibe o mês atual
        comboBoxMonth.Text = DateTime.Now.Month.ToString()
        'obtem a cultura do windows
        CurrentCulture = Globalization.CultureInfo.CurrentCulture.Name
        'exibe o nome completo do mes atual
        labelMonth.Text = Application.CurrentCulture.DateTimeFormat.GetMonthName(Convert.ToInt32(comboBoxMonth.Text))
        'obtem o numero de dias do mes e ano selecionado
        My.Application.ChangeCulture("en-za")
        Dim Dayz As Int32 = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month)
        'exibe o ano atual no textbox
        textBoxYear.Text = DateTime.Now.Year.ToString()
        'chama a função verificaDia
        verificaDia()
        For i As Int32 = 1 To Dayz
            ndayz += 1
            btnDayz = New Button()
            btnDayz.Name = "B" & i
            btnDayz.Text = i.ToString()

            If i = DateTime.Now.Day Then
                btnDayz.BackColor = Color.Green
            ElseIf ndayz = 1 Then
                btnDayz.BackColor = Color.Red

            Else
                btnDayz.BackColor = Color.Aquamarine

            End If
            btnDayz.Font = label31.Font
            btnDayz.SetBounds(x, y, 37, 27)
            x += 42
            If ndayz = 7 Then
                x = 0
                ndayz = 0
                y += 29
            End If
            panel1.Controls.Add(btnDayz)
        Next
        'retorna os valores padrão
        x = 0
        ndayz = 0
        y = 0



        
    End Sub

End Class

O que eu queria era o seguinte, depois de submeter o horario (essa parte esta feita) ao clicar nos dias (button´s) os mesmos sejam considerados ou inseridos em algum object, para depois eu fazer o cálculo.

Exemplo; escolho dia 2, 4, etc… e eles aparecem num textbox, listbox, entendem?

Na pratica manipular o código para isso, acham que é possível?

Obrigado!

Share this post


Link to post
Share on other sites
dellnou

Pessoal, será que alguém me pode ajudar?

Caso seja pelo post não ser esclarecedor, avisem que eu tento explicar de forma diferente.

Share this post


Link to post
Share on other sites
Caça

Não seria mais fácil para ti teres já prontos 31 botões?

Depois mudarias o texto e a cor via código utilizando o DirectCast.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dellnou

Inicialmente pensei em algo parecido, pelo menos em button. Tinha uma folha de Excell com formulas que mediante a escolha de um mês e ano ele preenchia um calendário e posteriormente, com uma ligação do VB á referida folha obteria os 7 dias iniciais para 7 label e assim construia o calendário.

Como encontrei este na net, pensei em alterar o código para o efeito, mas vejo que as tantas ate tens razão...

Share this post


Link to post
Share on other sites
Caça

Os nomes seriam Btn1, Btn2, Btn3, ect.

No ciclo de preenchimento colocarias

For i As Int32 = 1 To Dayz
'...
'...
DirectCast(Me.Controls("Btn" & i), Button).Text = "Dia " & i
'...
'...
Next


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dellnou

Caça, desculpa...não vou tão longe!

Sei qual a parte do codigo a que te referes (acho eu), mas como completo o codigo? E não tenho que retirar nada ao mesmo?

Share this post


Link to post
Share on other sites
Caça

Esquece a variável "btnDayz"

Apenas precisas disto

DirectCast(Me.Controls("Btn" & i), Button).Text = "Dia " & i

If i = DateTime.Now.Day Then
    DirectCast(Me.Controls("Btn" & i), Button).BackColor = Color.Green
ElseIf ndayz = 1 Then
    DirectCast(Me.Controls("Btn" & i), Button).BackColor = Color.Red
Else
    DirectCast(Me.Controls("Btn" & i), Button).BackColor = Color.Aquamarine
End If


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dellnou

Eu alterei o ciclo que me falas-te e retirei a variavel "btnDayz" e com os button de "btn1" ate "btn31" recebo este aviso;

NullReferenceException was unhandled

A referência de objecto não foi definida como uma instância de um objecto.

...com o seguinte codigo 😳;

For i As Int32 = 1 To Dayz
            DirectCast(Me.Controls("Btn" & i), Button).Text = "Dia " & i

            If i = DateTime.Now.Day Then
                DirectCast(Me.Controls("Btn" & i), Button).BackColor = Color.Green
            ElseIf ndayz = 1 Then
                DirectCast(Me.Controls("Btn" & i), Button).BackColor = Color.Red
            Else
                DirectCast(Me.Controls("Btn" & i), Button).BackColor = Color.Aquamarine
            End If
        Next

eu estou a contornar a situação com o codigo inicial e com 35x"btn" e um button com o seguinte codigo, o qual me preenche os 7 primeiros "btn" e os restantes em função destes, mas acho que o teu é mais correcto, por isso gostaria de o entender

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If Dayofweek = "Monday" Then
            btn1.Enabled = True
            btn1.Text = "1"
            btn2.Enabled = True
            btn2.Text = "2"
            btn3.Enabled = True
            btn3.Text = "3"
            btn4.Enabled = True
            btn4.Text = "4"
            btn5.Enabled = True
            btn5.Text = "5"
            btn6.Enabled = True
            btn6.Text = "6"
            btn7.Enabled = True
            btn7.Text = "7"
        ElseIf Dayofweek = "Tuesday" Then
            btn1.Enabled = False
            btn1.Text = ""
            btn2.Enabled = True
            btn2.Text = "1"
            btn3.Enabled = True
            btn3.Text = "2"
            btn4.Enabled = True
            btn4.Text = "3"
            btn5.Enabled = True
            btn5.Text = "4"
            btn6.Enabled = True
            btn6.Text = "5"
            btn7.Enabled = True
            btn7.Text = "6"
        ElseIf Dayofweek = "Wednesday" Then
            btn1.Enabled = False
            btn1.Text = ""
            btn2.Enabled = False
            btn2.Text = ""
            btn3.Enabled = True
            btn3.Text = "1"
            btn4.Enabled = True
            btn4.Text = "2"
            btn5.Enabled = True
            btn5.Text = "3"
            btn6.Enabled = True
            btn6.Text = "4"
            btn7.Enabled = True
            btn7.Text = "5"
        ElseIf Dayofweek = "Thursday" Then
            btn1.Enabled = False
            btn1.Text = ""
            btn2.Enabled = False
            btn2.Text = ""
            btn3.Enabled = False
            btn3.Text = ""
            btn4.Enabled = True
            btn4.Text = "1"
            btn5.Enabled = True
            btn5.Text = "2"
            btn6.Enabled = True
            btn6.Text = "3"
            btn7.Enabled = True
            btn7.Text = "4"
        ElseIf Dayofweek = "Friday" Then
            btn1.Enabled = False
            btn1.Text = ""
            btn2.Enabled = False
            btn2.Text = ""
            btn3.Enabled = False
            btn3.Text = ""
            btn4.Enabled = False
            btn4.Text = ""
            btn5.Enabled = True
            btn5.Text = "1"
            btn6.Enabled = True
            btn6.Text = "2"
            btn7.Enabled = True
            btn7.Text = "3"
        ElseIf Dayofweek = "Saturday" Then
            btn1.Enabled = False
            btn1.Text = ""
            btn2.Enabled = False
            btn2.Text = ""
            btn3.Enabled = False
            btn3.Text = ""
            btn4.Enabled = False
            btn4.Text = ""
            btn5.Enabled = False
            btn5.Text = ""
            btn6.Enabled = True
            btn6.Text = "1"
            btn7.Enabled = True
            btn7.Text = "2"
        ElseIf Dayofweek = "Sunday" Then
            btn1.Enabled = False
            btn1.Text = ""
            btn2.Enabled = False
            btn2.Text = ""
            btn3.Enabled = False
            btn3.Text = ""
            btn4.Enabled = False
            btn4.Text = ""
            btn5.Enabled = False
            btn5.Text = ""
            btn6.Enabled = False
            btn6.Text = ""
            btn7.Enabled = True
            btn7.Text = "1"
        End If
        

Share this post


Link to post
Share on other sites
Caça

Percorre o código linha a linha para ver onde está o erro.


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dellnou

fazendo o que sugeres, o referido aviso aparece aqui

DirectCast(Me.Controls("Btn" & i), Button).Text = "Dia " & i

Share this post


Link to post
Share on other sites
Caça

Os botões estão dentro de algum painel, groupbox ou algo do género?


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dellnou

Rsrs, é ai que esta o erro, rsrs...realmente estavam dentro de um Groupbox!

Retirei-os e coloquei-os no Form, mas o efeito saiu diferente do desejado, isto é, preenche realmente os "btn" com os dias do mês/ano inserido, mas não faz referencia aos dias da semana.

Há forma de saltar entre o "btn1" e o "btn7" de forma ao dia um ser inserido sobre o "btn" que se encontra sobre a coluna das label com os dias da semana?

Ex: Se o dia 1 de um determinado mês/ano começa a uma Quarta, o "btn" que se encontra abaixo (coluna) da label "Quarta" ser preenchido com o dia 1 e desta forma dar seguimento a partir dai, entendes?

Share this post


Link to post
Share on other sites
Caça

Isso estava a acontecer devido ao "Me" que se refere a form

Se quiseres manter numa GroupBox substitui "Me" pelo nome da GroupBox.


Para isso terias que modificar o ciclo for que estás actualmente a usar


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dellnou

Humm, entendi!

Bem, de qualquer forma a tua ajuda foi espectacular e eu vou tentar contornar a coisa de uma outra forma, vamos ver se consigo, rsrs

Para terminar, pelo menos da minha parte este topico, os "btn´s" são preenchidos com "dia x" e não "x", como altero isto?

Share this post


Link to post
Share on other sites
Caça

Troca

DirectCast(Me.Controls("Btn" & i), Button).Text = "Dia " & i

por

DirectCast(Me.Controls("Btn" & i), Button).Text = i

Em relação à duvida anterior o que podes fazer é em vez de começares com o i a zero, começas com o primeiro dia da semana do respectivo mês, e em vez de terminar em 31 termina em 31 + primeiro dia da semana, tas a ver??


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
Caça

Pega aquilo que se faz em 5 minutos :P

    Private Sub Preenche()
        Dim Data As Date = New Date(2011, 1, 2)
        Dim DiasMes As Integer = Date.DaysInMonth(Data.Year, Data.Month)
        Dim PDia As Integer = New Date(Data.Year, Data.Month, 1).DayOfWeek
        If PDia <> 1 Then Desactiva(1, PDia - 1)
        For i = PDia To (DiasMes + PDia) - 1
            DirectCast(Me.Controls("Button" & i), Button).Text = i - (PDia - 1)
        Next
        If DiasMes + PDia <> 42 Then Desactiva(DiasMes + PDia, 42)
    End Sub

    Private Sub Desactiva(ByVal Inicio As Integer, ByVal Fim As Integer)
        For i = Inicio To Fim
            DirectCast(Me.Controls("Button" & i), Button).Visible = False
        Next
    End Sub

Espero que percebas :P

EDIT: Fiz uma pequena alteração no código


Pedro Martins

Não respondo a duvidas por PM

Share this post


Link to post
Share on other sites
dellnou

Eu no no ciclo, troquei o

For i As Int32 = 1 To Dayz

por

For i As Int32 = ndayz To Dayz + ndayz

e o "btn1" não é preenchido e sim o "btn2" mas como dia 2, isto é, continua igual, unicamente salta para o "btn1" e o text também, entendes? Possivelmente o ciclo não é assim  :P

Share this post


Link to post
Share on other sites
dellnou

Desculpa caça, respondi sem ver que já tinhas postado, rsrs

Entendo que seja rápido e simples para ti, por isso eu tento fazer as coisas antes de forma a entender "porque é assim" e não limitar-me ao copy paste.

Agradeço a tua ajuda e já testei e dá, obrigado!

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.