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í.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu. Zároveň využij slevovou akci až 30 % zdarma při nákupu e-learningu - Více informací.
discount 30 + hiring

Diskuze: Volání obrázků z listu

Aktivity
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Preedy
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka:27.8.2012 11:07

To je úplná hloupost.

Nahoru Odpovědět
27.8.2012 11:07
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Čápka
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 Čápka
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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
Tým ITnetwork
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
Tým ITnetwork
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Preedy
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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 Čápka
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 Čápka
Tým ITnetwork
Avatar
Odpovídá na matesax
David Čápka: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
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
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.