Pole, cykly a práce se soubory

8. díl - Pole, cykly a práce se soubory

Tomáš Herceg       14.05.2007       VB.NET, I/O operace       27369 zobrazení

V tomto díle si vysvětlíme základy práce s komponentou ListView, naučíme se cyklus While a naučíme se používat objekty StreamReader a StreamWriter ke čtení a zápisu do textových souborů. A začneme programovat aplikaci pro správu příjmů a výdajů v domácnostech.

V minulém díle jsme si vysvětlili, jak se pracuje s poli, v tomto díle si ukážeme, jak se pracuje na disku se soubory, jak z nich čteme text a jak jej můžeme do souborů zapisovat. Ještě před tím si ale ukážeme další druh cyklu, a to cyklus While.

Cyklus While

Cyklus While se používá v případech, že potřebujeme opakovat nějaký příkaz tak dlouho, dokud se něco nestane, a jakmile se to stane, opakování skončí a pokračujeme dál. Jeho struktura vypadá následovně:

While <podmínka>
    <příkazy>
End While

Řádky uvnitř cyklu se opakují, zatímco platí podmínka. Jakmile podmínka platit přestane, cyklus se ukončí a pokračuje se dalším příkazem. Nám se to bude hodit při čtení souboru. Budeme totiž číst postupně po řádcích, dokud je nepřečteme všechny. Rozdíl mezi For cyklem a While cyklem je mimojiné v tom, že u For cyklu ještě před jeho zahájením víme, kolikrát se zopakuje. Nemusíme znát konkrétní číslo, ale musíme mít počet opakování v nějaké proměnné. U While cyklu ovšem nevíme, kolik řádků soubor má (a to se rychle zjistit nedá). Zkrátka čteme, dokud nenarazíme na konec souboru. Je to jako když zatloukáte hřebík - dáváte údery kladivem, dokud není hřebík zatlučený, zkrátka opakujete akci úderu kladiva, dokud platí podmínka, že hřebík ještě není zatlučený.

Práce se soubory

Soubory můžeme dělit do různých skupin, nás však zajímá dělení podle typu dat uvnitř souboru. Pokud to velmi zjednoduším, soubory se dělí na textové a binární. Zatím budeme pracovat se soubory textovými, které (jak ostatně z jejich názvu plyne) obsahují text.

 Příjmy a výdaje

Jak asi správně tušíte, napíšeme si velmi jednoduchou aplikaci pro příjmy a výdaje domácnosti. Při tom se naučíme pracovat s komponentou ListView, což je seznam s rozšířenými možnostmi. Data si při startu načteme a při ukončení programu uložíme do textového souboru.

Spusťte si tedy Visual Basic, vytvořte novou Windows Application a v průzkumníkovi projektu klikněte na název projektu pravým tlačítkem a vyberte Add / New Item.... V dialogovém okně pro výběr typu položky vyberte Text File a pojmenujte nový soubor jako database.txt. Po jeho přidání na něj v průzkumníkovi projektu klikněte a jeho vlastnost Copy To Output Directory nastavte na Copy If Newer. Výsledný program se totiž spouští z jiného umístění než máme soubory projektu, tímto nastavením zajistíme, že se tam zkopíruje vždy, když bude třeba.

Nyní na tento soubor dvakrát klikněte, aby se nám otevřel v editoru. Zkopírujte do něj obsah tohoto pole:

10.1.2007
42758
Výplata
13.1.2007
-578
Platba v supermarketu
15.1.2007
-3000
Výběr z bankomatu
19.1.2007
-1000
Výběr z bankomatu
21.1.2007
1200
Moje narozeniny 
23.1.2007
-1000
Elektřina
23.1.2007
-5000
Výběr z bankomatu
24.1.2007
-2000
Výběr z bankomatu
24.1.2007
-340
Plyn - záloha
25.1.2007
-1000
Výběr z bankomatu
26.1.2007
-799
Platba za oblečení
26.1.2007
-600
Voda - záloha
27.1.2007
-11537
Hypotéka

Každý záznam je v souboru zapsán na třech řádcích. První řádek obsahuje datum, druhý částku (kladná = příjmy, záporná = výdaje) a třetí popis finanční operace.

Na formulář si přidejte komponentu ListView. Jak jsem již psal před chvílí, jedná se o rozšířený ListBox, který podporuje obrázky a více sloupců pro jeden záznam, kromě toho dokáže také zobrazit položky jako ikony, stejně jako Průzkumník Windows. Pod tuto komponentu přidejte 3 tlačítka - Přidat, Upravit a Odstranit. Pomocí nich budeme později manipulovat se záznamy v aplikaci.

Načtení dat do seznamu

Načtení dat probíhá při spouštění aplikace, dvakrát tedy klikněte na plochu formuláře (ne na žádnou komponentu ani na titulkový pruh okna). Měla by se vám vytvořit procedura Form1_Load. Pokud ne, kliknuli jste špatně (asi jste měli vybranou nějakou komponentu).

Nyní se musíme naučit pracovat se soubory. Pro čtení souboru použijeme objekt StreamReader. A co že to ten objekt je? No o tom by se dal napsat celý článek. Nám bude stačit, když si prozatím zapamatujeme, že je to jakýsi soubor funkcí, procedur a vlastností, od kterého můžeme vytvořit několik exemplářů (instancí), které jsou na sobě nezávislé. Typickým objektem je třeba tlačítko. Na formulář můžeme umístit 30 tlačítek, která jsou prakticky vzato stejná. Akorát mají každé trochu jiné vlastnosti, takže na každém je jiný text, každé má jinou pozici a třeba i velikost, barvu atd. Ale v principu je to tlačítko a všechna tlačítka dělají to samé. Každé tlačítko je ale na formuláři samostatné, pokud změníme jedno tlačítko, ostatní zůstanou stejná.

Objekt se deklaruje podobně jako proměnná, akorát za slovo As musíme dát ještě slovíčko New, které říká, že se jedná o objekt. Objekty také provádí většinou složitější funkce. Objekt StreamReader slouží ke čtení textových souborů. Vše, co pracuje se soubory, najdeme většinou ve jmenném prostoru System.IO. Jmenné prostory jsou něco jako kategorie nebo složky - oddělují se tečkou a třídí nám všechny součásti .NET Frameworku podle toho, co dělají. Pokud chceme tedy přistupovat k objektu StreamReader, musíme napsat IO.StreamReader. Standardně totiž nemáme System.IO naimportovaný, importy se naučíme později.

