IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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
Preedy
Člen
Avatar
Preedy:27.8.2012 9:47

Ahoj, snažím se udělat oko bere ve formsApplication a chci tam mít i obrázky karet. Naplnění do listu jsem zvládnul asi takhle:

private List<Image> karty = new List<Image>();
        private string cesta = Directory.GetCurrentDirectory() + @"\images\";
        private void naplnList()
        {
            for (int i = 0; i <= 31; i++)
            {
                karty.Add(Image.FromFile(cesta + i + ".png"));
            }

        }

ale když je pak chci volat takhle:

private void panel1_Paint(object sender, PaintEventArgs e)
        {
            Graphics kp = e.Graphics;
            kp.DrawImage((Image)karty[0], 0, 0);
//Image)karty[0] - je to takhle vubec dobře?
        }

tak to ve formuláři zobrazí obdélník s křížem, jako že asi nexistuje či co.
Děkuji moc za pomoc.

 
Odpovědět
27.8.2012 9:47
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Preedy
David Hartinger:27.8.2012 10:38

Kód je určitě správně, toto je ukázka z MSDN dokumentace:

public void DrawImagePoint(PaintEventArgs e)
{
// Create image.
Image newImage = Image.FromFile("SampImag.jpg");
// Create Point for upper-left corner of image.
Point ulCorner = new Point( 100, 100);
// Draw image to screen.
e.Graphics.DrawImage(newImage, ulCorner);
}

To přetypování je tam zbytečné, List je generická kolekce. Nevidím tam chybu, zkus nějaký Image vytvořit přímo v té metodě, jako je v té ukázce, jeslti to půjde nebo ne.

Nahoru Odpovědět
27.8.2012 10:38
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Preedy
matesax:27.8.2012 10:56

Zkus toto:

private List<Image> karty = new List<Image>();

