NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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
Energy
Člen
Avatar
Energy:22.6.2012 22:43

Jak udělám stáhnutí třeba na tlačítko z nějáké webové stránky.

 
Odpovědět
22.6.2012 22:43
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Energy
David Jančík:22.6.2012 22:47

Ahoj,
moc nechápu dotaz... Zkoušel jsi na soubor odkázat klasicky přes <a href...> ?

Nahoru Odpovědět
22.6.2012 22:47
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Energy
Člen
Avatar
Energy:22.6.2012 23:09

No prostě máš na stránce soubor. Ve visual studiu button a chci na button stahnou ten soubor. Delam si launcher. Na hru a chci stahovani aktualizaci vim ze to jde nejak automaticky ale chci to takto.

 
Nahoru Odpovědět
22.6.2012 23:09
Avatar
Energy
Člen
Avatar
Energy:22.6.2012 23:11

Vlastně patcher na hru :).

 
Nahoru Odpovědět
22.6.2012 23:11
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na Energy
David Jančík:22.6.2012 23:39

Ajó, promiň já si nevšiml C#.

Líbit se ti bude nejspíš tohle:

private void Button1_Click(object sender, EventArgs e)
{
  WebClient webClient = new WebClient();
  webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
  webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
  webClient.DownloadFileAsync(new Uri("http://www.neco.cz/soubor.exe"), @"c:\cesta\soubor.exe");
}

private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
  progressBar.Value = e.ProgressPercentage;
}

private void Completed(object sender, AsyncCompletedEventArgs e)
{
  // staženo
}
Nahoru Odpovědět
22.6.2012 23:39
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Energy
Člen
Avatar
Energy:23.6.2012 0:01

Přesně díky :D

 
Nahoru Odpovědět
23.6.2012 0:01
Avatar
Energy
Člen
Avatar
Energy:23.6.2012 13:43

Nevím proč ale v "WebClient" a "DownloadProgres­sChangedEventAr­gs" mi to pořád hází chybu.

 
Nahoru Odpovědět
23.6.2012 13:43
Avatar
Energy
Člen
Avatar
Energy:23.6.2012 13:48

Tak teď už jenom tady "DownloadProgres­sChangedEventAr­gs" Chyba:

Error  1       The type or namespace name 'DownloadProgressChangedEventArgs' could not be found (are you missing a using directive or an assembly reference?)  C:\Users\Jakub\AppData\Local\Temporary Projects\launcher\Form1.cs       27      53      launcher
 
Nahoru Odpovědět
23.6.2012 13:48
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Energy
David Hartinger:23.6.2012 15:33

Chyba ti říká: "are you missing a using directive?"

Možná by bylo dobré přidat příslušný using. Když myší klikneš na WebClient, měla by se ti po chvíli zobrazit taková šipka a vyjede ti automaticky možnost to doplnit. Nebo nahoru dopiš:

using System.Net;

To je jmenný prostor, kde se nachází příslušná logika.

Nahoru Odpovědět
23.6.2012 15:33
New kid back on the block with a R.I.P
Avatar
Army
Neregistrovaný
Avatar
Army:25.8.2012 12:38

Ahoj zajímalo by mě jestli to jde udělat i v konzolové aplikaci.

 
Nahoru Odpovědět
25.8.2012 12:38
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na
David Jančík:25.8.2012 12:54

Samozřejmě :)

Nahoru Odpovědět
25.8.2012 12:54
Zapomeň, že je to nemožné a udělej to ;)
Avatar
Army
Neregistrovaný
Avatar
Army:25.8.2012 13:27

Napsal by jsi prosím podobný příklad jako u prvního dotazu?

 
Nahoru Odpovědět
25.8.2012 13:27
Avatar
Army
Neregistrovaný
Avatar
Army:28.8.2012 8:36

Na konzolovou aplikaci.

 
Nahoru Odpovědět
28.8.2012 8:36
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na
David Jančík:28.8.2012 8:50

