Ajuda com C#

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:
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.
 
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.

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
 
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; 
            }
        }
        [...]
}
 
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:
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].
 
Back
Topo