Objekt StreamReader má několik metod (což je procedura nebo funkce, která pracuje s tímto objektem). Pro nás je důležitá metoda ReadLine, která přečte ze souboru jeden řádek. Pokud tedy vytvoříme tento objekt a zavoláme tuto metodu, vrátí nám první řádek v souboru. Pokud ji zavoláme znovu, vrátí druhý řádek atd. a tak to pokračuje, dokud nedojdeme na konec souboru. Tento objekt má také vlastnost EndOfStream, která má ze začátku hodnotu False a pokud dojdeme na konec souboru, změní se její hodnota na True. A to je právě podmínka, kterou potřebujeme ve While cyklu. Po přečtení souboru nesmíme zapomenout tento soubor zavřít, aby se zpřístupnil pro ostatní aplikace, a to zavoláním metody Close. K metodám přistupujeme stejně jako k vlastnostem a vlastnosti už známe. Napíšeme název objektu, tečku a pak název metody nebo vlastnosti, se kterou chceme pracovat.

Otevření a zavření souboru vypadá takto (samotné čtení obsahu musí být mezi těmito dvěma řádky):

        Dim soubor As New IO.StreamReader("database.txt")       'otevřít soubor
        soubor.Close()                                          'zavřít soubor

Vytvoření objektu tedy musí obsahovat klíčové slovo New. Některé objekty vyžadují při vytváření ještě zadání nějakých parametrů (ty se píší do závorky a oddělují čárkou, stejně jako u funkcí či procedur).

Upozorňuji raději znovu, že soubor je třeba po dokončení práce s ním zavřít! Rozhodně není dobré spoléhat na to, že s ukončením aplikace se soubor odemkne a bude přístupný ostatním!

Nyní sestavíme While cyklus. Objekt StreamReader má vlastnost EndOfStream, která bude celou dobu False a na konci souboru se změní na True. Podmínka While cyklu ovšem musí mít celou dobu hodnotu True (musí platit) a jakmile se v ní objeví False (platit přestane), cyklus končí. Opakovat tedy musíme, zatímco soubor.EndOfStream = False

Pokud si představíme podmínku a = 6, její význam je jasný. Výsledkem tohoto výrazu je ale hodnota True nebo False. Pokud ale pracujeme s proměnnou typu Boolean, která True nebo False vrací sama o sobě, nemusíme psát a = True, stačí pouze napsat a. Pokud potřebujeme opačný případ, tedy a = False, lze napsat i Not a. Je prakticky jedno, který způsob si vyberete, ale zvyklostí bývá používat a a Not a, je to méně psaní. I já se toho tedy budu držet, je to čistě věc zvyku. Podmínkou našeho While cyklu tedy nebude (i když by mohlo být, funguje to stejně) soubor.EndOfStream = False, ale Not soubor.EndOfStream. Zvláště při čtení souboru až do konce se v drtivché většině případů (i v jiných jazycích) používá raději operátor Not. Je to taková "ustálená konstrukce".

Do předchozího kódu tedy vložíme cyklus a bude to vypadat nějak takhle:

        Dim soubor As New IO.StreamReader("database.txt")       'otevřít soubor
        While Not soubor.EndOfStream        'číst, dokud nejsme na konci souboru
            Dim datum As DateTime = CDate(soubor.ReadLine())    'načíst první řádek z trojice - datum
            Dim castka As Double = CDbl(soubor.ReadLine())      'načíst druhý řádek z trojice - částka
            Dim text As String = soubor.ReadLine()              'načíst třetí řádek z trojice - popis transakce



End While soubor.Close()                                          'zavřít soubor

Nás teď budou zajímat tři řádky uvnitř cyklu. Zakládáme v nich tři proměnné a do každé vložíme jeden řádek. Nejprve načítáme datum (pokud jsme si to ještě neříkali, tak si zapamatujte, že pro datum máme datový typ DateTime). Převodní funkce na datum je CDate. Zavolání metody soubor.ReadLine() vrátí další řádek v souboru.Na druhém řádku je částka, což je číslo (částka může být desetinná, proto Double), načtený řádek musíme opět převést. Třetí řádek načteme normálně, je to text. Převádět tedy nemusíme.

Nastavení komponenty ListView

Než použijeme komponentu ListView jako seznam, musíme jí změnit některé vlastnosti. Nastavte jí tedy vlastnost View na hodnotu Details a poklepejte na vlastnost Columns. V editoru kolekcí přidejte 3 sloupečky (tlačítkem Add) a pokud jeden z těchto sloupečků vyberete, můžete mu nastavovat vlastnosti. Prvnímu tedy nastavte hodnotu vlastnosti Text na Datum, druhému na Částka a třetímu na Popis. Pak klikněte na OK. Roztáhněte ještě sloupečky tak, aby to vypadalo pěkně.

Přidávání položek do ListView

 Komponenta ListView je o něco složitější než ListBox. Jednotlivé položky tohoto seznamu jsou objekty ListViewItem. Pro každou načtenou trojici musíme vytvořit nový objekt této položky seznamu. Objekt ListViewItem má mnoho vlastností, jednou z nich je Text, což je obsah prvního sloupečku. Do něj vložíme datum, automaticky se převede na String. Pokud chceme přidat hodnotu dalšího sloupečku, přidáme ji do vlastnosti SubItems metodou Add. Parametrem je již jen text sloupečku. Postupně tedy přidáme nejprve částku a pak popis. Nakonec nově vytvořenou položku ListViewItem musíme přidat do daného seznamu (nepřidá se sama, pokud by na formuláři bylo více seznamů, nevěděli bychom, do kterého). Přidání provedeme opět předáním položky metodě Add vlastnosti Items komponenty ListView.