Je to úplně stejné. Akorát si změníš událost, které vyvolá to stahování.

Nahoru Odpovědět
28.8.2012 8:50
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na
matesax:28.8.2012 9:12

No úplně stejně...

using System;
using System.Net;
using System.ComponentModel;

namespace ConsoleApplication1
{
    class Program
    {
        static WebClient webClient;

        static void Main(string[] args)
        {
            webClient = new WebClient();
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
            webClient.DownloadFileAsync(new Uri("http://www.neco.cz/soubor.exe"), @"c:\cesta\soubor.exe");
        }

        static void ProgressBar(int actualProgressPercentage)
        {
            if (actualProgressPercentage < 0 || actualProgressPercentage >= 100)
                throw new InvalidOperationException("Procenta procesu stažení souboru jsou mimo stupnici!");

            Console.Write("\r{0}{1}% complete", "Downloading...", (int)(100 * (actualProgressPercentage + 1)) / 100);

            if (actualProgressPercentage == 99)
                Console.WriteLine(Environment.NewLine);
        }

        static void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            ProgressBar(e.ProgressPercentage);
        }

        static void Completed(object sender, AsyncCompletedEventArgs e)
        {
            // staženo
        }
    }
}
 
Nahoru Odpovědět
28.8.2012 9:12
Avatar
Army
Neregistrovaný
Avatar
Army:30.8.2012 10:04

matesax proč jsi dal do konzolové aplikace progressBar? Soubor se mi stáhne pouze pokud spustím program jako správce a ze souboru .txt se udělal soubor.exe.

 
Nahoru Odpovědět
30.8.2012 10:04
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:30.8.2012 10:11

Musíš si sám vyházet všechny zbytečnosti kolem grafiky. Jak tak koukám, z toho programu nezbude skoro nic. Vše podstatné je zde:

webClient = new WebClient();
webClient.DownloadFileAsync(new Uri("http://www.neco.cz/soubor.exe"), @"c:\cesta\soubor.exe");

a trocha omáčky okolo.

Nahoru Odpovědět
30.8.2012 10:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Army
Neregistrovaný
Avatar
Army:30.8.2012 10:15

Ano přesně to jsem udělal. Ale nejde něják nastavit ten správce?

 
Nahoru Odpovědět
30.8.2012 10:15
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na
David Jančík:30.8.2012 10:19

Vytvoř si manifest a napiš tam tohle:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Mezi ty tagy requestedprivileges někam.

Nahoru Odpovědět
30.8.2012 10:19
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na
David Jančík:30.8.2012 10:20

A pak to ještě můžeš zkontrolovat při spouštění programu v Program.cs

WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());

if (principal.IsInRole(WindowsBuiltInRole.Administrator))
        Application.Run(new Form1());
else
        MessageBox.Show("Program ke svému běhu potřebuje práva administrátora!");
Nahoru Odpovědět
30.8.2012 10:20
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na
matesax:30.8.2012 10:29

To není grafický progressbar - je to přesně pro konzoli... Když to dáváš do souboru s koncovkou exe, bude to v exe - můj kód je v pořádku...

Popsal jsem ti to:

using System;
using System.Net;
using System.ComponentModel;

namespace ConsoleApplication1
{
    class Program
    {
        static WebClient webClient;

        static void Main(string[] args)
        {
            webClient = new WebClient();
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
            webClient.DownloadFileAsync(new Uri("http://www.neco.cz/soubor.Tady máš koncovku"), @"c:\cesta\soubor.kterou dáš sem!");
        }

        static void ProgressBar(int actualProgressPercentage)
        {
            if (actualProgressPercentage < 0 || actualProgressPercentage >= 100)
                throw new InvalidOperationException("Procenta procesu stažení souboru jsou mimo stupnici!");

            Console.Write("\r{0}{1}% complete", "Downloading...", (int)(actualProgressPercentage + 1));

            if (actualProgressPercentage == 99)
                Console.WriteLine(Environment.NewLine);
        }