private void naplnList(int index = 0)
{
    karty.Add(Image.FromFile(@"images\" + index + ".png"));

    if (karty.Count - 1 > index)
        naplnList(index + 1);
}
 
Nahoru Odpovědět
27.8.2012 10:56
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:27.8.2012 10:57

Z toho vyplývá, že karty máš pojmenované 1.png, 2.png... - je to tak?

 
Nahoru Odpovědět
27.8.2012 10:57
Avatar
matesax
Tvůrce
Avatar
matesax:27.8.2012 11:04

Jé - co blbnu - má to být:

private void naplnList(int index = 0)
{
    karty.Add(Image.FromFile(@"images\" + index + ".png"));

    if (maxuímum (já ho nevím...) > index)
        naplnList(index + 1);
}
 
Nahoru Odpovědět
27.8.2012 11:04
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:27.8.2012 11:05

Pardon - toto je správně... :[

private void naplnList(int index = 0)
{
karty.Add(Ima­ge.FromFile(@"i­mages\" + index + ".png"));

if (karty.Count - 1 < 31)
naplnList(index + 1);
}

 
Nahoru Odpovědět
27.8.2012 11:05
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:27.8.2012 11:06

Karet je 32, proto ten cyklus, nebylo na něm nic špatně. Spíš mi připadá, jestli má ty obrázky ve složce s programem.

Nahoru Odpovědět
27.8.2012 11:06
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:27.8.2012 11:06
private void naplnList(int index = 0)
{
    karty.Add(Image.FromFile(@"images\" + index + ".png"));

    if (karty.Count < 30)
        naplnList(index + 1);
}

Pardon - to nahoře smaž - omlouvám se...

 
Nahoru Odpovědět
27.8.2012 11:06
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:27.8.2012 11:07

To je úplná hloupost.

Nahoru Odpovědět
27.8.2012 11:07
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:27.8.2012 11:08

No já vidím problém v cestě k souboru - to je největší kámen úrazu - ať si ji vyjede... Rekurze je dle mého názoru lepší, než cyklus...

 
Nahoru Odpovědět
27.8.2012 11:08
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:27.8.2012 11:08

Nevím proč tu spamuješ takové hloupost, chce přidat 32 obrázků tak udělá for cyklus od 0 do 31. Nevidím tu nic na řešení.

Složka images by měla být ve složce bin/debug. Jeslti ji má v projektu, tak možná proto to nefunguje.

Nahoru Odpovědět
27.8.2012 11:08
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:27.8.2012 11:10

Ne to není, už jen proto, že lidé rekurzivně nemyslí, nebudu ji cpát někam, kde to nedává smysl. Někdy se hodí, ale těch případů tolik není. Navíc ti pak ty metody visí v zásobníku, což je její nevýhoda.

Nahoru Odpovědět
27.8.2012 11:10
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:27.8.2012 11:11

Však proto píši, že vidím problém v cestě k souboru... A´t napíše, kde má tu složku images...

Snažil jsem se sesmolit rekurzi...

 
Nahoru Odpovědět
27.8.2012 11:11
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:27.8.2012 11:12

Proč by visely - není to návratová rekurze...

 
Nahoru Odpovědět
27.8.2012 11:12
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:27.8.2012 11:18

Ale visí, čeká se na její dokončení, to je podmíněné dalším voláním, pak dalším a dalším. Se na to podívej pořádně.

Nahoru Odpovědět
27.8.2012 11:18
New kid back on the block with a R.I.P
Avatar
Preedy
Člen
Avatar
Preedy:27.8.2012 11:38

obrázky pojmenované 00..31, jenom jsem změnil příponu na *.bmp a jsou ve složce .../debug/images

 
Nahoru Odpovědět
27.8.2012 11:38
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Preedy
matesax:27.8.2012 11:42

Aha... :) Index máš ve formátu 0, 1, 2 - ne 00, 01, 02... přepiš ty obrázky bez dorovnání nulou... A nemusíš detekovat aktuální adresář - jen:

images\...

Tedy bude to:

karty.Add(Image.FromFile(@"images\" + index + ".bmp"));

Jen nevím, proč jsi konvertoval do bmp - je zbytečně náročný - a ztrátový... Png je lepší volba.

 
Nahoru Odpovědět
27.8.2012 11:42
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Preedy
David Jančík:27.8.2012 11:43

00 ti nepůjde, když načítáš jen 0. Si tam dej podmínku že pokud je i < 10 tak to tma přidá nulu.

Nahoru Odpovědět
27.8.2012 11:43
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Preedy
Člen
Avatar
Preedy:27.8.2012 11:49

já už mám karty v listu, ale nejde mi je vykreslit:

kp.DrawImage((Image)karty[0], 0, 0);

nevím jak to má správně vypadat v tom DrawImage

 
Nahoru Odpovědět
27.8.2012 11:49
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Preedy
matesax:27.8.2012 12:12

Ale kde přesně je problém - neexistuje index (Image s tímto indexem má hodnotu null)?

 
Nahoru Odpovědět
27.8.2012 12:12
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Preedy
David Jančík:27.8.2012 12:13

V tom listu očividně nejsou obrázky. Pročti si komentáře výše, projeď si to pole a přijdeš na to, kde je problém ;)

Nahoru Odpovědět
27.8.2012 12:13
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Preedy
David Hartinger:27.8.2012 12:13

Posílal jsem ti, jak to je správně a máš to správně, jen to přetypování tam je zbytečné. Opravil jsi ty 00? Zkoušel jsi nahrát obrázek přímo v metodě jak jsem ti psal?

Nahoru Odpovědět
27.8.2012 12:13
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Preedy
matesax:27.8.2012 12:14

Toto je OK:

kp.DrawImage(karty[index], x, y);

(měl jsi tam zbytečně konverci do Image)

Takže problém může být jen v listu karet - hdil bys to na https://gist.github.com/ (celý program)?

 
Nahoru Odpovědět
27.8.2012 12:14
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:27.8.2012 12:17

Jsou - jen ne ty dorovnané nulou - takže to je zavádějící...

 
Nahoru Odpovědět
27.8.2012 12:17
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:27.8.2012 12:18

Index 0 tam bude vždy... Jen nebude mít obrázek 01 - ale až 10... Index 0 by měl tedy být OK...

 
Nahoru Odpovědět
27.8.2012 12:18
Avatar
matesax
Tvůrce
Avatar
matesax:27.8.2012 12:22

Tedy jestli to chápu, při plnění listu mu to neselhalo - takže index 0 by měl jít...

 
Nahoru Odpovědět
27.8.2012 12:22
Avatar
matesax
Tvůrce
Avatar
matesax:27.8.2012 12:25

Ale vyřešil bych to jako já Lonesure - podívej se na něj - najdeš ho v mém profilu. Totiž porovnávat obrázky nejde, takže toto mi přijde jako blbost. Já to vyřešil tak, že určité hodnotě jsem přiřadil obrázek - ale pracoval jsem s čísly - ne s obrázky - obrázek se vykreslil až jako poslední prvek - jen vyobrazení logického výpočtu...

 
Nahoru Odpovědět
27.8.2012 12:25
Avatar
Kit
Tvůrce
Avatar
Kit:27.8.2012 12:33

Myslím si, že správně by mělo být

"images\\"+index.ToString("00")+".bmp"
Nahoru Odpovědět
27.8.2012 12:33
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:27.8.2012 12:36

Ach jo, Matěji, raději si dvakrát rozmysli co chceš napsat místo psaní 5ti příspěvků pod sebe s nulovou informační hodnotou. Zbytečně to tu dělá nepořádek a lidi to mate.

Chyba zde byla v pojmenování obrázků. Pokud je tam i další, ukáže se, když Preedy využije mé ukázky kterou jsem mu poslal hned na začátku a vloží obrázek přímo do metody Draw, to zatím neudělal, nemůžeme mu tedy dále pomoci, dokud nenapíše. Proto nebudeme psát 50 příspěvků s výkřiky, čím by to mohlo nebo nemohlo být. Opravdu bych byl rád, kdyby ta diskuze tady měla trochu úroveň.

Nahoru Odpovědět
27.8.2012 12:36
New kid back on the block with a R.I.P
Avatar
Preedy
Člen
Avatar
Odpovídá na matesax
Preedy:27.8.2012 12:37

takže ten list nemmám udělat jo?

 
Nahoru Odpovědět
27.8.2012 12:37
Avatar
Preedy
Člen
Avatar
Odpovídá na David Hartinger
Preedy:27.8.2012 12:42

tak už jsem udělal to první, ale nic to nedělá

 
Nahoru Odpovědět
27.8.2012 12:42
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Preedy
matesax:27.8.2012 12:44

No podívej se na ten můj program - mám tam vyřešené otočení první a druhé karty - jen jejich porovnávání bude jiné - tobě nepůjde o schodu, protože neděláš pexeso, ale myslím, že ti to dost pomůže...

 
Nahoru Odpovědět
27.8.2012 12:44
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Preedy
matesax:27.8.2012 12:51

Šlo mi o to, že já tam mám pole picture boxů - to bys vypustil a udělal to jak to mám já, s tím, že bys udělal switch pro jedotlivé hodnoty - takže ne - neměl byst list obrázků - ale ten switch. A pracoval bys s polem čísel... Něco jako:

int number;

switch (index)
{
    case 0:
       number = 0;
       break;
    case 1:
       number = 1;
    case 2:
       ...
}

karty.Add(Image.FromFile(@"images\" + number + ".png"));

Jen toto bys změnil a jinak bs mohl použít můj program...

 
Nahoru Odpovědět
27.8.2012 12:51
Avatar
Preedy
Člen
Avatar
Odpovídá na matesax
Preedy:27.8.2012 12:52

už na to koukám

 
Nahoru Odpovědět
27.8.2012 12:52
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:27.8.2012 12:53

Já zase blbnu - omlouvám se:

switch (index)
{
    case 0:
       number = 0;
       break;
    case 1:
       number = 1;
    case 2:
       ...
}

kp.DrawImage(Image.FormFile(@"images\" + number + ".bmp"), x, y);
 
Nahoru Odpovědět
27.8.2012 12:53
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:27.8.2012 12:57

To si snad děláš legraci :o Tohle je jedna z nejhorších věcí, co jsem kdy viděl.

Tady to vede do pekel, zavíráme. Preedyho kód byl v pořádku, jen neměl ošetřená ty jména. Hned jako 2 příspěvek jsem mu poslal ukázku zobrazení obrázku, ptal jsem se ho několikrát jestli to zxkoušel, žádná odpověď. Cyklus je naprosto v pořádku, list je naprosto v pořádku.

matesax: Tohle je fakt na ban, zamysli se prosím nad sebou, rekurze je naprostá blbost, o tom switchi ani nemluvím, ježí se mi vlasy na hlavě když to vidím.

Nahoru Odpovědět
27.8.2012 12:57
New kid back on the block with a R.I.P
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Tato diskuze byla označena moderátorem jako nekonstruktivní a myslíme si, že nemá pro veřejnost příliš vysokou hodnotu. Členy můžete samozřejmě stále oslovit soukromě a to formou zpráv nebo chatu.

Zobrazeno 36 zpráv z 36.