Celý kód procedury tedy bude vypadat takto (jiný tam zatím nemáme):

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'načtení vstupu
        Dim soubor As New IO.StreamReader("database.txt")       'otevřít soubor
        While Not soubor.EndOfStream                            'číst, dokud nejsme na konci souboru
            Dim datum As DateTime = CDate(soubor.ReadLine())    'načíst první řádek z trojice - datum
            Dim castka As Double = CDbl(soubor.ReadLine())      'načíst druhý řádek z trojice - částka
            Dim text As String = soubor.ReadLine()              'načíst třetí řádek z trojice - popis transakce

            'přidat položku do seznamu
            Dim polozka As New ListViewItem()                   'vytvořit novou položku seznamu
            If castka < 0 Then polozka.ForeColor = Color.Red    'pokud je částka menší než nula, obarvit položku červeně
            polozka.Text = datum                                'vypsat datum
            polozka.SubItems.Add(castka)                        'přidat druhý sloupeček s částkou
            polozka.SubItems.Add(text)                          'přidat třetí sloupeček s popisem
            ListView1.Items.Add(polozka)                        'přidat položku do seznamu
        End While

        soubor.Close()                                          'zavřít soubor
    End Sub

Pokud program nyní spustíte, uvidíte načtené položky. Výdaje se obarví na červeno kvůli podmínce, která nastaví v případě částky nižší než 0 hodnotu vlastnosti ForeColor na červenou (barva textu).

 Uložení dat

V tomto díle ještě uložíme data a zbytek dokončíme v díle příštím. Abych vás zbytečně nezahlcoval.

Nyní již počet položek známe, takže můžeme provést cyklus For. Počet položek je k mání v ListView1.Items.Count. Položky se ale číslují od nuly (jako ostatně všechno v .NETu). Zápis se provádí pomocí objektu StreamWriter, nový řádek přidáme metodou WriteLine. Opět nezapomeňte soubor zavřít.

V editoru kódu nahoře vyberte v prvním rozbalovacím seznamu položku Form1 Events a ve druhém událost FormClosing, která se spouští během uzavírání formuláře.

Jednotlivé položky jsou uloženy v ListView1.Items, což je tzv. kolekce. Chová se podobně jako pole, ale nemá omezenou velikost a má metodu Add, kterou můžeme položky přidávat na konec. První položku tedy najdeme pod ListView1.Items(0). Každá položka má v sobě svoji kolekci SubItems, což jsou jednotlivé sloupečky dané položky. První obsahuje datum, sruhý částku a třetí popis. Jednoduše je tedy vypíšeme:

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        'uložit data
        Dim soubor As New IO.StreamWriter("database.txt")           'otevřít soubor
        For i As Integer = 0 To ListView1.Items.Count - 1           'projít všechny položky seznamu
            soubor.WriteLine(ListView1.Items(i).SubItems(0).Text)   'zapsat datum
            soubor.WriteLine(ListView1.Items(i).SubItems(1).Text)   'zapsat částku
            soubor.WriteLine(ListView1.Items(i).SubItems(2).Text)   'zapsat popis
        Next
        soubor.Close()                                              'zavřít soubor
    End Sub

Celý program vypadá takto:

První část aplikace Příjmy a výdaje

V příštím díle naprogramujeme tlačítka a umožníme upravovat, přidávat a odstraňovat záznamy. Doufám, že jsou vám po dnešku jasné oba dva cykly, a pokud ne, napište, abych věděl, jestli mám vysvětlovat více nebo to takhle stačí. S objekty si nelamte hlavu, pro začátečníky je to komplikovanější, ale po pár článcích to jistě pochopíte.

 

hodnocení článku

4 bodů / 4 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Všechny díly tohoto seriálu

18. Dědičnost 06.10.2008
17. Objektově orientované programování - základy 30.06.2008
16. Třídy a funkce .NET frameworku, o kterých je dobré vědět 31.12.2007
15. Práce se soubory, úvod do objektově orientovaného programování 19.11.2007
14. Vykreslujeme graf 31.08.2007
13. Úvod do grafiky 27.08.2007
12. Práce s textem a řetězci 17.08.2007
11. Kolekce a pole 27.07.2007
10. Funkce a procedury 01.06.2007
9. Přidáváme druhý formulář 18.05.2007
8. Pole, cykly a práce se soubory 14.05.2007
7. Pole 09.05.2007
6. Cyklus For 05.05.2007
5. Složitější podmínky a rozhodovací struktury 26.04.2007
4. Podmínky a operátory 26.04.2007
3. Proměnné a datové typy 25.04.2007
2. Začínáme programovat 25.04.2007
1. Úvod, vývojové prostředí a základní pojmy 25.04.2007

 

Mohlo by vás také zajímat

Tipy a triky pro ASP.NET - díl 5.: Komponenta pro zadávání data a času

V tomto díle se podíváme na to, jak s využitím komponenty CalendarExtender z knihovny AjaxControlToolkit napsat komponentu pro snadné zadávání data, která podporuje validaci a datové zdroje.

Windows Presentation Foundation (WPF) - díl 6.: Základy pozicování

Pozicování je velká přednost technologie WPF. Dovoluje připravovat dynamické rozložení prvků s předvídatelným chováním při změně nejen velikosti okna, ale i elementů uvnitř něj. V tomto díle se věnuji základním principům pozicování.

Windows Presentation Foundation (WPF) - díl 10.: Návrh přihlašovacího formuláře - TextBox, PasswordBox, CheckBox a Label

Jak navrhnout jednoduchý přihlašovací formulář v technologii WPF. Zároveň popíši další čtyři ze základních komponent: TextBox, PasswordBox, CheckBox a Label.

 

 

Nový příspěvek

 

Diskuse: Pole, cykly a práce se soubory

Zkoušel jsem vytvořit program podle vašeho zajímavého návodu, ale jsem úplný začátečník a něco je špatně. Při spuštění programu se mi nezobrazuje obsah v ListView (buď je prázdný, nebo je tam jeden řádek)