        static void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            ProgressBar(e.ProgressPercentage);
        }

        static void Completed(object sender, AsyncCompletedEventArgs e)
        {
            // staženo
        }
    }
}
 
Nahoru Odpovědět
30.8.2012 10:29
Avatar
matesax
Tvůrce
Avatar
matesax:30.8.2012 10:30

A ano musíš spustit program jako správce - tak jako tak - to nejde změnit...

 
Nahoru Odpovědět
30.8.2012 10:30
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na matesax
David Jančík:30.8.2012 10:32

Pokud nebude ukládat soubor na OS >=Vista do disku C, který je systémové chráněn proti neoprávněnému zápisu. Ale do jiného oddílu tak administrátorská privilegia nepotřebuje. To samé platí pro osobní dokumenty a složku Appdata.

Nahoru Odpovědět
30.8.2012 10:32
Zapomeň, že je to nemožné a udělej to ;)
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Jančík
matesax:30.8.2012 10:37

Ano - to je samozřejmé - bráním pouze svůj kód - přecijen jsem si na něm dal záležet...

 
Nahoru Odpovědět
30.8.2012 10:37
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:30.8.2012 10:40

A co má dělat, když ten program nechce spouštět jako správce? To se přece zásadně nedělá.

Nahoru Odpovědět
30.8.2012 10:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:30.8.2012 10:44

Vždyť není potřeba stahovat do jiných složek, než do těch, na která práva nepotřebuješ - ne? Naopak stahovat do C, nebo do Program Files je spíš blbost...

 
Nahoru Odpovědět
30.8.2012 10:44
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:30.8.2012 12:09

Cituji: "matesax: A ano musíš spustit program jako správce - tak jako tak - to nejde změnit..."

Tuto větu považuji za blbost. Proto jsem se ptal, jak jsi to myslel a co má dělat, když ho chce spouštět jako řádný uživatel.

Nahoru Odpovědět
30.8.2012 12:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:30.8.2012 12:15

Odpověděl jsem s tím, že hodlá stahovat do složky, na kterou to povolení bude potřebovat - v takovém případě prostě nejde nic jiného dělat - tak jsem to napsal a myslel. A jak jsem napsal - bránil jsem jen svůj kód...

 
Nahoru Odpovědět
30.8.2012 12:15
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:30.8.2012 12:34

Tady vůbec nebyl předpoklad, že by to stahoval do složky, na kterou by neměl oprávnění. To sis vymyslel. Army si stěžoval, že spuštění tvého programu vyžaduje oprávnění správce a že se mu změnila přípona. Místo toho, abys mu poradil, že si musí změnit string "c:\cesta\soubor.exe" třeba na "Form1.cs", píšeš "A ano musíš spustit program jako správce".

Nahoru Odpovědět
30.8.2012 12:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:30.8.2012 12:39

Odpověděl jsem mu ukázkou. Za změnu si mohl sám - to jsem mu tam vysvětlil - do cílového souboru musí napsat správnou příponu. A povolení to může chtít jedině při přístupu do složek s povolením...

 
Nahoru Odpovědět
30.8.2012 12:39
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:30.8.2012 12:48

Army už to má určitě opraveno, tak to necháme být.

Stejně je to v C# dost náročné. V jiných jazycích je to na 1-2 řádky. Zrovna tento příklad bych určitě v C# (vlastně ani v jiném jazyku) nedělal, raději bych použil nějaký hotový systémový nástroj.

Nahoru Odpovědět
30.8.2012 12:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:30.8.2012 12:57

Nějak opět nevím, co se tu řeší.

Program se na spuštění jako správce dotáže, pokud bude mít manifest. Je to tak správně, program si nesmí jen tak hrabat na systémový disk a proto mu to jinak nebude dovoleno. Řeší se to tak u všech updaterů např. FireFox a další.

