Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
NeonMaster
Člen
Avatar
NeonMaster:26.1.2015 11:30

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
rawen
Člen
Avatar
Odpovídá na NeonMaster
rawen:26.1.2015 11:32

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
26.1.2015 11:32
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rawen
NeonMaster:26.1.2015 12:21

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
rawen
Člen
Avatar
Odpovídá na NeonMaster
rawen:26.1.2015 12:38

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
26.1.2015 12:38
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
NeonMaster
Člen
Avatar
Odpovídá na rawen
NeonMaster:26.1.2015 13:57

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:26.1.2015 14:18

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
rawen
Člen
Avatar
Odpovídá na NeonMaster
rawen:26.1.2015 14:37

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 rawen
NeonMaster:26.1.2015 14:51

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
rawen
Člen
Avatar
Odpovídá na NeonMaster
rawen:26.1.2015 15:06

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 rawen
NeonMaster:26.1.2015 15:14

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
rawen
Člen
Avatar
Odpovídá na NeonMaster
rawen:26.1.2015 15:30

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
26.1.2015 15:30
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na NeonMaster
Jan Vargovský:26.1.2015 15:31

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ý
Tvůrce
Avatar
Odpovídá na rawen
Jan Vargovský:26.1.2015 15:32

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
rawen
Člen
Avatar
Odpovídá na Jan Vargovský
rawen:26.1.2015 15:44

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 rawen
NeonMaster:26.1.2015 15:54

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:26.1.2015 15:59

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ý
Tvůrce
Avatar
Odpovídá na rawen
Jan Vargovský:26.1.2015 16:10

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ý
Tvůrce
Avatar
Odpovídá na NeonMaster
Jan Vargovský:26.1.2015 16:11

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

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

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:26.1.2015 16:18

: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 rawen
NeonMaster:26.1.2015 16:20

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
rawen
Člen
Avatar
Odpovídá na Jan Vargovský
rawen:26.1.2015 16:41

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
rawen
Člen
Avatar
Odpovídá na NeonMaster
rawen:26.1.2015 16:43

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ý
Tvůrce
Avatar
Odpovídá na rawen
Jan Vargovský:26.1.2015 16:49

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
26.1.2015 16:49
Avatar
rawen
Člen
Avatar
Odpovídá na Jan Vargovský
rawen:26.1.2015 17:34

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 rawen
NeonMaster:26.1.2015 18:29

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ý
Tvůrce
Avatar
Odpovídá na NeonMaster
Jan Vargovský:26.1.2015 18:32

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.