1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

EventHandlers Csharp

Discussão em 'Programação' iniciada por andrepadez, 26 de Abril de 2008. (Respostas: 11; Visualizações: 1028)

  1. andrepadez

    andrepadez Power Member

    Boas,

    Tenho uma matriz de [8x8] pictureboxes, "SquareButtons".
    é criada no form principa, onload, com um for quadrático.

    Quero que todas elas funcionem como um botão, cujas acções sejam iguais, mas sejam controláveis uma a uma pelos índices da matriz.

    Inseri dentro dos for de criação das mesmas a linha

    squareButtons[rank, file].Click += new EventHandler(SquareButton_Click);

    queria de alguma forma enviar como argumentos a posição xy na matriz.

    Anyone???

    Obrigado
     
  2. balute

    balute Power Member

    Ao criar as pictureboxes, podes atribuir-lhes um nome baseado na posição. Por exemplo,
    Código:
    squareButtons[rank, file].Name = "squareButton" + rank + file;
    Assim, no event handler, basta obter o nome do control para ficares a saber a posição correspondente.

    Uma solução mais "orientada a objectos" seria criar uma nova classe chamada squareButton, herdada da classe Button, que possuiria uma propriedade adicional para indicar a posição.
     
    Última edição: 27 de Abril de 2008
  3. andrepadez

    andrepadez Power Member

    Obrigado Wizzard. Mais umavez foste uma grande ajuda. Mas o problema não é só esse, tem mais a ver com o eventhandler em si. Vou tentar ser mais explícito agora:

    em cada cíclo do for, estou a atribuir nome indexado para cada uma. Agora o que eu quero é criar um eventhandler para cada uma:

    Código:
     
    squareButtons[rank, file].Click += new EventHandler(SquareButton_Click);
    
    e depois, ao carregar naquele botão:
    Código:
     
    private void SquareButton_Click(object sender, EventArgs e)
    {
    ///onde aqui poder saber qual a squareButton que tenha sido clickada,
    ///e poder mandar mensagens para aceder e alterar suas propriedades. 
    
    }
    
    Capisce?:001:

    Isto deve ser muito básico, eu é que há muitas cenas que ainda não sei.

    De qq maneira obrigado
     
  4. balute

    balute Power Member

    Nessa zona, podes meter coisas do tipo:
    Código:
    int x, y;
    using (PictureBox sqButton = sender)
    {
      x = sqButton.Name.Substring(sqButton.Name.Length - 2, 1);
      y = sqButton.Name.Substring(sqButton.Name.Length - 1, 1);
      //...
    }
     
  5. andrepadez

    andrepadez Power Member

    Desculpa,
    se eu introduzir o código como dizes, o compilador diz que não consegue converter implicitamente PictureBox em Objecto...

    Obrigado
     
  6. andrepadez

    andrepadez Power Member

    Já pensei fazer isso, e poderá ficar para depois, mas isso continua sem me resolver a situação.

    Já experimentei fazer com o MouseEventHandler, mas as coordenadas que me devolve são relativas ao botão, e não à form.
    Já estou a desesperar.
     
  7. balute

    balute Power Member

    oops, tenta assim:
    Código:
    using (PictureBox sqButton = (sender as Picturebox))
    Em VB .NET funciona, por isso também deve funcionar em C#.
     
  8. andrepadez

    andrepadez Power Member

    Mais uma vez obrigado; acabou por funcionar, mas tive de martelar um bocado. Passo a explicar:

    Quando faço o
    using (PictureBox square = sender as PictureBox)

    é criada uma nova PictureBox que se sobrepõe à que estou a invocar. Tenho de voltar a colocar no seu sítio uma nova com os atributos que quero.

    Há alguma maneira de ultrapassar isto???

    Mais uma vez um grande obrigado
     
  9. balute

    balute Power Member

    Experimenta:
    Código:
    using (PictureBox sqButton = (PictureBox)sender)
    Pensava que era a mesma coisa que "sender as PictureBox", mas se calhar não.
     
  10. andrepadez

    andrepadez Power Member

    Boas Wizzard.

    Depois de muita tentativa e erro, e com base nas dicas que me foste dando, aqui fica a solução para quem quiser.
    Acabei por tornar a minha classe Square em "filha" de Picturebox, onde lhe adicionei como variáveis de instância o x e y na matriz.
    No form load, coloco o tabuleiro de 8*8 Squares com

    Código:
     
    for (int file = 0; file < 8; file++)
    for (int rank = 0; rank < 8; rank++)
            boardTest.squares[rank, file].Click += new EventHandler(SquareButton_Click);
    
    e a função funciona assim (nem precisei do using, bastou-me fazer o cast normalmente):
    Código:
     
    public void SquareButton_Click(object sender, EventArgs e)
    {
    int rank, file;
    Square test = (Square)sender;
    rank = test.X;
    file = test.Y;
    MessageBox.Show(rank.ToString() + file.ToString());
    
    Mais uma vez obrigado por tudo.
     
  11. balute

    balute Power Member

    E o cast não funcionou para a classe PictureBox?

    De qualquer forma, ainda bem que criaste essa classe com X e Y, fica mais bonito assim IMO :P
     
  12. andrepadez

    andrepadez Power Member

    o cast funcionava como tu dizias para obter os argumentos.
    Mas por alguma razão quando o fazia, sobrepunha-me uma nova Picturebox em cima da minha e eu tinha de estar sempre a criar outra igual e a dar-lhe atributos. Alta dôr de cabeça.

    Eu não programava há 10 anos, e venho da escola imperativa. Estou a perceber aos poucos como funciona a *****, e isto é lindo.

    Abraço
     

Partilhar esta Página