Diskuze: C# picturebox v jiné třídě

C# .NET .NET (C# a Visual Basic) C# picturebox v jiné třídě American English version English version

Avatar
NeonMaster
Člen
Avatar
NeonMaster:

Ahoj. Chtěl bych se zeptat jak mám nastavit aby nějaky picturebox mohl použít i v jiné třídě.
Díky za jakoukoliv pomoc.

Editováno 26.1.2015 11:30
 
Odpovědět 26.1.2015 11:30
Avatar
rwn
Člen
Avatar
Odpovídá na NeonMaster
rwn:

Když si vytváříš instanci té tvojí jiné třídy, tak si můžeš ten tvůj konkrétní picturebox poslat jako parametr. V konstruktoru té tvojí jiné třidy si ho pak třbea přiřadíš jako private proměnnou. :)

Nahoru Odpovědět  +1 26.1.2015 11:32
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rwn
NeonMaster:

Můžeš to prosím říct trochu podrobněji jsem začátečník a moc to nechápu. 8|

 
Nahoru Odpovědět 26.1.2015 12:21
Avatar
rwn
Člen
Avatar
Odpovídá na NeonMaster
rwn:

Dejme tomu, že máš teda nějaký Form1 a chceš z něj provádět operace v té tvojí JineTride, abys to mohl udělat, tak si musíš vytvořit instanci této jiné třídy

JinaTrida jinaTrida = new JinaTrida(); // toto je vytvoření instance na třídu

ted bys přes jinaTrida. mohl provádět operace v té tvojí druhé třídě. Ty si ovšem v tomto případě neposíláš žádný parametr, ale klidně můžeš. Dejme tomu, že máš nějaký pictureBox (je tedy typu PictureBox), co se jmenuje mujPictureBox. Ten si můžeš přes zmíněnou instanci poslat do té tvojí druhé třídy takto

JinaTrida jinaTrida = new JinaTrida(mujPictureBox);

Takto si můžeš posílat jakoukoliv proměnnou jakéhokoliv datpvého typu. Musíš ovšem v Kostruktoru této jiné třídy říct co má očekávat - kolik parametrů a jakých datových typů. Kostruktor té tvojí jiné třídy by tedy v tomto případě vypadal takto

JinaTrida (PictureBox mujPictureBox)
{
}

V tomto případě se ti po vytoření instance na chvíli objeví tvůj poslaný parametr v této třídě. Je ovšem potřeba, pokud s tím paramatrem chceš pracovat, si ho někam uložit a v konstruktoru jen odchytit. Může to být například takto

Private PictureBox mujPictureBox;

JinaTrida (PictureBox mujPictureBox)
{
    this.mujPictureBox = mujPictureBox;
}

V tomto případě se poslaný parametr uloží do private proměnné mujPictureBox. Jinak řečeno můžeš s PictureBoxem pracovat jakoby byl součastí jak tvého Form1 tak této třídy, protože mu jakoby říkaš, že v této jiné třídě je odkaz na ten tvůj PictureBox. Doufám, že jsem to vysvětlil srozumitelně. :)

Editováno 26.1.2015 12:40
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 26.1.2015 12:38
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rwn
NeonMaster:

Díky za pomoc sice jsou tam ještě nějaké problémy ale já už si poradím.:)

 
Nahoru Odpovědět 26.1.2015 13:57
Avatar
NeonMaster
Člen
Avatar
Odpovídá na NeonMaster
NeonMaster:

Tak asi neporadím.
Mám picturebox pcz kde je uložená česká vlajka.A třídu Class1 ve které chci pcz použít a podtrhává mi to Class1 Method must have return argument a všude v kódu mi to podtrhává to pcz a píše to Ambiguity between 'WindowsFormsAp­plication1.For­m1.pcz' and 'WindowsFormsAp­plication1.For­m1.pcz
kód toho mám takový:

Class1 trida = new Class1();
private PictureBox pcz;

