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

Ajuda com C#

Discussão em 'Programação' iniciada por te-x, 21 de Abril de 2012. (Respostas: 6; Visualizações: 1070)

  1. te-x

    te-x Power Member

    Olá, estou a desenvolver uma aplicação em C# (uma galeria de imagens) em queria ter uma lista com todas as imagens, e outras informações acessível a partir de todos os os forms. Já tinha começado a fazer tendo as estruturas de dados no form inicial e depois ir passando pelo constructor de cada form mas não me parece uma solução muito correcta / elegante.

    O que tenho neste momento é:
    Código:
    class Gallery {
            private string name;                //gallery's name
            private int num_imgs;               //number of images in gallery
            private List<string> imgs_paths;    //paths to all images on this gallery
    
            ...
    }
    
    O form principal teria um List<Gallery> galleries que depois anda de um lado para o outro...

    Qual é a maneira correcta de se fazer isto? Uma classe static?
     
    Última edição: 21 de Abril de 2012
  2. Boas te-x,
    parece que ninguem quer arriscar qual será a solução mais correcta/elegante. O mais provavel é alguem responder uma maneira e cairem logo os "prós" em cima a dizer de outra.

    A meu ver, se vais usar a lista entre vários forms, podes criar uma class Global, colocar lá a lista como static e usar em todos os forms (e acedes com algo do tipo Global.Gallery).

    Passar por parametro do constructor também não é má ideia, mas depois tens de fazer isso para todos os forms, o que pode não se tornar muito prático.
     
  3. Boas
    Exacto.Ir passando a lista por parâmetro é uma ideia,mas dá mais trabalho principalmente se tiveres muitos forms.A melhor maneira é mesmo criares uma Class static e definires as variáveis também como static,assim podes aceder em todos os forms da mesma maneira (já explicada pelo ptchaos).
    Cumps
     
  4. te-x

    te-x Power Member

    Obrigado pelas respostas. Acho que vou optar por usar esta tal classe, como um singleton. Assim:

    Código:
    public sealed class Galleries    {
            //stores all the galleries in the program
            private List<Gallery> galleries;
    
    
            //saves the instance of Galleries
            private static Galleries instance;
            // constructor
            private Galleries()
            {
                galleries = new List<Gallery>();
            }
    
    
            // returns the instance of the Galleries
            public static Galleries Instance
            {
                get {
                    if (instance == null)
                        instance = new Galleries();
                    return instance; 
                }
            }
            [...]
    }
    
     
  5. te-x

    te-x Power Member

    O que fiz tem dado para o que preciso, mas estou com um problema que não sei resolver...


    Estou a fazer um função para mostrar 4 miniaturas de imagens aleatórias de uma galeria. O código que me está a dar problemas é este:
    Código:
    private void checkedListBox_Galleries_SelectedIndexChanged {
        [...]
        PictureBox[] pics = {pictureBox1,pictureBox2,pictureBox3,pictureBox4};
        [...]
    
        if (galleryPicturesCount <= 4) 
        { 
        [...] 
        }
    
        else
        {
            int[] randoms = new int[4];
            Random generator = new Random();
            int tmp = 0;
    
            for (int i = 0; i < 4; i++)
            {
                do
                {
                    tmp = generator.Next(0, galleryPicturesCount-1);
                } while (!isUnique(randoms, tmp, 0, galleryPicturesCount - 1));
    
                 randoms[i] = tmp;
                pics[i].ImageLocation = Galleries.Instance.getGallery(selectedGallery).getImage(randoms[i]);
            }
        }
    }
    
    private bool isUnique(int[] array, int value, int min_index, int max_index)
    {
        for(int i = min_index; i<=max_index;i++)
            if(value == array[i])
                return false;
        
        return true;
    }
    
    Se a galeria tiver 4 ou menos imagens, não tenho problema. Se tiver mais de 4 o programa crasha, e o Visual Studio nem dá nenhuma informação, como é normal (é a primeira vez que estou a usar VS).
    Se for pondo breakpoints tudo funciona bem até acabar o do{ }while(). Quando ele acaba e tento atribuir algum valor a tmp crasha.

    Alguma ajuda? Ando com isto desde ontem e não encontro o erro...
     
    Última edição: 25 de Abril de 2012
  6. Na função isUnique estás a aceder ao array em que o i pode ser >= 4 (porque vem do galleryPicturesCount), mas o array está definido apenas como [4].
     
  7. te-x

    te-x Power Member

    Obrigado... tinha a certeza que ia ser um erro parvo... xD
     

Partilhar esta Página