Public Class Form1

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        'uložit data
        Dim soubor As New IO.StreamWriter("C:\database.txt")       'otevřít soubor
        For i As Integer = 0 To ListView1.Items.Count - 1       'Projít všechny položky seznamu
            soubor.WriteLine(ListView1.Items(i).SubItems(0).Text) 'zapsat datum
            soubor.WriteLine(ListView1.Items(i).SubItems(1).Text) 'zapsat částku
            soubor.WriteLine(ListView1.Items(i).SubItems(3).Text) 'zapsat popis
        Next
        soubor.Close()                                            'zavřít soubor
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim soubor As New IO.StreamReader("C:\database.txt")             'otevřít soubor
        While Not soubor.EndOfStream                    'šíst, dokud nejsme na konci souboru
            Dim datum As DateTime = CDate(soubor.ReadLine())        'načíst druhý řádek z trojice - datum
            Dim castka As Double = CDbl(soubor.ReadLine())          'načíst třetí řádek z trojice - popis

            'přidat položku do seznamu
            Dim polozka As New ListViewItem()                       'vytvořit novou položku seznamu
            If castka < 0 Then polozka.ForeColor = Color.Red 'zaporné částky obarveny červeně
            polozka.Text = datum                                    'vypsat datum
            polozka.SubItems.Add(castka)                            'přidat druhý sloupeček s částkou
            polozka.SubItems.Add(Text)                              'přidat třetí sloupeček s popiskem
            ListView1.Items.Add(polozka)                            'přidat položku do seznamu

        End While                                                   'zavřít soubor

        soubor.Close()
    End Sub

    Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim dlg As New Dialog1()                                'vytvořit objekt nového okna
        If dlg.ShowDialog() = DialogResult.OK Then  'zobrazit okno a počkat na zavření, pokud je ok, tak...

            'zjistit hodnoty z okna
            Dim datum As DateTime = dlg.DateTimePircker1.Value  'zjistitdatum
            Dim castka As Double = dlg.NumericUpDown1.Value     'zjistit částku
            Dim text As String = dlg.TextBox1.Text              'zjistit popis

            Dim polozka As New ListViewItem()                   'vytv ořit novou položku seznamu
            If Castka < 0 Then polozka.ForeColor = Color.Red 'pokud je částka zaporná, obravit na červeno
            polozka.Text = datum.ToShortDateString()            'vypsat datum
            polozka.SubItems.Add(castka)                         'přidat druhý sloupeček s částkou
            polozka.SubItems.Add(text)                           'přidat třetí sloupeček s popisem
            ListView1.Items.Add(polozka)                         'přidat položku do seznamu
        End If
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If ListView1.SelectedItems.Count = 0 Then Exit Sub 'pokud není vybrána žádná položka, nic neupravovat

        With ListView1.SelectedItems(0)
            Dim dlg As New Dialog1()            'vytvoří objekt nového okna

            'nastavit do okna hodnoty ze seznamu
            dlg.DateTimePicker1.Value = CDate(.SubItems(0).Text)            'nastavit datum
            dlg.NumericUpDown1.Value = CDbl(.SubItems(1).Text)              'nastavit částku
            dlg.TextBox1.Text = .SubItems(2).Text                           'nastavit popis

            If dlg.ShowDialog() = DialogResult.OK Then 'zobrazit okno a počkat na uzavření, pokud je OK tak...

                'zjistit hodnoty z okna
                Dim datum As DateTime = dlg.DateTimePicker1.Value       'zjistit datum
                Dim castka As Double = dlg.NumericUpDown1.Value         'zjistit částku
                Dim text As String = dlg.TextBox1.Text                  'zjistit popis

                'pokud je částka menší než nula, Obarvit položku červeně, jinak ji obarvit černě
                If castka < 0 Then .ForeColor = Color.Red Else .ForeColor = Color.Black
                .SubItems(0).Text = datum.ToShortDateString()           'vypsat datum
                .SubItems(1).Text = castka                          'přidat druhý sloupec s částkou
                .SubItems(2).Text = text                            'přidat třetí sloupec s popisem

            End If
        End With
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        If ListView1.SelectedItems.Count = 0 Then Exit Sub 'pokud není vybraná žádná položka, nic se nestane

        ListView1.Items.Remove(ListView1.SelectedItems(0))
    End Sub
End Class

Kontroloval jsem to po sobě, ale nic jsem nenašel. Pokud něco najdete tak mi prosím dejte vědět.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zdravím,

taky jsem kvůli tomuhle problému začal prohledávat forum :D Ale zrovna před chvílí jsem zkoušel a tuším kde je problém

Dim datum As DateTime = CDate(soubor.ReadLine())

v tomhle případě mi to padá, nevím proč, když jsem tento kus kódu "osekl" a nechal jen:

soubor.ReadLine()

tak bylo vše v pohodě (ale musel jsem ještě zakomentovat samozřejmě řádek "polozka.Text = datum")

A jdu zkoumat dál, co je tam teda špatně ....(omlouvám se, ale píšu z jiného pc než mám kód)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím Matysku Kady,

v kódu u Form1_Load jste špatně opsal kód z těchto stránek.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim soubor As New IO.StreamReader("C:\database.txt")             'otevřít soubor
        While Not soubor.EndOfStream                    'šíst, dokud nejsme na konci souboru
            Dim datum As DateTime = CDate(soubor.ReadLine())        'načíst druhý řádek z trojice - datum
            Dim castka As Double = CDbl(soubor.ReadLine())          'načíst třetí řádek z trojice - popis
            Dim Text As String = soubor.ReadLine()                  'to je ten řádek co vám chybí
 
            'přidat položku do seznamu
            Dim polozka As New ListViewItem()                       'vytvořit novou položku seznamu
            If castka < 0 Then polozka.ForeColor = Color.Red 'zaporné částky obarveny červeně
            polozka.Text = datum                                    'vypsat datum
            polozka.SubItems.Add(castka)                            'přidat druhý sloupeček s částkou
            polozka.SubItems.Add(Text)                              'přidat třetí sloupeček s popiskem
            ListView1.Items.Add(polozka)                            'přidat položku do seznamu
 
        End While                                                   'zavřít soubor
 
        soubor.Close()
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím Matysku Kady,

v kódu u Form1_Load jste špatně opsal kód z těchto stránek.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim soubor As New IO.StreamReader("C:\database.txt")             'otevřít soubor
        While Not soubor.EndOfStream                    'šíst, dokud nejsme na konci souboru
            Dim datum As DateTime = CDate(soubor.ReadLine())        'načíst druhý řádek z trojice - datum
            Dim castka As Double = CDbl(soubor.ReadLine())          'načíst třetí řádek z trojice - popis
            Dim Text As String = soubor.ReadLine()                  'to je ten řádek co vám chybí
 
            'přidat položku do seznamu
            Dim polozka As New ListViewItem()                       'vytvořit novou položku seznamu
            If castka < 0 Then polozka.ForeColor = Color.Red 'zaporné částky obarveny červeně
            polozka.Text = datum                                    'vypsat datum
            polozka.SubItems.Add(castka)                            'přidat druhý sloupeček s částkou
            polozka.SubItems.Add(Text)                              'přidat třetí sloupeček s popiskem
            ListView1.Items.Add(polozka)                            'přidat položku do seznamu
 
        End While                                                   'zavřít soubor
 
        soubor.Close()
    End Sub
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Test

