Diskuze: C# picturebox v jiné třídě
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 27 zpráv z 27.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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.
Můžeš to prosím říct trochu podrobněji jsem začátečník a moc to
nechápu.
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ě.
Díky za pomoc sice jsou tam ještě nějaké problémy ale já už si poradím.:)
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 'WindowsFormsApplication1.Form1.pcz' and
'WindowsFormsApplication1.Form1.pcz
kód toho mám takový:
Class1 trida = new Class1();
private PictureBox pcz;
Class1 (PictureBox pcz)
{
this.pcz = pcz;
}
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.
Napsal jsem tam přesně tohle a nejde to podtrhuje to PictureBox a new Class1(pcz).
aha, sryy chybí mě tam public před tím konstruktorem 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.
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
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 InitializeComponent(); - 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);
}
Musíš vytvořit instanci v konstruktoru, takhle mimo se navzájem promenné nevidí.
On existuje, proč by neexistoval
ale jak by pak kompilátor vyřešil tohle:
X = new X(Y);
Y = new Y(X);
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 InitializeComponent();
ne?
Měl jsem to sice pod InitializeComponent(); 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íky za pomoc
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é
Může, jen je to proměnná, která neodkazuje na žádnou instanci (je null).
to vážně jde. Mohl
by si prosím tady popsat jak to funguje nebo spíš jak to použít ?
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...
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
InitializeComponent(); a až po tom, se dá pod tímto názvem k dané
kontrolce přistupovat.
Obecně není zrovna nejlepší používat 40 stejných kontrolek, ale dost záleží co se tím snažíš realizovat.
A jak si myslíš, že pracuje designer? Ty přidáš kontrolku na formulář. Přidá se proměnná do třídy a do metody InitializeComponents 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 InitializeComponents?
F()
{
X.Text = "nějaký text";
InitializeComponents();
}
Podle tvého tvrzení, ho ani nevidíš. Ve skutečnosti dostaneš NullReferenceException, protože uvnitř té magické metody InitializeComponents teprve vytváříš instanci.
Doporučuji ti prostudovat jak vypadá ten generovaný kód a jak fungují
partial třídy
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.
neměl jsem to pod formem já jsem to měl takto
{
InitializeComponents();
}
Class1 trida = new Class1(pcz);
V C# je jedno jestli je to nahoře nebo dole pod konstruktorem
Zobrazeno 27 zpráv z 27.