Class1 (PictureBox pcz)
{
    this.pcz = pcz;
}
Editováno 26.1.2015 14:18
 
Nahoru Odpovědět 26.1.2015 14:18
Avatar
rwn
Člen
Avatar
Odpovídá na NeonMaster
rwn:

To je tím, že Class1 není metoda, ale konstruktor, který nemá ve Form1 co dělat. V tom tvém Form1 kódu musíš mít jen

Class1 trida = new Class1(pcz);

ten zbytek musíš mít v té tvojí Class1 :)

public class Class1
{
    private PictureBox pcz;

    Class1 (PictureBox pcz)
    {
        this.pcz= pcz;
    }
}

btw. konstruktor se vždy jmenuje jako třída, v které se nachází a nemá návratový typ.

Editováno 26.1.2015 14:39
Nahoru Odpovědět 26.1.2015 14:37
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rwn
NeonMaster:

Napsal jsem tam přesně tohle a nejde to podtrhuje to PictureBox a new Class1(pcz).

 
Nahoru Odpovědět 26.1.2015 14:51
Avatar
rwn
Člen
Avatar
Odpovídá na NeonMaster
rwn:

aha, sryy chybí mě tam public před tím konstruktorem 8| má to být takto

public class Class1
{
    private PictureBox pcz;

    public Class1(PictureBox pcz)
    {
        this.pcz = pcz;
    }
}

jo a ještě si do té třídy Class1 přidej nahoru

using System.Windows.Forms;

to je k tomu abys mohl pracovat s kontrolkama z Formu.. teď to už musí fungovat. :)

Editováno 26.1.2015 15:07
Nahoru Odpovědět 26.1.2015 15:06
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rwn
NeonMaster:

Počet chyb je ten snížen na 1.
Poslední chyba je ta že mi to podtrhuje to pcz tady:

Class1 trida = new Class1(pcz);

A field initializer cannot reference the non-static field, method, or property

 
Nahoru Odpovědět 26.1.2015 15:14
Avatar
rwn
Člen
Avatar
Odpovídá na NeonMaster
rwn:

To by mělo být tím, že tenhle řádek máš někde hned na začátku kódu a v té době pcz ještě neexistuje. On začne existovat až kód narazí na InitializeCom­ponent(); - v tu chvíli se ti vytvoří kontrolky v návrhu. V podstatě si to můžeš ošetřit takto pokud chceš mít instanci trida v rámci celé třídy

private Class1 trida;

public Form1()
{
    InitializeComponent();
    trida = new Class1(pcz);
}
Editováno 26.1.2015 15:31
Nahoru Odpovědět  +1 26.1.2015 15:30
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na NeonMaster
Jan Vargovský:

Musíš vytvořit instanci v konstruktoru, takhle mimo se navzájem promenné nevidí.

 
Nahoru Odpovědět 26.1.2015 15:31
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na rwn
Jan Vargovský:

On existuje, proč by neexistoval :)

ale jak by pak kompilátor vyřešil tohle:

X = new X(Y);
Y = new Y(X);
 
Nahoru Odpovědět 26.1.2015 15:32
Avatar
rwn
Člen
Avatar
Odpovídá na Jan Vargovský
rwn:

Ono jde o to, že on má kontrolku nějak pojmenovanou. A on pod tímto jménem k ní přece nemůže přistupovat než dojde k InitializeCom­ponent(); ne? :)

Nahoru Odpovědět 26.1.2015 15:44
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rwn
NeonMaster:

Měl jsem to sice pod InitializeCom­ponent(); ale tak i přesto jsem to hodil o trochu níž v kódu a konečně to jde (to je sice divné ale hlavně že to funguje :D ) :) díky za pomoc

Editováno 26.1.2015 15:54
 
Nahoru Odpovědět 26.1.2015 15:54
Avatar
NeonMaster
Člen
Avatar
NeonMaster:

a neexistuje nějaký jednoduchý zpusob jak to napojit třeba na cyklus protože takovych obrázků mám asi 40 a ručně to bude složité

 
Nahoru Odpovědět 26.1.2015 15:59
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na rwn
Jan Vargovský:

Může, jen je to proměnná, která neodkazuje na žádnou instanci (je null).

 
Nahoru Odpovědět 26.1.2015 16:10
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na NeonMaster
Jan Vargovský:

Můžeš použít Controls.OfTy­pe<PictureBox>.

 
Nahoru Odpovědět 26.1.2015 16:11
Avatar
rwn
Člen
Avatar
Odpovídá na NeonMaster
rwn:

Myslíš jako 40 PictureBoxů?

Nahoru Odpovědět 26.1.2015 16:15
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na Jan Vargovský
NeonMaster:

:o to vážně jde. Mohl by si prosím tady popsat jak to funguje nebo spíš jak to použít ? :)

 
Nahoru Odpovědět 26.1.2015 16:18
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rwn
NeonMaster:

ano myslím PictureBoxy....

Teď mě tak napadá že bych to mohl použít jenom 1 a do něho nahrávat obrázky podle toho jaký bude třeba hmmm...

 
Nahoru Odpovědět 26.1.2015 16:20
Avatar
rwn
Člen
Avatar
Odpovídá na Jan Vargovský
rwn:

U deklarované proměnné samozřejmě ano, ale o té jsme se nebavili. Bavili jsme se o kontrolce v návrhu. Ten .Name kontrolky se nastavuje až v InitializeCom­ponent(); a až po tom, se dá pod tímto názvem k dané kontrolce přistupovat. :)

Nahoru Odpovědět 26.1.2015 16:41
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
rwn
Člen
Avatar
Odpovídá na NeonMaster
rwn:

Obecně není zrovna nejlepší používat 40 stejných kontrolek, ale dost záleží co se tím snažíš realizovat.

Nahoru Odpovědět 26.1.2015 16:43
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na rwn
Jan Vargovský:

A jak si myslíš, že pracuje designer? Ty přidáš kontrolku na formulář. Přidá se proměnná do třídy a do metody InitializeCom­ponents se přidají jednotlivé vlastnosti té komponenty.

Mějme takovouhle situaci: Máš form F a na něm třeba Label, pojmenovaný X.

F()
{
InitializeComponents();
X.Text = "nějaký text";
}

Tenhle kód funguje korektně. Co se stane, když se pokusím nastavit text před metodou InitializeCom­ponents?

F()
{
X.Text = "nějaký text";
InitializeComponents();
}

Podle tvého tvrzení, ho ani nevidíš. Ve skutečnosti dostaneš NullReference­Exception, protože uvnitř té magické metody InitializeCom­ponents teprve vytváříš instanci.

Doporučuji ti prostudovat jak vypadá ten generovaný kód a jak fungují partial třídy :)

 
Nahoru Odpovědět  +2 26.1.2015 16:49
Avatar
rwn
Člen
Avatar
Odpovídá na Jan Vargovský
rwn:

S tím souhlasím, ale on jí měl použitou nad formem, proto jsem mu psal, že neexistuje

X.Text = "nějaký text";
F()
{
InitializeComponents();
}

proto mu to psalo tu chybu, ale máš pravdu, něco bych si měl nastudovat. :)

Nahoru Odpovědět 26.1.2015 17:34
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rwn
NeonMaster:

neměl jsem to pod formem já jsem to měl takto

{
InitializeComponents();
}
Class1 trida = new Class1(pcz);
Editováno 26.1.2015 18:30
 
Nahoru Odpovědět 26.1.2015 18:29
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na NeonMaster
Jan Vargovský:

V C# je jedno jestli je to nahoře nebo dole pod konstruktorem :D

 
Nahoru Odpovědět 26.1.2015 18:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 27 zpráv z 27.