int[] pole;

public Form1()

{

InitializeComponent();

}

private void Generuj(int x = 5)

{

Random rnd = new Random();

pole = new int[x];

for (int i = 0; i < x; i++)

{

pole[i] = rnd.Next(-10, 10);

}

}

private void Form1_Load(object sender, EventArgs e)

{

Generuj();

}

private void btnLoadForeach_Click(object sender, EventArgs e)

{

rtb.Text = "";

rtb.Text += $"Výpis pole o velikosti {pole.Length}";

int y = 0;

foreach (int x in pole)

{

rtb.Text += Environment.NewLine;

rtb.Text += $"p[{y++}] - {x}";

}

}

private void btnLoadFor_Click(object sender, EventArgs e)

{

rtb.Text = "";

rtb.Text += $"Výpis pole o velikosti {pole.Length}";

for (int i = 0; i < pole.Length; i++)

{

rtb.Text += Environment.NewLine;

rtb.Text += $"p[{i}] - {pole[i]}";

}

}

private void btnWrite_Click(object sender, EventArgs e)

{

Generuj((int)nud.Value);

}

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Aplikaci jsem si pro sebe lehce upravoval aby mi zobrazovala a počítala koeficient hráčů z jedné hry, fungovalo by to takhle:

zadám jméno hráče, zadám jméno závodu, zadám pořadí hráče v závodu a kolik hráčů tento závod jelo (koeficient by to spocitalo- poradi / pocethracu * 40). Aplikace po zápisu fungovala dobře až na to že se mi data z database.txt nenačetla a po ukončení ani neuložila. Může mi někdo prosím poradit co s tím

?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Aplikaci jsem si pro sebe lehce upravoval aby mi zobrazovala a počítala koeficient hráčů z jedné hry, fungovalo by to takhle:

zadám jméno hráče, zadám jméno závodu, zadám pořadí hráče v závodu a kolik hráčů tento závod jelo (koeficient by to spocitalo- poradi / pocethracu * 40). Aplikace po zápisu fungovala dobře až na to že se mi data z database.txt nenačetla a po ukončení ani neuložila. Může mi někdo prosím poradit co s tím

?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

ahojte, neviete mi niekto poradit , ked stlacim F5, program mi pise takuto hlasku :

Conversion from string "15.1.2007" to type 'Date' is not valid.

a nasledovne nebezi, predpokladam, ze mam nieco, zle, ale neviem prist na to ako to mam opravit.

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'načtení vstupu

Dim soubor As New IO.StreamReader("database.txt") 'otevřít soubor

While Not soubor.EndOfStream 'číst, dokud nejsme na konci souboru

Dim datum As DateTime = CDate(soubor.ReadLine()) 'načíst první řádek z trojice - datum

Dim castka As Double = CDbl(soubor.ReadLine()) 'načíst druhý řádek z trojice - částka

Dim text As String = soubor.ReadLine() 'načíst třetí řádek z trojice - popis transakce

'přidat položku do seznamu

Dim polozka As New ListViewItem() 'vytvořit novou položku seznamu

If castka < 0 Then polozka.ForeColor = Color.Red 'pokud je částka menší než nula, obarvit položku červeně

polozka.Text = datum 'vypsat datum

polozka.SubItems.Add(castka) 'přidat druhý sloupeček s částkou

polozka.SubItems.Add(text) 'přidat třetí sloupeček s popisem

ListView1.Items.Add(polozka) 'přidat položku do seznamu

End While

soubor.Close() 'zavřít soubor

End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ahoj, měl jsem stejný problém. Problém je v americké stylu formátování data. To znamená že musíš dát nejdříve měsíce a poté dny...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Chcem sa pekne poďakovať za tento perfektný seriál. Veľmi oceňujem jednoduchosť a zrozumiteľnosť písania článkov s ohľadom na úplných začiatočníkov. Je to veľmi hodnotný seriál, dúfam, že bude pokračovať. Ešte raz ďakujem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Dobrý den, chci se zeptat jestli jde nastavit univerzální cesta k textovýmu souboru.

Dim file As String = "C:\Users\owner\Desktop\ukladani.txt"

Dim reader As StreamReader = New StreamReader(file, System.Text.Encoding.UTF8)

Myslím tím, abych mohl program přenášet na víc počítačů a neměnit pořád cestu k textovýmu souboru. Určitě vím, že by mělo jít, aby se cesta automaticky upravila na stejnou cestu jako je uložen samotný program. Bohužel jsem na to ve VB nepřišel.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Zdravim, tak jsem z toho malinko zmatený co jsem udělal. Mám sestavený kód podle předlohy:

Dim soubor As New IO.StreamReader("database.txt")

Tak se mi VB zastavil na podmíce while not soubor.endofstream, že si mám zkontrolovat jestli není soubor již uzavřen, že nemůže číst. Zkusil jsem změnit kód na:

Dim soubor As New System.IO.StreamReader("database.txt")

A najednou to maká. Nejzajímavější je, že když jsem slovo System. posléze umazal, čili to bylo jako předtím, tak to funguje bez problémů... Je mi to zvláštní..

BTW pod mozilla Firefox v6.0.2. nejsou vidět tlačítka, proto kód píšu jako text..)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Dobrý den,

Když jsem napsal veškerý zdrojový kód, přesně do písmene a chtěl spustit program tak mi to napsalo tuhle chybu:

Error While trying to run project: Nelze načíst soubor nebo sestavení Pole\,Cykly a práce se soubory nebo jeden z jejich závislých prvků. Zadaný název sestavení nebo základ kódu byl neplatný. (Vyjímka na základě hodnoty HRESULT:0x80131047)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Bylo by fajn, kdyby program na zacatku overil pritomnost souboru database.txt aby to nehazelo chybu, kdyz tam neni. Pokud nenalezne, aby nabidl jeho vytvoreni...

