Nefunkční událost/i na poli Buttonů - [C#]
Dobrý den.
Řekněme, že mám formulář a v něm pole Buttonů:
Button[,] btn = new Button[10, 10];
...pak mám např. tuto událost:
protected override void OnMouseMove(MouseEventArgs e)
{
string x = Convert.ToString(e.X);
string y = Convert.ToString(e.Y);
Text = "[" + x + "," + y + "]";//jen jako příklad :)
}
no a problém je v tom, že mi to souřadnice zobrazuje všude mimo toho pole tlačítek, tz. jakmile kurzorem najedu na ty tlačítka, tak to souřadnice nezobrazuje. Potřeboval bych zajistit, aby to fungovalo i na buttonech, jak na to?
Děkuju.
Podle toho co píšeš zřejmě ta událost není přiřazena k těm buttonům.
No to máš pravdu. Zkoušel jsem to nějak takto:
Ovšem nevím, co dát jako parametr new System.EventHandler();...protože pokud se nepletu, tak by tam měl být název toho tlačítka, ale pokud je generuju pomocí cyklu, tak mám vlastně 100 různých názvů tlačítek...takže se teda ptám, jak na x různých názvů tlačítek navázat jednu událost? Bohužel nevím, jak to zapsat.
Příklad za tisíc slov :)
Dobrý den,
mám sub-dotaz. Vytvořil jsem si pole buttonů obdobně, jak je na příkladu.
Mám ale problém v tom, že k poli musím přistupovat, i když vyvolám událost, která s tímto polem nesouvisí.
Například smažu obsah pole "btn" po kliknutí tlačítka v menu.
Problém v metodě SmazPole(), ať už je implementována jakkoli (resp. kdekoli jinde v programu vyjma Form1_Load() nevidím pole "btn", nemůžu k němu přistupovat, zjišťovat, ani měnit hodnoty.
Jediné řešení, které mě napadlo, je našoupat všechna generovaná tlačítka ještě do společného kontejneru, který by byl už vytvořen ve vizuálním návrháři. Ale ani tak nevím přesně, jestli by to nějakým způsobem šlo.
C# zatím začínám. V Delphi stačilo použít StringGrid a nemuselo se implementovat pole tlačítek.
Dokázal by někdo poradit? Děkuji
Nemusíš.
Ano. Tak už to bývá, když objekty zrušíš a pak s nimi chceš pracovat.
Děkuji za odpověď, bohužel nechápu z nich ani jednu.
Nic nemažu, maximálně nuluji zadaný text z těch buttonů.
Ale už jsem se v programu malinko posunul. Už to pole, které mám nazvané jako "pole" vidím ve všech metodách. Stačilo dát kód z Form1_Load() do Form1.Designer.cs. Bohužel, stále nevím jakým způsobem přistupovat k i-tému,j-tému prvku (pole butonnů 15x15).
Něco jako pole[i,j] v cyklu je nesmysl, protože to mi píše, že k prvku typu button nemůžu přistupovat jako v poli.
Poradí někdo, prosím?
Až si něco přidáš na formulář, tak ti to z designeru zmizí.
A co přesně ti to píše? Protože s prvkem v poli se dá samozřejmě normálně pracovat.
na řádku s: pole[i, j]; ->
Cannot apply indexing with [] to an epxression type System.Windows.Forms.Button
A ten kód je přesně jaký?
U Form1.Designer.cs :
System.Windows.Forms.Button[,] pole = new System.Windows.Forms.Button[15, 15];
int indx = 2;
int x = 12, y = 37;
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
pole[i, j] = new System.Windows.Forms.Button();
pole[i, j].Name = "btn" + i.ToString() + j.ToString();
pole[i, j].Size = new System.Drawing.Size(20, 20);
pole[i, j].Location = new System.Drawing.Point(x, y);
pole[i, j].TabIndex = indx;
pole[i, j].BackColor = System.Drawing.Color.White;
pole[i, j].FlatStyle = System.Windows.Forms.FlatStyle.Flat;
pole[i, j].Text = "";
pole[i, j].UseVisualStyleBackColor = false;
x += 19;
indx++;
Controls.Add(pole[i, j]);
pole[i, j].MouseDown += new System.Windows.Forms.MouseEventHandler(this.HraciP ole_MouseDown);
}
}
u Form1.cs
private void HraciPole_MouseDown(object sender, MouseEventArgs e)
{
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 15; j++)
{
?????? pole[i, j];
}
}
}
A co s tím konkrétním buttonem hodláš dělat? Přistupovat k němu můžeš úplně stejně jako v tom designeru.
No, konkrétně si chci napsat jednu metodu pro smazání pole SmazPole().
Potom do něj budu kreslit kolečka a křížky, to se dává po jednom, to funguje.
A pak budu muset zjisťovat hodnoty všech prvků pole a dát si je do pracovního pole,
a testovat výhru, případně vzorky, díky kterým to bude hrát velmi jednoduchý algoritmus piškvorek
(který jsem dělal asi před dvěma lety v Delphi, teď jsem to chctěl zkusit v C#).
Právě že ten přístup stejně jako v designeru mi nefunguje
a nevím, čím to je. Plnění konkrétních butonnů by bylo již vyřešeno,
ale zjišťování jejich hodnot z toho nadřezazeného pole najednou,
to mi prostě nějak nejde..
Nefunguje?
No, přesně to nefunguje a píše to chybu, co jsem psal.
Když jsem to konzultoval s někým zkušennějším, tak říkal, že je nějaká divná ta deklarace (první řádek),
v C++ by to naprosto hlásilo tisíce chyb a že bych si mohl nastavit breakpointy a podívat se,
co obsahuje to pole a jakého je typu. Tak to můžu zkusit.
Kdyby se to podařilo někomu vyřešit, byl bych moc rád.
Tak jsem zkusil i ten breakpoint a v poli pole je hodnota null.
Alespoň u události MouseDown. Když si breakpoint nastavím u Form1_Load, tak jsou tam normálně ta tlačítka.
Sakra, vím, že je problém mezi židlí a obrazovkou, a já přesně nevidím kde
Evidentně ty tlačítka někdy z pole smažeš, nebo vytvoříš nové pole.
To by mě právě zajímalo, jakým způsobem jsem toho mohl docílit a jak to odstranit.
Ani když v tom kódu nemám nic jiného, než jsem psal, tak je to pole smazané. Bohužel neznám důvod.
Dej sem kompletní kód.
Asi jsem to právě vyřešil.
řádek: System.Windows.Forms.Button[,] pole = new System.Windows.Forms.Button[15, 15];
nemůžu volat ve Form1_Load(), ale tuto deklaraci dělat mimo
(přímo pod úrovní public partial class Form1 : Form )
Potom uvidím pole i v dalších metodách a přístup bude fungovat.
Děkuji za rady.
Pokud jsi ten řádek měl v designeru i ve Form_Load, tak je to zcela jasné. Podruhé jsi vytvořil zcela nové a prázdné pole.
Nene, měl jsem ho pouze v Designeru. Nebo pouze ve Form_Load a nefungovalo to.
Nesmí být ani v jednom z nich, aby to fungovalo :)
Piškvorky už jsou hotové, teda zatím jen random-hloupý algoritmus pro PC.
Díky za rady.
Někde to být musí, jinak by jsi s tím nemohl pracovat.
ono pred programovanim je dobre si najprv ujasnit ze co kde kedy sa spusta a preco, kam sa tie data nadrbu, jaku maju viditelnost a zivotnost. Ak to neni nikde napisane tak zmenit vyvojove prostredie/jazyk. Ak to je niekde napisane tak si to precitat. Bez google sa uci dost tazko.
Do programu nemozes pisat nejake riadky len tak skusmo bez toho aby si presne vedel ze co pises a ze preco to pises prave tam a nie o stranu dalej.