Tato kontrola tam být musí, jelikož dle architektury Windows hra patří do složky Program Files, do které je podmíněný zápis. Je to tak dobře, když chce program zapsat data uživatele, může do jeho složky. Když chce program měnit data sebe nebo jiného programu, musí se zeptat. Vzniká tak kontrola nad tím, co se děje a zároveň jsou vývojáři nuceni psát programy pořádně, aby byly multiuživatelské.

Nahoru Odpovědět
30.8.2012 12:57
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
matesax:30.8.2012 12:58

1 - 2 řádky?

new WebClient().DownloadFileAsync(new Uri("http://www.neco.cz/soubor.exe"), @"c:\cesta\soubor.exe");

No musím uznat - je to opravdu náročné...

 
Nahoru Odpovědět
30.8.2012 12:58
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:30.8.2012 13:27

Aha, neuvědomil jsem si, že hra se ve Windows nedá nainstalovat bez oprávnění správce. Nepřipadá mi to sice logické, ale budiž. Také jsem si myslel, že se jedná o uživatelská data, která patří do uživatelského prostoru (přípona .cs).

Nahoru Odpovědět
30.8.2012 13:27
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:30.8.2012 13:30

No vida. Stačil jediný řádek bez zbytečných deklarací. Zřejmě přesně tohle Army potřeboval.

Nahoru Odpovědět
30.8.2012 13:30
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 Kit
David Hartinger:30.8.2012 13:39

.cs je přípona zdrojáku v C#, nevím, proč by to někdo někam instaloval, ale pokud ano, dá to normálně do appdata, tam se psát může. Politika je zkrátka taková, že pro data uživatele oprávnění potřeba není, ale pro změnu programu je.

Nahoru Odpovědět
30.8.2012 13:39
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:30.8.2012 13:52

Když se tak dívám do historie, Army vlastně chtěl automatizovaně stáhnout .txt, který se zřejmě na webu občas mění. O instalaci nebyla řeč. Když použil příklad od matesaxe, tak se mu změnila přípona na .exe a vyžadovalo to oprávnění správce. Toho se chtěl zbavit. Netušil totiž, že do 2. parametru musí dát správný cílový název souboru, tedy s příponou .txt.

Nahoru Odpovědět
30.8.2012 13:52
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:30.8.2012 13:57

Přesně to jsem napsal. A oprávnění bude potřeba i když bude jenom do složky s potřebou práv stahovat - a to jsem již napsal - ať to stahuje do uživatelských složek - že se do C, nebo do Program Files nestahuje...

 
Nahoru Odpovědět
30.8.2012 13:57
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:30.8.2012 13:58

Nevím, co je špatného na tom, že jsem udělal ProgressBar pro konzoli - najdeš ho snad všude, kde se stahuje...

 
Nahoru Odpovědět
30.8.2012 13:58
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:30.8.2012 14:10

Progress bar v konzoli sice občas u delších souborů používám, ale pokud ten příkaz na stažení souboru vkládám do nějaké aplikace, tak ho vypínám, aby nerušil. Většinou nepotřebuji průběh sledovat, protože je to hned.

Na takové záležitosti raději používám systémové programy, ve vlastní aplikaci to neřeším. Je to praktičtější, spolehlivější a jednodušší na ovládání. Zápis příkazu je ještě kratší, než tvá minimální verze v C#.

Nahoru Odpovědět
30.8.2012 14:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
RainbowShaggy:2.10.2012 20:17

Omlouvám se, že otevírám 2 měsíce toto téma, ale co když potřebuji stáhnout více souborů?

Děkuji

 
Nahoru Odpovědět
2.10.2012 20:17
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na RainbowShaggy
David Jančík:2.10.2012 20:29

Například kolekce a foreach.

Nahoru Odpovědět
2.10.2012 20:29
Zapomeň, že je to nemožné a udělej to ;)
Avatar
RainbowShaggy:2.10.2012 20:31

Nějaký příklad by nebyl? V C# nedělám zrovna dlouho :(

 
Nahoru Odpovědět
2.10.2012 20:31
Avatar
David Jančík
Vlastník
Avatar
David Jančík:2.10.2012 20:37