Nema nekdo tuseni jaka funkce to dela? :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Setkal jsem se s blokem příkazů Try...Catch

Př.:

Try      'zachytit chyby
'příkazy, kde víte, že by se mohla stát chyba, třeba 
'se nevyhledá database.txt
Catch
'příkazy, které se spustí pokud se chyba stane. Např.:
MsgBox("Vytvořte textový soubor!")
Finally
'příkazy, které se spustí ať už chyba nastane nebo ne
End Try

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Dobrý deň,

myslím si, že deklarovať premenné vnútri cyklu nie je dobré (mám skúsenosti s VB6, tam to evidentne zdržuje, predpokladám, že vo VB.NET je to obdobné). Nebolo by lepšie najskôr zadefinovať premenné a vnútri cyklu do nich už len vkladať dáta?

napr. miesto tohoto kódu:

for i = 1 to 1000
  Dim a as Integer
  a = a + i
next i

ja by som to napísal takto:

Dim a as Integer
for i = 1 to 1000
  a = a + i
next i

Dave.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

PS. Pozor ide o princíp, samozrejme že po zbehnutí kódov a bude obsahovať iné číslo :(

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Oba kódy, které jste sem poslal, nedělají to samé. Pokud nadeklaruji proměnnou uvnitř cyklu, pak to dělám v případě, že to potřebuji. Jakmile daný krok toho cyklu skončí, proměnná nadeklarovaná uvnitř přestane existovat a v dalším kroku se vytvoří znovu. Funguje a dá se použít pouze uvnitř tohoto cyklu a v rámci jednoho kroku, hodnoty si nepamatuje. Jistěže deklarace proměnné má nějakou režii, ale ta je ve VB.NET zanedbatelná, řádově rychlejší než ve VB6. Nadeklarovat proměnnou uvnitř a vně cyklu je ve VB.NET naprosto stejně rychlé, akorát ty uvnitř cyklu se vytváří víckrát. Dávejte pozor, abyste uvnitř cyklů nevytvářeli objekty, pokud to opravdu nepotřebujete (dost často je to účel, vytvořit víc objektů, někdy ale potřebujete pracovat pouze s jedním).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No upravim to teda tak, aby oba kody robili to iste (ten predchadzajuci prispevok je moj, len som sa vtedy neprihlasil):

While Not soubor.EndOfStream 
Dim datum As DateTime = CDate(soubor.ReadLine())
End While

nebolo by to lepsie takto?:

Dim datum As DateTime

While Not soubor.EndOfStream 
DateTime = CDate(soubor.ReadLine())
End While

V prvom pripade totizto musi program xkrat deklarovat aj zapisat hodnotu do premennej, v druhom pripade deklaruje len raz. Aj ked zdeklarovanie premennej urobi aj jej "vynulovanie", ak som ju uz predtym pouzival.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Souhlasím,

myslím, že učit začátečníku, deklarovat proměnné v cyklu,

je principialní chyba. Je to výuka špatného návyku v programování.

Naopak by se před tím mělo varovat, stejným způsobem jako autor správně opakovaně zdůrazňuje potřebu uzavírání souboru.

Samozřejmě, že v krátkých cyklech to v¨nevadí,

ale začátečník je schpen to pak použít i v cyklech velmi rozsáhlých aniž mu dojdou důsledky.

No, nikdo nejme dokonalí. :-)

Jinak díky moc autorovi za seriál, též přecházím z VB6 a je pro mě velkým přínosem.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co je špatného na deklaraci proměnné v cyklu? Jaké špatné důsledky to má? Tady naopak je potřeba v každém průchodu cyklu vytvořit novou ListViewItem a jestli si na ni udělám novou proměnnou, která se po skončení průchodu cyklem zase zruší, nebo na to mít jednu, je úplně jedno, nezabere ani o bajt paměti víc.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Myslim, ze to kolega pred Vami vysvetlil pomerne jasne.

Jde o principalni chybu (slusne receno). Ze to nesezere byte pameti navic je irelevantni - navic efektivita kodu se nemeri jen obsazenou pameti...

Ucite tu zacatecniky spatnym navykum.

Proc je to spatny navyk tu uz nekdo take zminil: az Vam v te smycce nekdo zacne vytvaret slozity objekt a nebude mit ani tucha, ze je neco spatne, muzou uzivatele dekovat hadejte komu. A spolehat se na .NET je jizda po tenkem lede. Takze si to prosim neberte osobne a uvedenou vec napravte.

A mmch: je to pro zacatecniky, ale asi by se sluselo zminit alespon elementarni bezpecnost vyvoje kodu. Pokud Vam do database.txt sahnu a uprostred smazu jedinou radku, zacnou se dit veci, ze? Spolehat se na vlastni konstrukt plavouci na vode totiz patri k dalsim zlym navykum. A pokud pracujete v tymu, muze Vas to osklive vytrestat. Nezadam implementaci, ale alespon poznamka na okraj by nebyla od veci.

Hezky zbytek dne,

Adam F.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Slovní spojení principiální chyba mi přijde jako klišé. V čem je ta chyba? Ještě nikdo mi to nevysvětlil. Proč je to špatný návyk?

Deklarace proměnné uvnitř cyklu ve skutečnosti vůbec nezpomaluje - tohle vyoptimalizuje kompilátor, nebude tím kynout paměť a bude se to chovat úplně stejně. Zvláště když je to hodnotový typ.

Je nutné si uvědomit, že proměnná platí pouze v bloku kódu, kde je deklarována. Pokud ji napíšete do For cyklu, platí pouze v rámci jednoho kroku.

Naprosto logické mi přijde deklarovat proměnnou, kterou používáme pouze v rámci jednoho kroku, uvnitř tohoto kroku For cyklu - tím naznačujeme, co proměnná dělá. Pokud v každém kroku potřebujeme s tou proměnnou něco udělat, je to něco jiného a proměnná platí po celou dobu cyklu, deklarujeme ji tedy vně.

To, že se proměnné uvnitř cyklů nebo bloků dělat nemají, je hloupost - vadí to hlavně Delphíčkářům, protože ti museli vždy všechny proměnné deklarovat na začátku procedury. V .NETu je to irelevantní.

Váš argument s tím, že pak začátečníci v každém kroku dělají tuny objektů, což je zbytečné, platí jak kdy.

V tomto konkrétním případě potřebujeme vytvořit pro každý krok cyklu novou ListViewItem, je to tedy vytváření objektů v cyklu a je to nezbytné.

Samozřejmě pokud bychom vytvářeli nějaké pomocné objekty (třeba FileInfo, Bitmap nebo tak něco), které se dají znovupoužívat, je věc jiná, to by se dělat nemělo, ale v této situaci je to irelevantní.

Co se týče ochrany proti chybám v souboru, je to samozřejmě pravda, poznámka do čláknu by se hodila, ale nemůžete po začátečnících chtít, aby z nich vypadnul profesionální kód. Většina lidí u programování dlouho nevydrží a cílem těchto článků je hlavně, aby je to začalo bavit. Kontrola chyb v textovém souboru by celý kód výrazně zkomplikovala, správně by se ještě měly ošetřovat výjimky, minimálně IOException atd., ale tím bych odváděl pozornost od konkrétního problému, který tento článek řeší, a začátečníci by se v tom akorát ztratili a bylo by to k ničemu.

Za připomínky děkuji, ale deklarace proměnných a vytváření objektu je podstatný rozdíl (i když ve VB.NET, v C# je ten rozdíl vidět víc). Vezmu to v úvahu při revizi těchto článků, ke které se chystám.

Ale přesto trvám na tom, že na deklaraci proměnné uvnitř cyklu není nic špatného.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tohle mi není jasné jak to funguje.

for i = 1 to 10
  Dim Neco As Integer
 ...
 ...
Next

Znamená to že se v každém cyklu proměnná "Neco" deklaruje 10x?

To je blbost ne? Proč by se to dělalo? Stačí to přece jednou před cyklem.

Zkouším tohle:

Module Module1

    Sub Main()

		Dim Vysledek As Integer
		Dim Cyklus As Integer


		For Cyklus = 1 To 10

			Dim Cislo As Integer
			Dim Mezisoucet As Integer

			Cislo = 5
			Mezisoucet = Cislo + Cyklus
			Cislo += Vysledek

			Vysledek = Mezisoucet + Cislo
		Next


		Console.Write("Pokus")
		Console.WriteLine(Vysledek)
	End Sub

End Module

Proměnné Cislo a Mezisoucet si pamatuji hodnotu, takže se nedeklarují znovu.

Ale po úpravě na:

  Dim Cislo As Integer = 10
  Dim Mezisoucet As Integer = 10

se proměnné inicializují v každém cyklu.

Zrovna píšu na převod řetezce ze souboru do DB. Docela fuška. V cyklech mám takových proměných několik: mezisoucet, PrevodTextNaCislo, PrevodAdres, RadekZeSouboru ... hodne se tim zprehledni program.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Ahoj, chtěl jsem se zeptat jestli jde ve VB.net změnit koncovka např. ze *.txt na *.html ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

ahoj

-som uplny amater co sa tyka programovania ale bavi ma to a chcem sa naucit zaklady podla tychto vasich "navodov" ..

zatial som nemal ziadny problem, az do teraz ..

pri vasom vysvetleni mi ide uplne vsetko tak ako ma, a aj ked som zmenil jednu vec:

Dim A As New IO.StreamWriter("C:\test.txt")
        A.WriteLine("skuska")
        A.Close()

-zatial vsetko ok.

ale pytam sa , da sa to urobit tak aby ("C:\test.txt") som nahradil premennou a tym vlastne vybral priamo v spustenom programe , ze kam sa ten ???.txt subor ma zapisat ?

skusal som to formou comboboxu ale vobec som si s tym nevedel rady ..

program sa spustil , ale ked som stlacit buton pre zapisanie - padol !

vyzeralo to nejak takto :

 Dim C As String
        C = CStr(ComboBox1.SelectedItem)

        Dim A As New IO.StreamWriter(C)
        A.WriteLine("skuska")
        A.Close()

dakujem a chvalim autora sa vemi pekne spracovane navody !!

STANDO

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

napadlo mě udělat tohle

     Dim soubor As New IO.StreamReader("jmena.txt")
        While Not soubor.EndOfStream

            Dim text As String = soubor.ReadLine()
            Dim vysl() As String = text.Split(",")


            Dim polozka As New ListViewItem()

            polozka.Text = vysl(0)
            polozka.SubItems.Add(vysl(1))
            polozka.SubItems.Add(vysl(2))
            polozka.SubItems.Add(vysl(3))
            polozka.SubItems.Add(vysl(4))
        
            ListView1.Items.Add(polozka)
        End While

jenže když na jednom radku mam

jmeno,1,2

min čárek tak mi to hodi chybu

a kdyz to budu dělat tim ze tam dam carky navic tak to se mi zrovan nechce

jmeno,1,2,,

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jinak než doplňovat prázdné čárky to udělat nejde.Je to standardní postup - nebuďte líný,akorát si tak přiděláte problémy.Takto se standardně dělají formáty csv nebo exporty z DB.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ok a když mám třeba v dokumentu na konci nějaký znak a za tim znakem koment jak mám nastavit aby to četlo až po ten znak místo readtoend kterej čte do konce souboru nejspíš nějak přas IndexOf ale nevim jak to zapsat

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Zdravim. :)

co když mám ten .txt soubor zapsanej třeba

jmeno,1,2,3

jmeno,2,4,5,6

a nebudu to mít jednotlivě pod sebou ? jak to potom načtu do listview ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Debaty o tom, kde má být provedena deklarace proměnné, zda vně či uvnitř cyklu se mi zdá autorem článku dostatečně objasněna a není potřeba se v tom dále šťourat. Rovněž tak připomínky k zranitelnosti takovéhoto programu.......jedná se přece o příklad pro začátečníka a není ho potřeba zahlcovat hned všemi problémy, které se na něj sesypou. Já naopak oceńuji to, že autor jde po podstatě problému, který zrovna vysvětluje. Díky...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Koukam, že jsem asi trochu z jiného světa... u mě položka moje narozeniny znamená většinou výdaj, nikoli příjem :D.