Vycházej z mého příspěvku výše: http://www.itnetwork.cz/…fe4d8d6c9915#…

Soubory, které chceš stáhnou si hodíš například do List

List<string> Urls = new List<string>();
Urls.Add("http://www.itnetwork.cz/download2.php?file=505b0c67d08e0&name=ISIM_setup.exe");
Urls.Add("http://www.itnetwork.cz/download2.php?file=5065548f7c5a8&name=MenovaKalkulacka.zip");

foreach (string File in Urls)
{
   webClient.DownloadFileAsync(new Uri(File), @"c\cesta\soubor");
}
Editováno 2.10.2012 20:49
Nahoru Odpovědět
2.10.2012 20:37
Zapomeň, že je to nemožné a udělej to ;)
Avatar
RainbowShaggy:2.10.2012 20:42

Takže to bude vypadat nějak takhle?

private void button1_Click(object sender, EventArgs e)
        {
            WebClient webClient = new WebClient();
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

            List<string> Urls = new List<string>();
            Urls.Add("http://www.itnetwork.cz/download2.php?file=505b0c67d08e0&name=ISIM_setup.exe");
            Urls.Add("http://www.itnetwork.cz/download2.php?file=5065548f7c5a8&name=MenovaKalkulacka.zip");

            foreach (string File in Urls)
            {
                webClient.DownloadFileAsync(new Uri(File), @"c:\cesta\soubor");
            }
        }

        private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }
        private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("Stahování bylo úspěšně dokončeno");
        }
Editováno 2.10.2012 20:48
 
Nahoru Odpovědět
2.10.2012 20:42
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na RainbowShaggy
David Jančík:2.10.2012 20:43

Jop, to by mělo fungovat.

Nahoru Odpovědět
2.10.2012 20:43
Zapomeň, že je to nemožné a udělej to ;)
Avatar
RainbowShaggy:2.10.2012 20:45

Díky moc, jen u foreach mi to píše tohle:

No overload for method 'DownloadFileAsync' takes 1 arguments

 
Nahoru Odpovědět
2.10.2012 20:45
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na RainbowShaggy
David Jančík:2.10.2012 20:47

Jó promiň, ještě výstupní cesta, kam se to má uložit. Editnu to.

Nahoru Odpovědět
2.10.2012 20:47
Zapomeň, že je to nemožné a udělej to ;)
Avatar
David Jančík
Vlastník
Avatar
Odpovídá na RainbowShaggy
David Jančík:2.10.2012 20:51

A jméno můžeš zjistit takto:

string headerContentDisposition = webClient.ResponseHeaders["content-disposition"];
string fileName = new ContentDisposition(headerContentDisposition).FileName;
Nahoru Odpovědět
2.10.2012 20:51
Zapomeň, že je to nemožné a udělej to ;)
Avatar
RainbowShaggy:2.10.2012 20:59

Takže výsledek bude takhle?
Pokud ano, kam mám teda zadat cestu k uložení?

private void button1_Click(object sender, EventArgs e)
        {
            WebClient webClient = new WebClient();
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

            List<string> Urls = new List<string>();
            Urls.Add("http://www.itnetwork.cz/download2.php?file=505b0c67d08e0&name=ISIM_setup.exe");
            Urls.Add("http://www.itnetwork.cz/download2.php?file=5065548f7c5a8&name=MenovaKalkulacka.zip");

            foreach (string File in Urls)
            {
                string headerContentDisposition = webClient.ResponseHeaders["content-disposition"];
                string fileName = new ContentDisposition(headerContentDisposition).FileName;
                webClient.DownloadFileAsync(new Uri(File), @"c:\cesta\" + fileName);
            }
        }

        private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }
        private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            MessageBox.Show("Stahování bylo úspěšně dokončeno");
        }
Editováno 2.10.2012 21:03
 
Nahoru Odpovědět
2.10.2012 20:59
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 50 zpráv z 69.