Jinak díky za nápad deklarovat proměnnou uvnitř cyklu, nenapadlo by mě to z obavy deklarovat porměnou stejného názevu vícekrát, netušil jsem, že platí pouze pro konkrétní cyklus.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Vytvořil jsem si takovýho správce hesel, všechno funguje jen na jeden problém. ListView má 3 sloupce z textem, jak je uložit aby se při dalším spuštění načetli?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Pracuji s Visual Basic.net (Verze 2003), nepodařilo se mi při programování prográmku příjmy a výdaje nastavit ve vlastnostech u souboru database.txt Copy To Output Directory na Copy If Newer.Nevím kde to nastavit nenašel jsem to. Jsem úplný začátečník a jedu postupně Váš 18 dílný trénink, který CHVÁLÍM ! Je pro mě přehledný a do Lekce 8 jsem neměl žádný problém.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V solution exploreru oznac soubor database.txt a v okne Properties je vlastnost Copy to Output, (druha zezhora,) hned vedle je Do not copy. Misto toho vyber Copy if newer.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Dobry den, mel bych dotaz. Jak muzu ulozit text, ktery je videt pri otevreni souboru pomoci programu excel, z formatu xlsx do nejake promenne? Metoda readline objektu typu streamreader mi cte vsechny znaky, takze ten normalni text je k nepoznani.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

pusťte si tedy Visual Basic, vytvořte novou Windows Application a v průzkumníkovi projektu !!!klikněte na název projektu!!! pravým tlačítkem a vyberte Add / New Item.... Dobrý den, mohl byste mi prosím vysvetlit kam mám vlastně kliknout?? kde najdu ten název projektu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Solution Explorer (Ctrl-ALT-L) - prave tlacitko na nazev

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Při spuštění programu se mi objeví toto sdělení:

"File Not Found Exeption was unhandled"

Objekt "Databáze.txt" je samozřejmě uložena v adresáři Bin projktu, takže nevím.

milkub

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Já si vytvořil textový dokument na ploše WindowsXP a změnil jsem název na io.frg a přesunul jsem ho na céčko. V kódu jsem použil absolutní cestu.

Dim soubor As New IO.StreamReader("C:\io.frg")
            While Not soubor.EndOfStream
            Dim cpv As String = soubor.ReadLine()
            Dim datum_vyst As DateTime = CDate(soubor.ReadLine())
            Dim jmeno As String = soubor.ReadLine()
            
Dim polozka As New ListViewItem()
            If cpv = 1 Then polozka.BackColor = Color.Green 
            If cpv = 2 Then polozka.BackColor = Color.RoyalBlue
            If cpv = 3 Then polozka.BackColor = Color.Red
            polozka.Text = cpv               
            polozka.SubItems.Add(datum_vyst)
            polozka.SubItems.Add(jmeno)
            ListView1.Items.Add(polozka)
          End While

        soubor.Close()

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Jak napsat tento program aby mohlo více počítačů číst a ukládat do jednoho společného textového souboru s použitím komponenty ListView a aby změny které provedl jeden uživatel nezrušil uživatel druhý který současně uložil soubor.

Díky

Pavel

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Zdravim,

udělal jsem na listview sort(sestupný) podle datumu,ale bohužel se to neřadí správně.Nebere se hodnota datumu,ale prvního čísla.Tz.že např. 10.5.2008 by bylo dříve jak 2.5.2008

netuší někdo?

díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Mám takovou otázku. Vytvořím tedy při běhu programu nějaké záznamy a chtěl bych, aby byly po ukončení programu uloženy. Tak abych až příště spustím program, byly tyto záznamy opět načteny. Jak na to?

Protože nyní ten program po různých úpravách atd záznamy před jeho vypnutím neuloží. Jak na to?

Přehlédl jsem něco v textu? Děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ahoj, VB sice moc neznám, ale je to ve většině prostředí stejné, takže k zajištění nahrání dat při spištění postačí vložit kód pro načítání ze souboru do eventu: FormCreate, nebo FormOpen (nevím přesně jak to tam je). Takže postup je: V editoru kódu vyberte Form1 Events a ve druhém seznamu událost FormCreate/FormOpen/nebo něco na ten způsob. Pevně věřím, že to tam bude a že to najdete.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Dobrý den, procházím si váš zajímavý seriál a u tohoto příkladu, kdy máme poprvé 2 okna, by mě zajímalo, jak docílit toho, aby se okna při spuštění vzájemně nepřekrývala.

Děkuji.

H.R.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Dobrý den,

Váš seriál o VB.NET je opravdu užitečný, doufám, že v něm budete i nadále pokračovat.

Chtěl bych se zeptat, jeslti existuje nějaká možnost, jak využít místo ListView DataGridView ? Předem děkuji za odpověď.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Tady je maly priklad v C# jestli ti to pomuze. Plni se tabulka s jednim sloupcem. Cesta s nazvem souboru je v sFileName.

            FileInfo f = new FileInfo(sFileName);
            StreamReader stream = f.OpenText();
            while(!stream.EndOfStream )
            {
                dataGridView1.Rows.Add(new object[] { stream.ReadLine() });
            }

Dva sloupce by byly naplneny takto:

dataGridView1.Rows.Add(new object[] { sHodnota1, sHodnota2 });

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Pole, cykly a práce se soubory

Uvedený příklad s ListView sice funguje, ale při "soubor.ReadLine" se ze souboru "database.txt" nenačtou české znaky, takže texty popisu skončí jako "Vplata", "Vbr z bankomatu"... co s tím, poraďte, prosím

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Je to problém s kódováním češtiny. Otevřete tento textový soubor ve Visual Studiu (nebo Visual Basic 2005 Express) a v menu File vyberte Save As. Když se v dialogu pro výběr souboru podíváte na tlačítko Save, najdete tam malou šipečku dolů. Pokud na ni kliknete, rozbalí se kontextová nabídka. Vyberte Save With Encoding a v následujícím okně vyberte jiné kódování. Těžko říci, které to bude, pravděpodobně ANSI (nebo také Windows 1250) nebo UTF-8. S jinými kódováními budou pravděpodobně problémy.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Díky, s UTF-8 je čeština OK.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

a da se nejak nastavit kodovani primo v programu, pri ukladani, resp. vytvareni souboru?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Řešením by mohla být specifikace kodováni při vytváření instance StreamWriteru:

Dim soubor As New IO.StreamWriter("database.txt", True, System.Text.Encoding.UTF32)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback