Práce se soubory, úvod do objektově orientovaného programování

15. díl - Práce se soubory, úvod do objektově orientovaného programování

Tomáš Herceg       19.11.2007       VB.NET, I/O operace, .NET       22806 zobrazení

Po delší době přichází další díl seriálu pro začátečníky (teď už vlastně pro mírně pokročilé, protože spoustu věcí umíme). V tomto díle si napíšeme aplikaci pro správu údajů o osobách a seznámíme se s úplnými základy objektově orientovaného programování.

V minulém díle jsme si ukazovali, jak se ve VB.NET vykreslují grafy pomocí GDI+. Šlo by na to jistě použít nějakou již hotovou komponentu, která je k tomu určena, ale chtěl jsem předvést praktické využití rozhraní GDI+, potažmo jmenného prostoru System.Drawing.

Dnes se vrhneme na trochu jinou oblast programování, a to pokročilejší práci se soubory. Do souboru totiž občas potřebujeme uložit číslo, datum, případně nějaká binární data, a tak si ukážeme, jak to udělat nejsnadněji. Protože již nejsme začátečníci, ale mírně pokročilí, a víme již něco o objektech, ukážeme si, jak vytvořit objekt vlastní a jak jej používat. Tato technika se nazývá objektově orientované programování a zvláště v .NET frameworku ji potkáme na každém kroku.

Začínáme

V tomto díle si jako ukázku napíšeme velmi jednoduchou aplikaci, která bude pracovat s informacemi o osobách a bude je umět ukládat a načítat ze souborů. Vytvořte si tedy nový projekt a na formulář přidejte 4 komponenty Label, dále textová pole txbJmeno a txbPrijmeni, pak komponentu DateTimePicker s názvem dtpNarozeni a nakonec komponentu NumericUpDown s názvem numPocetDeti. Nakonec přidejte jeden PictureBox pro vložení fotografie osoby a tři tlačítka – Nový, Otevřít a Uložit. Celé by to mohlo vypadat například takto:

Uživatelské rozhraní aplikace

Komponenta DateTimePicker umožňuje interaktivně zadávat datum a případně i čas. Můžete ji rozbalit a hodnotu vybrat z kalendáříku, nebo ji jednoduše zapíšete do pole klávesnicí, pokud datum znáte z hlavy. Komponenta NumericUpDown umožňuje zadávat čísla (desetinná i celá) a kontroluje, jestli tam uživatel nezadává nesmysly.

Data se budou ukládat do textového souboru. Protože máme různé typy dat, budeme je chtít uložit v nějakém speciálním formátu. Jednotlivé položky (jméno, příjmení, datum narození, počet dětí a fotografii) budeme oddělovat středníky a domluvíme se, že texty budeme dávat do uvozovek. Problém bude s fotografií, protože obrázek je vlastně smečka bajtů, které samozřejmě mohou obsahovat i středník, čímž by nám mohl nastat problém. Pokud chceme ukládat binární data do textových souborů, obecně se používá tzv. base64 kódování. Celá posloupnost bajtů se převede speciálním způsobem na trochu delší posloupnost čísel, písmen a symbolů +, / a =, tedy na posloupnost znaků, které nebudou dělat v textovém souboru problémy. Přesný způsob zápisu je nad rámec tohoto článku, pokud vás přesto zajímají, můžete se podívat na wikipedii. Výhoda je, že se jedná o standardizovaný způsob a .NET framework pro něj má připravené funkce Convert.FromBase64String a Convert.ToBase64String, které provedou samotné zakódování a následné dekódování.

Stručný úvod do tříd a objektů

Velmi často se nám stává, že potřebujeme nějakou část aplikace napsat tak, abychom ji mohli použít vícekrát, a to nezávisle na sobě. Přestože se dá vždy obejít bez objektů, je velmi často (ale ne vždy) vhodné napsat si vlastní třídu. Třída je vlastně šablona pro objekt, je to sada vlastností, metod (jiný název pro procedury) a proměnných, se kterou můžeme pracovat. Nejlepší bude ukázat si to v praxi. Napíšeme si nejprve třídu RecordWriter, která bude zapisovat hodnoty různých datových typů do souboru. V podokně Solution Explorer klikněte pravým tlačítkem na název projektu a vybereme položku Add / Class. V dialogovém okně napíšeme název RecordWriter.vb a po kliknutí na tlačítko OK se nám vytvoří nová třída RecordWriter.

Do tohoto souboru vložtě tento kód:

    Dim w As IO.StreamWriter

Sub New(ByVal filename As String)
w =
New IO.StreamWriter(filename)
End Sub

Public Sub Write(ByVal i As Integer)
w.Write(i)
w.Write(
";")
End Sub

Co jsme právě udělali? Nejprve jsme do naší třídy RecordWriter nadeklarovali proměnnou w typu IO.StreamWriter. Tento datový typ známe, slouží k zápisu dat do souboru.

Dále následuje procedura s názvem New, která potřebuje jeden parametr filename. Uvnitř vytvoříme nový objekt StreamWriter a přiřadíme mu cestu, kterou jsme dostali v parametru filename. Tento objekt přiřadíme do proměnné w.

Je nutné říci, že procedura New není jen tak obyčejná procedura. Říká se jí konstruktor a spustí se vždycky při vytvoření objektu dané třídy. Náš konstruktor má jeden povinný parametr filename, to znamená, že když někde v projektu budeme chtít vytvořit objekt RecordWriter, musíme napsat Dim x As New RecordWriter(“C:\soubor.txt“), zkrátka musíme předat objektu hodnotu parametru filename. Pokud to provedeme, do proměnné w tohoto objektu se vytvoří nový objekt StreamWriter, protože jsme to to napsali do konstruktoru. Pokud tedy nějakou metodu uvnitř třídy pojmenujeme New, spustí se při vytváření objektu pomocí klíčového slova New. Pokud konstruktor potřebuje nějaké parametry, musíme je při vytváření objektu předat.

Obecně platí, že do konstruktoru patří kód, který třídu připraví a nachystá tak, abychom pak mohli volat její další metody.

A nakonec jsme do třídy přidali metodu Write, která dostane číslo i a zapíše jej do našeho StreamWriteru. Hned za něj napíše středník. Abychom mohli tuto metodu zavolat, musíme mít připraven objekt StreamWriter. Proto jsme jeho vytvoření dali do konstruktoru, abychom se o něj později nemuseli starat a měli jej připravený.

Pokud nyní budeme chtít naši třídu použít a zapsat do souboru 3 čísla, může to vypadat třeba takto:

    Dim x As New RecordWriter("C:\data.txt")
x.Write(16)
x.Write(8)
x.Write(-3)

Možná si řeknete, proč tady blbneme s objekty, když jsme to mohli napsat rovnou. Ale díky tomu, že jsme napsali třídu, můžeme klidně vytvořit deset objektů RecordWriter, kde každý bude mít na starosti úplně jiný soubor a pokud na něm zavoláme Write, zapíše právě do toho svého souboru a nikam jinam. Každý objekt RecordWriter se stará o svůj stream a zapisuje jen do něj, každý má totiž svou vlastní proměnnou w. Libovolné dva objekty RecordWriter jsou na sobě nezávislé, mají však stejnou strukturu. Vlastně to již známe z komponent na formuláři – můžeme přidat několik tlačítek, všechny mají stejné vlastnosti, ale každé může mít v dané vlastnosti jinou hodnotu, každé tlačítko má své události, které se spouští jednotlivě.

Třída nebo objekt?

Je třeba rozlišovat rozdíl mezi třídou a objektem. Třída je předpis pro to, jak má objekt vypadat. Obsahuje deklarace proměnných, procedur atd. Používá se také jako datový typ při deklaraci proměnné, která má uchovávat daný objekt. Objekt je jedna konkrétní instance (exemplář) dané třídy. Stručně řečeno, pokud se podíváte na předchozí kód, tak RecordWriter je třída a proměnná x obsahuje objekt. Od každé třídy můžeme vytvořit mnoho objektů, třída je ale vždy jen jedna. Třída je zkrátka jen jakýsi vzor.

Dokončení třídy RecordWriter

Naši třídu RecordWriter ještě nemáme hotovou. Rozhodně tam musíme přidat metodu Close, kterou musíme zavolat, aby se nám soubor zavřel. Pokud soubor nezavřeme, nebude přístupný ostatním programům, což nechceme, a navíc se mohou nějaká data ztratit, protože zapisování na disk je pomalé a operační systém data zapíše, až když je jich víc pohromadě, anebo pokud soubor zavíráme. Pokud jej nezavřeme, několik posledních bajtů se může ztratit.

Pokud do třídy doplníme ještě pár dalších metod, bude vypadat takto:

Public Class RecordWriter


Dim w As IO.StreamWriter


Sub New(ByVal filename As String)
'otevřít soubor pro zápis
w = New IO.StreamWriter(filename, False, System.Text.Encoding.UTF8)
End Sub




Public Sub Write(ByVal number As Integer)
'zapsat číslo
w.Write(number)
w.Write(
";")
End Sub


Public Sub Write(ByVal text As String)
'zapsat řetězec (vyházet z něj všechny uvozovky)
w.Write(Chr(34) & text.Replace(Chr(34), "") & Chr(34))
w.Write(
";")
End Sub


Public Sub Write(ByVal bytes() As Byte)
'zapsat bajty (base64 zakódované)
w.Write(Convert.ToBase64String(bytes))
w.Write(
";")
End Sub


Public Sub Write(ByVal dateTime As Date)
'zapsat datum
w.Write(dateTime.ToString("r"))
w.Write(
";")
End Sub


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


End
Class

Všimněte si, že jsem záměrně vytvořil několik metod s názvem Write, které se liší datovým typem parametru. Tomuto způsobu se říká přetěžování metod a pokud metodu voláme, kompilátor VB.NET podle datového typu parametru sám určí, která metoda se zavolá. výhodou je hlavně zpřehlednění kódu – ať zapisujeme do souboru text, číslo nebo datum, používáme jednu metodu. Přetěžování je v .NET frameworku velmi časté a bez něj bychom měli daleko více metod, které se od sebe liší jen trošku, ale chtějí maličko jiné parametry.

Dále si všimněte, jak zapisujeme do souboru datum. Používáme dateTime.ToString(“r“). Písmeno r označuje formát, v jakém se má datum uložit, v tomto případě je to standardizovaný formát pro výměnu data popsaný v RFC specifikacích.

Co dál?

Tímto jsme tedy vytvořili třídu RecordWriter, která nám snadno a rychle umožňuje zapisovat do souboru kombinace hodnot různých datových typů, které odděluje středníkem. Můžeme ji snadno použít a na pár řádků uložit údaje o osobě. Jak již možná tušíte, napíšeme si také třídu RecordReader, která bude data ze souboru v tomto formátu číst.

Čtení dat ze souboru

Vytvořte si další třídu RecordReader a přidejte do ní tento kód.

    Dim r As IO.StreamReader


Sub New(ByVal filename As String)
'otevřít soubor pro čtení
r = New IO.StreamReader(filename, System.Text.Encoding.UTF8)
End Sub




Public Function ReadInt() As Integer
'přečíst číslo
Return CInt(Me.Read())
End Function


Public Function ReadString() As String
'přečíst řetězec a odstranit uvozovky
Return Me.Read().Replace(Chr(34), "")
End Function


Public Function ReadBytes() As Byte()
'přečíst pole bajtů
Return Convert.FromBase64String(Me.Read())
End Function

Public Function ReadDate() As Date
'přečíst datum
Return Date.Parse(Me.Read())
End Function


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

VB.NET vám ohlásí chyby, protože jsem do něj úmyslně nezahrnul jednu proceduru. Zatím zde tedy máme konstruktor, proměnnou r typu StreamReader, která bude přistupovat k souboru, ze kterého čteme, a pak metodu Close, která soubor zavře. Pro čtení různých datových typů máme metody ReadInt, ReadString, ReadDate a ReadBytes. Zde již nemůžeme použít přetěžování, protože metody se liší jen datovým typem návratové hodnoty, nikoliv parametry. Přetěžování podle návratových hodnot kompilátor neumí, musely by se totiž řešit určité sporné situace a nepřineslo by to tolik užitku.

    Private Function Read() As String
'přečíst ze souboru jeden záznam a vrátit jej jako String
Dim sb As New System.Text.StringBuilder()

Dim ch(0) As Char 'pole, do kterého budeme číst znaky ze souboru

r.ReadBlock(ch, 0, 1) 'načíst první znak
While ch(0) <> ";"c 'opakujeme, dokud nenarazíme na středník
sb.Append(ch(0), 1) 'přidat ho do stringu
r.ReadBlock(ch, 0, 1) 'přečíst další znak
End While

Return sb.ToString()
End Function

Všechny 4 metody volají tuto metodu Read. Ta nám přečte text ze souboru až do následujícího středníku, vrátí nám vlastně další záznam. Každá metoda si jej pak převede na příslušný datový typ a vrátí jej. Všimněte si také, že metody ReadString, ReadInt atd. jsou deklarovány jako Public, kdežto naše metoda Read je deklarována jako Private. Rozdíl je v tom, že Public (veřejné) metody můžeme volat zvenku (tedy třeba z proměnné x, která obsahuje instanci objektu), zatímco Private (soukromé) metody mohou být zavolány pouze z dané třídy. Nechceme, aby nám někdo volal Read, tato metoda slouží jen pro potřeby naší třídy RecordReader.

A samotné čtení probíhá po znacích. Protože StreamReader má jen metody pro čtení pole znaků, uděláme si pole ch o velikosti 1 znak (je třeba rozlišovat mezi typy Char a Byte, používáme kódování Unicode, kde 1 znak nemusí být 1 bajt!). Pak jej předáme metodě ReadBlock, která čte po znacích. A pokud znak není středník tak jej přidáme do StringBuilderu a přečteme znak další. Opakujeme, dokud nenarazíme na středník. Nakonec tato metoda vrátí hotový záznam a skončí.

Tímto způsobem jsme si napsali třídu, se kterou nám půjde práce se souborem jedna radost. Navíc, protože jsme kód oddělili do samostatných tříd, můžeme tyto třídy použít i jinde a nemusíme neustále psát stejný kód znovu.

Dokončení celé aplikace

Tlačítko Nový bude na inplementaci triviální - stačí vynulovat všechna pole.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'ujistit se, že to uživatel chce
If MsgBox("Neuložené změny aktuální osoby budou ztraceny! Pokračovat?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo) = MsgBoxResult.No Then Exit Sub

'vynulovat hodnoty ve formuláři
txbJmeno.Text = ""
txbPrijmeni.Text = ""
dtpNarozeni.Value = Now
numPocetDeti.Value = 0
picFotka.Image =
Nothing
End Sub

Jediná zajímavá věc, která nás může potkat, je druhý parametr u funkce MsgBox. Říkáme, že chceme parametr Question a YesNo (aby se použili oba, používáme mezi ně operátor Or, který se v tomto případě používá, přestože znamená nebo. V tomto případě má funkci bitového součtu. Pokud funkce MsgBox vrátí hodnotu No, skončíme proceduru předčasně.

Pokud dvakrát klikneme na PictureBox, měl by se zobrazit dialog pro výběr obrázku. Přidejte tedy na formulář tři dialogy - jeden SaveFileDialog a dva OpenFileDialogy. Pak do procedury DoubleClick komponenty PictureBox1 vložte tento kód:

    Private Sub picFotka_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles picFotka.Click
'vybrat obrázek
If OpenFileDialog2.ShowDialog() = Windows.Forms.DialogResult.OK Then
picFotka.Image = Image.FromFile(OpenFileDialog2.FileName)
End If
End Sub

Je vhodné nastavit hodnotu vlastnosti Filter komponentě OpenFileDialog2 na hodnotu Všechny obrázky|*.jpg;*.bmp;*.gif;*.png.

Načtení dat dpak proběhne následovně:

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'ujistit se, že to uživatel chce
If MsgBox("Neuložené změny aktuální osoby budou ztraceny! Pokračovat?", MsgBoxStyle.Question Or MsgBoxStyle.YesNo) = MsgBoxResult.No Then Exit Sub

'zeptat se na soubor
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
'pokud uživatel vybral soubor, načíst jej
Dim rr As New RecordReader(OpenFileDialog1.FileName)
'přečíst data
txbJmeno.Text = rr.ReadString()
txbPrijmeni.Text = rr.ReadString()
dtpNarozeni.Value = rr.ReadDate()
numPocetDeti.Value = rr.ReadInt()
'načíst obrázek
Dim bytes() As Byte = rr.ReadBytes()
If bytes.Length = 1 Then
'prázdný obrázek
picFotka.Image = Nothing
Else
'načíst obrázek
Dim ms As New IO.MemoryStream()
ms.Write(bytes, 0, bytes.Length)
ms.Position = 0
picFotka.Image = Image.FromStream(ms)
ms.Close()
End If
'zavřít soubor
rr.Close()
End If
End Sub

Nejprve se zeptáme, jestli uživatel opravdu chce to, co chce, pokud ne, tak skončíme rovnou. Pak zobrazíme dialog pro otevření souboru a pokud uživatel operaci nezruší, vytvoříme si nový objekt RecordReader. Jako parametr do konstruktoru předáme cestu k vybranému souboru. Pak jen voláme metody ReadString, ReadDate, ReadInt a ReadBytes, přičemž to, co vrátí, přiřadíme do příslušných komponent. Načtení obrázku je o něco zajímavější - mohli bychom obrázek uložit na disk a pak jej otevřít z disku přes Image.FromFile, což umíme. Ale není to jediná cesta. Můžeme vytvořit tzv. MemoryStream, což je jakýsi proud dat, do kterého můžeme zapisovat a číst. Do pole bytes si tedy načteme bajty ze souboru, pokud je velikost pole 1, znamená to, že žádný obrázek k osobě nemáme (ten 1 bajt je dán jen a jen tím, jak budeme soubor s osobou ukládat; pokud obrázek u osoby není, uložíme jeden jediný bajt s hodnotou 0), tak jen zrušíme obrázek v PictureBoxu, pokud tam nějaký je. Pokud ale délka pole je jiná, pak vytvoříme objekt MemoryStream a metodou Write do něj "nalijeme" naše bajty. První parametr je naše pole bajtů, druhý parametr je index v poli, kde se má začít (my jedeme od začátku, takže dáme 0) a poslední parametr je počet bajtů, které se mají zapsat, což zjistíme přes bytes.Length, které vrací počet prvků v poli. Jakmile data do streamu zapíšeme, musíme nastavit pozici na začátek, protože z tohoto streamu budeme číst obrázek od začátku, nastavíme tedy Position na nulu. Pak jen do PictureBoxu přiřadíme nový obrázek, a to zavoláním Image.FromStream. Nakonec stream zavřeme, je to stejné, jako se soubory. Nezapomeneme také zavolat metodu Close na našem objektu, který čte ze souboru, aby se daný soubor zavřel a nezůstal uzamknut.

Uložení dat bude vypadat takto:

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'zeptat se na soubor
If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
'pokud uživatel vybral soubor, otevřít jej a uložit
Dim rw As New RecordWriter(SaveFileDialog1.FileName)
'uložit data
rw.Write(txbJmeno.Text)
rw.Write(txbPrijmeni.Text)
rw.Write(dtpNarozeni.Value)
rw.Write(
CInt(numPocetDeti.Value))
If picFotka.Image IsNot Nothing Then
'uložit obrázek do MemoryStreamu
Dim ms As New IO.MemoryStream()
picFotka.Image.Save(ms, Imaging.ImageFormat.Jpeg)
rw.Write(ms.ToArray())
ms.Close()
Else
'uložit pole s jedním nulovým bajtem
rw.Write(New Byte() {0})
End If
'zavřít soubor
rw.Close()
End If
End Sub

Zeptáme se na soubor, pokud jej uživatel vybere, vytvoříme náš objekt RecordWriter a zapíšeme jméno, příjmení, datum narození a počet dětí. Pokud uživatel vybral obrázek (IsNot Nothing znamená pokud není prázdný, analogicky Is Nothing znamená je prázdný), vytvoříme MemoryStream a obrázek metodou Save uložíme do tohoto streamu ve formátu Jpeg. Pokud na stream zavoláme metodu ToArray, vrátí nám pole bajtů celého streamu. Ty předáme jako parametr metodě Write našeho objektu, který tyto bajty sám zakóduje a zapíše do souboru. Nakonec zavřeme stream a i soubor, do kterého ukládáme. Pokud uživatel obrázek nevybral, do souboru se zapíše pole jednoho bajtu, který má hodnotu 0. Naše objekty totiž nejsou připraveny na prázdné hodnoty, něco tam tedy uložit musíme.

Závěrem

Pokud vám přijdou objekty moc složité, nezoufejte. Spousty věci se dají programovat bez nich, což si ukážeme v příštím díle, kde si procvičíte logické myšlení. Pravděpodobně jsem základy objektově orientovaného programování nevysvětlil formálně a teoreticky nejlépe, věřím ale, že vás tento článek alespoň naučí použít je v praxi. Pokud nevidíte výhodu objektového přístupu, tak v tomto konkrétním případě může spočívat třeba v tom, že načítání a ukládání dat, tedy samotná podstata aplikace, je poměrně elegantně odděleno od zapisování a čtení ze souboru. Procedury ukládání a načítání jsou díky tomu přehlednější, prostě jen říkáte, co se má zapsat nebo co se má přečíst. Samotné ukládání a čtení se řeší jinde, dvě různé části aplikace nejsou tedy smíchány do sebe. Jakékoliv dotazy a náměty pište do diskuse.

 

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

Poraďte nám, co s úvodní stránkou

Genericita, rozhraní a dědičnost

Jazyk C# je multiparadigmatický, což v praxi znamená, že v něm můžeme dělat hodně věcí. Jak ale do sebe jednotlivá paradigma zapadají? Co se hezky doplňuje a co není vzájemně kompatibilní? V tomto článku chci popsat, jak se chová IEquatable vzhledem k dědičnosti typu T.

Co čeká webové vývojáře na platformě .NET, představení .NET Core 1.0

 

 

Nový příspěvek

 

Mr.

1'

csharp|

xml|

css|


'

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

zdravim,ja mam problem,ze ked pisem tento kod napr.

Public Function ReadInt() As Integer

'přečíst číslo

Return CInt(Me.Read())

End Function

tak mi v return cint(Me.Read()) hlasi chybu: ME is not a member of objekty.recordreader . Viete mi poradit,kde sa stala chyba? Vdaka

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

ospravedlnujem sa, nedocital som dalej... :)

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dobrý den, začínám programovat a chci si vytvořit nějakou aplikaci např. pro ukládání dat zákazníků do databáze. Tohle mi zatím není dost jasné a chci se zeptat. V mnoha tutoriálech se používají třeba třídy Zakaznik s vlastnostmi zákazníka atd. Ve vaši aplikaci je třída jen pro zápis do souboru. Chci se zeptat, používá se i třeba tato třída Zakaznik pro ukládání dat o zákazníku. Jako že bych si napsal třídu Zakaznik z WinForms aplikace do ni z textboxu atd načetl data. A pak bych nějak ten objekt ukládal do databáze. A nebo z něj vybral jednotlivá data a uložil je do jednotlivých buněk tabulky. Používá se to takto nebo je jednodušší nevytvářet objekt Zakaznik a rovnou tyto data ukládat do databáze?

Děkuji za odpověď

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

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 -1 / 1 odpovědětodpovědět

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Zdravim .. jsem se chtěl jen zeptat nemáš tento zdrojak někde ke stažení???

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dobrý den,

Mám problém s rw.Close()

Píše mi to: 'Close' is not a member of class2

Přikládám kod:

   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim rw As New Class2("Config.txt")

        rw.Write(TextBox1.Text)

        rw.Write(TextBox2.Text)

        rw.Close()


    End Sub

A třída:

Public Class Class2

    Dim w As IO.StreamWriter

    Sub New(ByVal filename As String)

        w = New IO.StreamWriter(filename)

    End Sub

    Public Sub Write(ByVal i As Integer)

        w.Write(i)

        w.Write(";")

    End Sub
    Public Class RecordWriter

        Dim w As IO.StreamWriter

        Sub New(ByVal filename As String)

            w = New IO.StreamWriter(filename, False, System.Text.Encoding.UTF8)

        End Sub

        Public Sub Write(ByVal number As Integer)

            w.Write(number)

            w.Write(";")

        End Sub

        Public Sub Write(ByVal text As String)

            w.Write(Chr(34) & text.Replace(Chr(34), "") & Chr(34))

            w.Write(";")

        End Sub

        Public Sub Close()

            w.Close()

        End Sub

    End Class

    Sub Close()
        Throw New NotImplementedException
    End Sub

End Class

Děkuji mockrát!

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

dobrý den,

v proceduře Button3_Click je neošetřen stav opětovného uložení při zobrazení dekódovaného obrázku z textového souboru.

Jak jednoduše doplnit podmínku:

" If picFotka.Image IsNot Nothing Then"

pro ošetření tohoto stavu?

Děkuji.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dobrý den,

v prvé řadě děkuji za perfektní článek a v té druhé bych se ráda zeptala na následující věc:

Podle návodu v článku jsem si vytvořila třídu RecordReader a potřebovala bych na ní aplikovat vlastnost EndOfStream.

Pokud ale napíšu např...

Dim rr As New RecordReader("c:\text.txt")
while not rr.EndOfStream
...
end while

... pak mi vyběhne hláška, že "EndOfStream není členem RecordReader". Patrně by se tahle věc měla nějak ošetřit přímo v kódu pro třídu RecordReader, ale vůbec netuším jak a tak prosím o pomoc. Snad jsem se vyjádřila pochopitelně.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Díky za tento díl. Hodí se mi při řešení čtení z .csv souboru. Problém však nastane že řádek není ukončen středníkem.

Napadla mě jedna možnost před čtením udělat zápis, že do souboru na konec každého řádku přidá středník, ale je to další operace se souborem navíc. Není nějaká možnost, nějaká podmínka při čtení bloku, že pokud narazí na konec řádku, je to jako by narazil na středník? Tzn. že by kod pokračoval tak jak má.

Předem děkuji moc za pomoc a držím palce.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Měl bych dotaz. S VB6 jsem uměl pracovat celkem slušně, ale VB.net je úplně jinej a jsem z toho úplnej klokan. Už několik dní marně hledám na netu jak dostat tabulku z databáze do DataGridView a ani tady to nemůžu najít. Nemůžete tu prosím někdo napsat nějakej stručnej postup jak to udělat? Je tu sice spousta článků jak s tím pracovat, ale nejsou mi k ničemu, když tam nemám data.

Děkuji

Martin

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

Ještě upřesnění. Jedná se mi o obyčejnou lokální databázi v Accessu.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Zdravím

Nějak mi nejde poslat obrázek do streamu, vše je ok pokud je formát BMP, cokoli jiného (rastrového) naplní stream jenom nulami. BMP je nekomprimovaný, nehezky data nafoukne :-(

Netuší někdo v čem je problém ???

Jirka

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dobrý den,

Předem Vám chci poděkovat za skvělý seriál. Udělal jsem si svojí aplikaci podle vašeho seriálu ale narazil jsem na jeden problém. Při ukládání souboru bych chtěl aby se již v dialogovém okně pro uloýení objevil název souboru převzaný z nějakého textového pole např. "txbjmeno". Nevím zda je to vůbec možné a tak se ptám u odborníků.

Děkuji za pomoc

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

Zkus před tím, než voláš

SaveFileDialog1.ShowDialog()

uložit do filename potřebnou hodnotu - pak ji budeš mít přednastavenou i v dialogu, třeba

SaveFileDialog1.FileName = txbjmeno.Text

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

Děkuji za rychlou pomoc již je vše v pořádku.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

zdravim, mohl bych se zeptat, jak je mozne, program mi po svem spusteni nenabidne openfile dialog, ale az po kliknuti na button1, kdyz je tam stejny kod?

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
        OpenFileDialog1.ShowDialog()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        OpenFileDialog1.ShowDialog()
    End Sub

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

Nechápu, proč tento dotaz dáváte sem, neá žádnou souvislost s článkem, nicméně odpověď je jednoduchá. Na konci prvního řádku vám chybí klauzule Handles Form1.Load. Bez ní je Form1_Load obyčejná procedura, která se sama nijak nespouští. To, že se spustí při načtení formuláře, zařídí právě klauzule Handles.

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

Dekuji za rychlou odpoved a omlouvam se za spatne umisteni

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dobrý den, chci se zeptat, jak mohu ve VB.net dát podmínku, která se bude řídit aktuálním datem? u operátorů = a IS mi to píše chybu, že nepracují s datovým typem Datum. Mohl byste mi, prosím, napsat, jaký operátor lze použít?

Děkuji.

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

If mojDatum = #08/05/2008# Then ...

(Teraz si nie som istý, ale zrejme ide o 5. august...)

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dobrý den, pane Herceg. Chci se zeptat, brali na Matfyz, kdyz jste se tam hlásil, bez přijímacích zkoušek a pokud ano, s jakým průměrem? Předem děkuji za odpověd.

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

To je v tuto chvíli úplně jedno, protože od tohoto roku přijímací zkoušky nejsou. Ale upozorňuji, že Matfyz je škola pro drsné povahy, je to nejtěžší škola v tomto oboru.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

dobrý den, chci se zeptat, jaktože, když vytvořim nějaký program, nejde spustit na jiném počítači, i když je to *.exe

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

To, že je to .exe ještě nic neznamená.

Záleží na tom, jak a v čem jste ten program vytvořil a co jste při tom použil jako externí zdroje.

Pokud lze z Vašeho dotazu, vzhledem k tomu, že jste jej napsal pod seriál o programování ve VB.NET, odvodit, že jste program vytvořil právě v tomto jazyce (nebo libovolném .net jazyce obecně), takový program ke svému běhu potřebuje na počítači mít nainstalováno prostředí Net Framework (v něm program nalezne spoustu knihoven, které ke svému běhu potřebuje).

A ještě záleží v jaké verzi VB.NET jste programoval, protože i těch verzí NET Framevorku je povícero - vše ale lze bezplatně nainstalovat ze stránek Microsoftu a navíc toto prostředí vyžaduje stále víc a více programů, takže se Vám na počítači vyplatí jej mít.

Pokud jste dále programoval třeba 3D grafiku, s nějvyšší pravděpodobností budete potřebovat i DirectX.

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

Děkuji za rychlou odpověď, chtěl bych se ještě zeptat, je-li tedy nějaká možnost, jak ve VB.net vytvořit program, který by jel na jakémkoli PC, kde by byl třeba jen nějaký operační systém?

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

Aplikace napsané v jazyce Visual Basic spustíte pouze na operačních systémech Windows 98 a vyšších s nainstalovaným .NET Frameworkem. Těmto požadavkům dnes vyhovuje 99% počítačů, ostatní operační systémy .NET aplikace zatím neumí, nebo jenom z části. Nainstalování .NET Frameworku zabere jen chvíli a navíc na většině počítačů už je, protože se nainstaloval s nějakým programem, který jej využívá.

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

Jenom doplnění pro tazatele - mimo výše uvedené, existuje i nějaká náhražka .net framevorku pro Linux, takže i tam by něco mohlo chodit, ale zase to znamená nainstalovat si toto prostředí. koukněte třeba sem http://www.vbnet.cz/forum-tema--554-prog...

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

Obávám se, že "náhražka" nebude ten správný termín, někoho (vývojáře oné náhražky) by to mohlo urazit. Říkejme raději implementace. Máte pravdu, implementace .NET frameworku na Linuxu existuje, ale neumí všechny funkce .NET frameworku, jen některé. Z mých zkušeností umí vždy takovou podmnožinu funkcí, aby mi tam jakákoliv moje aplikace zaručeně nefungovala, ale oni to určitě dodělají. A napsat aplikaci tak, aby byla multiplatformní, je sice v .NETu oproti jiným jazykům hračka, ale i tak si musíte dát pozor na spoustu věcí (lomítka v cestách atd.).

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

Mohu se ještě zeptat, jak vytvořit ve VB.net aplikaci, která do PC, na kterém je spuštěna, zkopíruje nějaký program?

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Zdravím, mám dotaz a prosbu ohledně editace souborů.

Nikde jsem nenašel, jak jednoduše upravit soubor - například přepsat hodnotu někde v půlce souboru. Nenašel by se prostor na vašem blogu pro ukázku zdrojového kódu popř. jaké funkce na to použít? Díky

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

Záleží na tom, o jaké soubory se jedná.

V principu pro editaci souboru si tento načtete do vhodného kontejneru, provedete jeho úpravu a poté jej zase zapíšete zpátky do původního souboru. Vše jmenované bylo v rámci seriálu článků probíráno.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dá sa prepísať len jeden určený riadok z "x" bez toho aby som načítal celý súbor a potom ho znova "opravený" uložil?

Keď použijem IO.StreamWriter("plochy.txt,False")neprepíše mi len prvý riadok ale zmaže aj všetky ostatné.

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

Jedna z metod StreamReader je ReadLine

takže by se se daly načíst řádky do pole

pak změnit jednu položku pole

a zapsat celé pole zpět do souboru

ale možná je i čistší (systémovější) cesta

O StreamReader např. viz.

http://www.vbnet.cz/clanek--33-pole_cykl...

Ale po mých zkušenostech s XML bych doporučoval XML soubor

kde lze číst a a zapisovat (přepisovat) konkrétní parametr

Velmi výkonné :-D

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Zdravim,

v tomto článku se mi vyskytl jeden problém.

Je zde uvedeno:"Pokud dvakrát klikneme na PictureBox, měl by se zobrazit dialog pro výběr obrázku. Přidejte tedy na formulář tři dialogy - jeden SaveFileDialog a dva OpenFileDialogy."

Kdyz na PB dvakrat kliknu, žádný dialog se mi neukáže, přesunu se jen do kódu. Tudíž ani nevim kam přidat ty tři dialogy. Potom ani nemůžu aplikaci dodělat, protože tydo dialogy nejsou deklarovány.

Prosím tedy o radu či vysvětlení, možná jsem to jen špatně pochopil, nebo je chyba někde jinde.

pozn.: používám MS Visual Studio 2008

Předem děkuji za odpověď(i)

Martin K.

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

Tou větou se myslí, že pokud uživatel za běhu klikne dvakrát na ten obrázek, zobrazí se dialog pro výběr souboru.

Dialogy přidáte normálně, jako přidáváte jakoukoliv komponentu, to snad už zvládnete sám.

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

Děkuji za rychlou odpověď. To samozřejmě zvládnu :). Jen jsem ten odstavec špatně pochopil.

Martin K.

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

Ahoj, potřebuju poradit a to nutně.

Jsme naprostý začátečník a práci se soubory atd. jsem si chtěl vyzkoušet a lépe ji porozumět na tomto příkladu. Dal jsem se do práce. Pravda, nevim ze 70% procent jak vytvořit,to co tady autor píše, ale vim co to přibližně dělá. Abych byl strčnější :) vytořil jsem si co autor psal v příkladu a vynechal jsem fotku a počet dětí a taky to ubral z kódu. Když jsme byl hotov a vše bylo zhruba podle mích představ nastal problém. A to hláška OpenFileDialog is not declared. Zkoušel jsem se s tim prát co to šlo, ale neúspěšně. Prosil bych poradit co s tim. Díky moc !!! (můžete poradit i na mail [email protected])

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

Vážený příteli,

pokud máte zájem se věnovat programování pak vězte, že programování se nerovná opisování kódu bez znalosti věci.

Ne, že by bylo něco špatné na tom, opisovat části kódu (nejedná-li se, samozřejmě, o kód nějak zcizený), spíše naopak by bylo nesmyslné vymýšlet stále dokola totéž - a každý, byť ten sebelepší programátor to, co již jednou naprogramoval využívá.

Je ale zcela nesmyslné opisovat něco, co, jak sám píšete, ze 70%.

Proto bych Vám vřele doporučil, projděte si celý seriál pro začátečníky (nezačínejte jeho předposlední částí, která náhodou probírá to, co Vás právě zajímá), pak jistě budete chápat mnoho souvislostí a popisovaných problémů se zbavíte.

Jinak konkrétně Vám asi neporadím, protože netuším, jaké úpravy jste si v programu udělal, co jste vyhodil, co pozměnil, případně co přidal.

Někde jste tam zkrátka ponechal volání dialogu pro výběr souborů, ale zrušil nebo neprovedl jste jeho deklaraci.

A to právě souvisí s výše jmenovaným - všem, kteří se k 15. dílu seriálu článků prokousali postupně je jasné, že každý prvek musí být před použitím nadeklarován. (buď deklaraci provedete přímo v kódu

Dim openfiledialog as new OpenFileDialog

, nebo komponentu OpenFileDialog přetáhnete na plochu designéra).

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

Děkuji za radu, už je problém vyřešen. Samozřejmě základy chápu. Akorát mam problém v souvislostech, respektive snažím se odbourat moji naprostou neschopnost vymyslet složitější věc (nalil jsem si hodně čistého vína :D). Jak jsem již psal, nevim jak k tomu dojít, ale vim co k čemu slouží. Seriál jsem procházel, pravda spíš jenom teoreticky. Snad se to zlepší :). Ještě jednou Díky!

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Dorazil jsem k patnáctému dílu. Jelikož jsem stará struktura, která rozezná jen program, podprogram, proměnnou, funkci a příkaz, trochu jsem se zamotal a mám dotazy:

Dim w As IO.StreamWriter

vytvořil jsem objekt, který se jmenuje w a IO.StreamWriter říká, že bude umět zapisovat do souboru, podle pravidel někde "uvnitř" streamwriter

Sub New(ByVal filename As String)
        w = New IO.StreamWriter(filename, False, System.Text.Encoding.UTF8)
    End Sub

v tento moment jsem zmaten. Vkládám "podprogram" který opět říká, že objekt w je IO.StreamWriter a mému objektu w budou v budoucnu předány parametry: filename, false=objekt pokaždá přepíše co tvoří, System.Text.Encoding.UTF8= bude to zapisovat v kódu UTF8

1)proč nemůžu rovnou říct toto:

Sub New(ByVal filename As String)
Dim w As New IO.StreamWriter(filename, False, System.Text.Encoding.UTF8)
End Sub

2)Je přetěžování opětovné "volání" objektu w jednou s number, jednou s data, jednou s text...atd?

3)Je možné komunikovat s naším w pomocí předávání parametrů do "závorky"?...chci tím říct...proč opakovaně tvořím (asi se jedná o zmíněné přetěžování) "podprogram" jmenující se write se vstupní hodnotou jednou number, jednou data atd..je možné předat číslo v proměnné jménem např ŘEPA takto: w(ŘEPA) ?

4)V tomto díle mě absolutně zmátlo vytvoření třídy (z mého pohledu "podprogramu") jménem recodwriter, kde je objekt w (z mého pohledu "funkce"), který umí zapsat data. Následně dále přejmenování recordwriteru na rw...což je zase třída vytvořená z recodwriteru viz zde:

  Dim rw As New RecordWriter(SaveFileDialog1.FileName)

Proč vytvářím ze třídy další třídy?...je to proto, abych jí mohl předat parametry SaveFileDialog1.FileName ?

Uznávám že můj dotaz je zmatený. Ale je strašně obtížné se orientovat v něčem "objektovém", kde nevidím hlavní "program" využívající "podprogramy" které jsou někde mimo. V minulých dílech šlo snadno rozeznat "nadřazenost" a "podřazenost" jednotlivých částí kódu. Rozhodně to není kritika, stále je tento seriál jednou z nejsrozumitelnějších věcí co znám.

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

Vaším problémem je podle mě hlavně zmatek v termínech.

Je důležité si uvědomit, co je to třída, co je to objekt a co je to metoda (nebo také procedura či funkce, je to víceméně to samé) a jaké jsou mezi tím rozdíly.

Třída je jakási šablona, která obsahuje proměnné a funkce. Sama o sobě je k ničemu, je to jen jakýsi vzor. Nemůžeme napsat RecordWriter.Write, musíme si nejprve vytvořit objekt. To se dělá tím řádkem Dim rw As New RecordWriter("soubor.txt").rw je tedy objekt. Má stejné metody jako měla třída RecordWriter, protože se podle této třídy (podle tohoto vzoru) vytvořil. Má také svou vlastní proměnnou w, pomocí které zapisujeme do souboru. Když zavoláme nějakou metodu objektu rw, tak kód, který je uvnitř, se provede s tou jeho proměnnou w. Hlavní smysl toho všeho je ten, že my si můžeme vytvořit víc objektů (třeba rw1, rw2 atd., dokonce si můžeme udělat i pole těchto objektů, budeme tedy s nimi moci pracovat i hromadně) a každý bude mít své vlastní w, potažmo tedy svůj vlastní soubor, do kterého bude zapisovat.

Konstruktor, tedy metodu New, jsme napsali proto, že chceme uvnitř každého objektu otevřít soubor pro zápis, a v parametru filename specifikujeme cestu k tomuto souboru. Tato metoda se zavolá, když vytváříme objekt, čili na řádku Dim rw As New RecordWriter.

A ještě jste se ptal na přetěžování, přetěžování není nic jiného než to, že si nadeklarujeme víc metod, které se jmenují stejně, ale mají jiné typy parametrů (jiný počet nebo jiné datové typy).

Doufám, že jsem Vám v tom neudělal ještě větší guláš. Cílem objektově orientovaného programování je rozdělit program na části tak, abychom tyto části mohli používat z různých míst aplikace, nematlali všechno do sebe a neměli na víc místech kód, který dělá to samé (když pak chcete něco změnit, musíte to měnit na více místech, hrozí také, že někde zapomenete).

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

Popsal jste to srozumitelně. Ale popis mi vnuknul další dotaz:

Vytvářím nový formulář...je to tedy třída Public Class Formular a mate mě, proč v tomto případě (i v ostatních-tlačítka, tabulky, textová pole) neprovádím stejný postup. Tj následovně bych měl provést např. toto: Dim w as New...neco.neco co definuje formular a tak vytvořit objekt w, mající vlastnosti dané třídy...tedy formuláře. A to tam nevidim. Chápu postup, jak vytvořit objekt w ze třídy RecordWriter, jejíž "vzhled" jsem nadefinoval. Nechápu ale, proč furmuláře a další předdefinované věci nevytvářím shodně. A domnívám se, že se shodně vytvářejí, ale jelikož jsou předdefinované VB.net mi je neukazuje.

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

Zkuste následující postup:

- Vytvořte si nový Winform projekt

- na plochu formuláže si libovolně nasázejte pár komponent,

nějaká tlačítka, textboxy, atd. - co Vás napadne

- poklepejte na nějakém tlačítku a přepnete se do zobrazení kódu (záložka Form1.vb) do metody ošetřující stisk tlačítka, na kterém jste poklepal

- na konci názvu procedury máte něco jako "Handles Button1.Click"

- vyberte myší název toho tlačítka, tedy v tomto případě "Button1" (nic víc)

- na zvýrazněném výbětu stitkněte pravé tlačítko myši a z kontextového menu, které se Vám objeví, vyberte volbu "Go To Definition"

- pokud vše klapne, měl byste se dostat do záložky "Form1.Designer.vb", která je normálně skrytá, protože v ní by uživatel neměl nic měnit. A když si ji prohlédnete, tak se nejedná o nic jiného, než obyčejný kód, ve kterém jsou definovány všechny objekty na Vašem formuláři přesně tím způsobem, jak bylo probíráno v článku.

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

Vyzkoušel jsem, je to tak. Děkuji

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

Ano pravda

Jsem taky jeden z "kozáků" VB6.0 a VBA

a u Form1.Designer.vb mě uchvátila ta možnost

že pokud něco změníte v tomto kodu tak se to promítne na formuláři

Což se dá využít například na editaci vlastností

nebo hromadného přejmenovávání "Button1" za "Moje_tlacitko1"

(najít a nahradit - Replace)

Hromadně to má význam ve stylu

najít: >.Name = "Button<

nahradit: >.Name = "Moje_tlacitko<

Snad jsem to naznačil dostatečně m se to líbí max :-D

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

Ve skutečnosti je to s formuláři naprosto stejné, akorát to před námi Visual Basic schovává.

Ale pokud si do projektu přidáte druhý formulář, pracujete s ním jako s objektem.

Dim f As New Form2()
f.Label1.Text = "Můj text"
f.Show()

Stejně tak si můžete vytvořit 10 různých objektů ze třídy Form2, budou reprezentovat stejná okna, ale budou na sobě nezávislá.

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

Hmm Hmm. Mohl bych, prosím, požádat o ukázku příkladu. Vytvořím nový projekt, automaticky je na něm formulář Form1-je to třída jestli to dobře chápu. Nyní na něm chci tlačítko, ale né tak že si ho přetáhnu, chci pochopit jak vytvořit třídu tlacitka. Provedu tedy Add-class-tlacitka.vb.

Co mám definovat do třídy tlacitka, abych pak mohl zacházet s tlačítkem tak, jak popisujete výše (tvořit z této třídy další tlačítka s jiným jménem) a přidávat je na form1.vb? Jak program bude vědět, kde dané tlačítko leží na form1.vb(mám tento údaj definovat ve třídě tlacitka, nebo třídě form1?

Záměrně jsem nevyužil Vaší ukázku, jelikož formulář pro mě představuje něco jako "hlavní program" a hůř se orientuji, pokud bych to zkoušel s ním. Současně je tlačítko "věc kterou vidím" a snáze jí pochopím...než například imaginární io.stream.writer.

Jde mi o to pochopit obecný způsob definování třídy a jejího využívání. Fyzicky vidím na obrazovce jen třídy, mate mě kde je vlastní logika "programu" a kde se jen definuji třídy a objekty. Děkuji za Vaší trpělivost a ochotu vysvětlovat.

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

Vy třídu pro tlačítko již nemusíte psát, ta je již hotová a zahrnutá v .NET frameworku. Takto vytvoříte 3 tlačítka a přidáte je na formulář:

Dim b(2) As Button
For i As Integer = 0 To 2
  b(i) = New Button()  'vytvořit tlařítko
  b(i).Text = "Tlačítko " & i
  b(i).Left = i * 100

  Me.Controls.Add(b(i))    'přidat tlačítko na formulář
Next

S formuláři je to trochu jinak, .NET framework má třídu Form, která reprezentuje prázdný formulář. To, co se píše jako Class Form1 popisuje jenom změny, které v obecném formuláři provedete, říká se tomu dědičnost.

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

Díky, budu s tím pokusníkovat.

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

Ještě dopřesnění k Vašim dotazům (jsem totiž dle Vaší definice taktéž programátorsky "stará struktura", takže Vaše úvodní zmatky plně chápu):

Proč je použito delší:

Dim w As IO.StreamWriter
   Sub New(ByVal filename As String)        'otevřít soubor pro zápis
   w = New IO.StreamWriter(filename, False, System.Text.Encoding.UTF8)
End Sub

, když je to možno zkrátit na

Sub New(ByVal filename As String)
   Dim w As New IO.StreamWriter(filename, False, System.Text.Encoding.UTF8)
End Sub

?

To souvisí s viditelností proměnných. Kdybyste totiž použil ten Váš druhý, zkrácený příkaz, ve kterém zároveň deklarujete i iniciujete proměnnou w, jednalo by se o proměnnou lokální, která by měla platnost pouze v rámci dané procedury (v tomto případě New). Jenomže Vy s ní potřebujete pracovat v rámci celé třídy.

Proto musí být deklarace proměnné mimo procedury (aby se jednalo o proměnnou viditelnou v rámci celé třídy).

Jenomže ve chvíli takovéto deklarace neznáte ještě potřebné parametry (jméno souboru, který se má na proměnnou navázat), proto nemůžete na tomto místě proměnnou současně iniciovat.

Takže Vám nezbývá nic jiného, než:

1. v úvodu proměnnou deklarovat (jenomže tady se ona ještě nevytváří, jenom programu řeknete, že někde dále bude proměnná tohoto názvu použita a díky přiřazení typu program ví, jak velký prostor si pro ni má v paměri rezervovat.

2. Na vhodném místě kdy znám již všechny potřebné vstupy proměnnou iniciuju - teprve teď ji skutečně "vytvořím"

A ohledně toho přetěžování.

Když si na to zvyknete, je to ohromně šikovná věcička.

Třeba v tomto případě, kdy potřebujete provádět po stránce logiky použití zcela totožnou činnost (zapisovat údaje do souboru), ale z pohledu konkrétního technického řešení je zapotřebí použít jiné postupy.

Naším "klasickým" přístupem bychom museli v hlavním programu provést před každým zápisem nejprve zjištění, o jaký typ dat se jedná a dle výsledku tohoto rozhodovacího příkazu volat různé "podprogramy" (call zapisText(...), call zapisInteger(...), call zapisFloat(...), atd)

Ve chvíli, kdy se rozhodneme doplnit další možný formát dat, která do našeho souboru umožníme zapsat, musíme najít všechna místa v hlavním programu, ze kterých něco zapisujeme, a doplnit tam další možnost při volbě typu, a doplnit další podprogram (např. call zapisObrazek(...)).

Při využití přetěžování je to vše obrácené.

V našem hlavním programu všude, kde chceme "něco" zapsat, napíšeme tuto skutečnost (zapisData(...)), a s tou vlastní selekcí si pohrajeme až v tom "volaném podprogramu", což je v tomto případě metoda naší třídy).

Ten hlavní rozhodovací příkaz, který určí, který "podprogram" se má vlastně použít za nás udělá logika přetěžování sama, tzn. když pošleme jako parametr hidnotu intege, použije se pro vyhodnocení naše původní subrutina "zapisInteger(...)", pokud pošleme reálné číslo, použije se zapisFloat(), atd. Jenom s tím rozdílem, že i interně se tyto všechny "podprogramy" budou jmenovat stejně, tedy "zapisData()".

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

Velmi děkuji oběma za vysvětlení, hodně pomoho. Choval bych se přesně, jak popisuje V.Langer. Tj vytvořil bych rozhodovací strukturu a na základě výsledku volal "podprogram", který by data zapsal. Úplně dokonale jste mě odhalil. Vycházím totiž z předpokladu, že vlastní jazyk neumí vůbec nic.

U složitého příkladu už nejde číst autorův kód a přepisovat si ho, tak, jak ho chápu...což jsem činil doposud. Vznikaly vlastně stejné programy, ale kód byl trošku jiný. Zkouším například v případě zmiňovaného přetěžování "umazávat" části kódu a sledovat, jaké chyby se generují. Krásně se ukázala ona logika přetěžování, kterou popisujete. VB.net poznal v případě write, že chci zapsat, věděl i co (data obrázku). Ale jelikož jsem mu umáznul příslušnou část Public Sub Write(ByVal bytes() As Byte) nahlásil chybu, která přesně osvětluje co popisujete. Tj VB.net zkusil všechny možnosti write, které měl a ani jedna neuměla zapsat data v potřebném formátu. Plyne mi z toho tedy, že si můžu jaksi do "foroty" připravit zápis všech typů dat (i když je ve svém programu nepotřebuji) a vb.net sám vybere, jakým způsobem je zapíše. Ještě jednou díky za vysvětlení, skutečně pomohlo. Bohužel pro mě stále zůstává hodně zmatečná vlastní syntaxe, používání jmenných prostorů apod.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Velmi zajímavé

nevím kdo z Vás to řešil, ale mne by zajímalo

jestli lze uložit obrázek (jako binární data?)

například do databáze

(Obrázky TIFF, JPEG ... atd)

využití - katalog komponentů, ukládání TIFF scannů atd

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

no stranka sa mi paci , je tu secko cierne na bielom , az na par kodou , ale hladam niekoho kto sa to uci tiez ci sa dako somnou nepodeli o poznatky :) ja som zaciatocnik a chcem sa to naucit mam icq,skype, ak treba tak msn spravim

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

Dovoluji si tvrdit, že většina z nás (kromě autorů tohoto osvíceného webu, samozřejmě) na tyto stránky chodí především proto, že se VB učí, takže zdaleka nejste sám.

A abych nemluvil za ostatní, já jsem, úplně stejně jako Vy, totální začátečník a pokud Vám mohu poradit - hledáte-li někoho, kdo by se s Vámi podělil o poznatky, zaregistrujte se na tomto Webu a připojte se s důvěrou k nám - jak jste si mohl všimnout, my se tady o poznatky a nápady dělíme celkem ochotně a někdy docela intenzivně.

A pokud se to chcete skutečně naučit, myslím, že jste na správné adrese - doporučuji projít si (a vyzkoušet, ne pouze přečíst) seriál pro začátečníky na tomto Webu, a pokud Vám nebude něco jasné, prohlédnout diskusi a pokud zde nenaleznete odpověď, klidně se na konkrétní problém zeptat.

Je to podstatně lepší, než ICQ či jiné "soukromé" kanály, protože, jak jsem již napsal, všichni jsme v nějakém stupni začátků a tím, že se zeptáte na fóru na nějaký konkrétní problém, nenatahujete pouze ruku, abyste bral, ale také dáváte, protože je vysoce pravděpodobné, že nebudete sám, koho řešení Vašeho dotazu bude zajímat. No a postupem doby zjistíte, že nejlepší škola je snažit se hledat řešení problémů, které sem dávají ostatní přispivatelé.

Přeji výdrž a hodně programátorských úspěchů.

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

no presne to , hladam niekoho kto sa podeli a nejak sa doplni so mnou , setko od prveho az po posledny diel som si precital a aj spravil vsetko fungovalo , ale zaujima ma aj nieco viac , nieco co nasleduje , lebo tychto par dielou som presiel za par dni :) a s registraciou mam mensi problem spravil som si ale az potom som zistil ze mam aj nejaky cas na aktivovanie toho uctu , tak ked som pri tom admina sa chcem spitat ci sa to neda dako preposlat moje meno co som si daval je Damnation a email: [email protected]

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

Ono s tou registrací občas problém je (mně se to taky nepodařilo hned napoprvé). Doporučuji Vám napsat přímo na pana Hercega nebo Jechu (kontak najdete kupodivu v "kontaktech") a oni Vás určitě ochotně aktivují.

Jinak mé začátky na tomto Webu byly úplně stejné - nejprve jsem si prošel všechny dostupné články, pak jsem kompletně prošel diskusi (pravda, když já začínal, těch témat tam zdaleka ještě nebylo tolik) no a pak jsem se osmělil a poznenáhlu zapojil do debat v diskusních fórech... No a dneska koukám, že patřím na tomto webu k těm "nejukecanějším"...:))

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

A na com pracujete teraz , lebo ja som uz kukal aj ine weby a nic take dobre ako tento web som nenasiel , a aj ked som nasiel nieco dobre tak som casom zistil ze to asi neni pre tuto ver.vbnetu bolo to pre ten starsi vb 6 .

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

Na čem pracuji? Na všem a na ničem.

O VB jsem se totiž začal zajímat ze zcela zjištných důvodů. Potřeboval bych totiž jednu takovou docela speciální a svým užitím specifickou aplikaci, no a vzhledem ke skutečnosti, že komerční záležitosti pro tuto oblast jsou dost drahé (a pro mé potřeby zbytečně košaté) a mezi freewarem jsem nic, co by plnilo mé představy, nenašel, no a v neposlední řadě proto, že jsem odpůrcem používání nějakých kradených věcí, nevidím jinou cestu, než si to "zbastlit" sám. Jenomže doby, kdy jsem si nějaké drobnosti programovával, ty už dávno zavál čas, nehledě na skutečnost, že ani tehdejší a dnešní způsoby programování není možno vůbec srovnávat, musím začít s výukou programování opět pěkně od Adama. Prvním důležitým rozhodnutím, byla volba jazyka - no a k VB jsem se přiklonil hlavně pod dojmem tohoto Webu, protože pro jiné jazyky jsem na nic podobně sdílného nenarazil.

Takže mám rozdělánu tu svou "spešl" aplikaci, leč v poslední době namám moc času se jí věnovat, protože když se dostanu k VB, tak hlavně řeším "úkoly" z diskuse - ale nežehrám na to, protože se tím učím a v mezičase jsem si stačil už, díky takto nabytým znalostem zbastlit i nějaké to jednoduché udělátko pro mou hlavní profesní činnost, kterou je strojařina.

Jinak do budoucna mám ještě v plánu, až "mě to pan Jecha s panem Hercegem" naučí, zaktualizovat naše firemní stránky, které mám doposud v PHP-čku, pod VB.NET, a pod stejnou technologií spáchat stránky naší malé obce - ale to až to znalosti dovolí a až se naskytne trocha času.

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

mate aj nejake ine pomocky na ucenie ako web ?

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

pouze nějakých pár základních publikací (asi 3), ale nejvíc stejně čerpám z internetu.

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

co mi radite robit dalej ked som spravil srtky dieli s tohoto webu :) hladal som aj ine ale ako som uz pisal tak je toho malo a nasiel som len na vb 6

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

Z praxe Vám doporučuji "vymyslet" si nějaký konkrétní projekt, pokud zrovna nemáte něco, co byste potřeboval vyřešit, a zkusit ho dotáhnout do nějakého stádia. Je to rozhodně efektivnější, než jenom tak bloumat od funkce k funkci, protože takto se donutíte najít řešení i drobností, které byste jinak "obešel". Mně osobně se velice osvědčuje sledování diskusního fóra na tomto webu, protože tam se setkáte s fůrou konkrétních problémů, které někoho tíží, a buď se pak snažím na tento problém nalézt řešení (což je nejlepší škola), neboˇ, pokud je to nad mé síly, se alespoň nechám poučit od zkušenějších - a zase se ve svých znalostech posunu o kousíček dál.

No a v neposlední řadě vždy netrpělivě očekávám další pokračování výukových seriálů na tomto webu.

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

diki za radu . A ak sa smiem spytat na akom projekte pracujete Vy ?

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

Smiete - je to dost specifická aplikace - program na odbavování televizního vysílání pro obecní televizi.

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

tak to mi moc nehovori :)

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

Je to jednoduché. Máme v obci kabelovku a součástí nabídky je obecní infokanál. Tento obecní infokanál se vysílá z "pc" - 24 hodin denně, 7 dní v týdnu tam běží určité programové smyčky z zásadě tvořené kombinací filmového vysílání (zpravodajství kraje a dále zpravodaj z blízkého města, občas i já něco malého stvořím z různých akcí v obci :-)), nějaké prezentace (zatím tvořeno v Powerpointu) a mimo to ze slideshow z fotek z obce či pro občany zajímavých, navíc vše (mimo filmů, které mají svou vlastní zvukovou stopu) podbarveno hudbou. No a já si k tomu všemu dovymyslel ještě "News" (takový ten běžící text na banneru na dolním či horním okraji obrazovky, s nejaktuálnějšími informacemi pro občany). No a to všechno musí běžet v reálném čase, musí to být možné řídit, měnit a nastavovat co nejjednodušeji a musí to být schopno chodit podle nějakého sestaveného "programu vysílání", tj. začátky jednotlivých bloků v přesnou hodinu, atd., atd. Zkrátka sranda, jenom to chce svůj čas, kterého se mi nějak v poslední době víc a více nedostává.

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

bry de, hmmmmm pekny plan , vidim ze na obcanov myslite viac ako ich starosta (ak to nieste Vy) , no a ta kniha je tam vela teorie atd atd atd.... ale tie zdrojaky tam boli fakt take aspon 20x som si kontroloval riadok po riadku , neboli tam ani premenne tie som si uz dako tak domyslel ze tam musia byt , no a to ostatne to bolo uplne nezmysli.

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

Zajímám se také o odbavování pořadů v kabelovce, ozvi se na [email protected]. Díky. JM.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Nepodařilo se mi najít žádný vhodný nástroj pro práci s maticemi. Existuje nějaký nástroj, který mi to umožní? Jsem docela začátečník ve VBnet..v seriálu jsem dorazil až k tomuto dílu a prozkoumal tento web, ale nic jsem nenašel. Namespace math. kromě základních matematických funkcí nic moc nenabízí a popravdě řečeno, jsem celkem líný dělat si vlastní funkce kde by se např. s polem pracovalo jako s maticí a nad ním prováděli potřebné operace (hlavně pro potřeby řešení soustav...matice^-1 apod). Domnívám se, že je to docela obecně potřebná věc a je určitě někde vyřešena...jen nemůžu najít kde. Díky za pomoc

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

Mohl bych na toto téma napsat seriál, ale bude mi to chvíli trvat.

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

tema na tu "tlacitkovu , co je aj vo windovse " kalkulacku ?

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Opět velká pochvala a poděkování.

A abych zůstal u tématu, měl bych dva dotazy k OOP:

Občas mám problémy rozhodnout se, zdali použít metodu či vlastnost. Někdy je to jasné a obě možnosti nejsou zastupitelné, ale, pokud bych to třeba použil na kousek Vašeho kódu:

Public Function ReadInt() As Integer
  'přečíst číslo
  Return CInt(Me.Read())
End Function

Public Function ReadString() As String
  'přečíst řetězec a odstranit uvozovky
  Return Me.Read().Replace(Chr(34), "")
End Function
...
...

dalo by se to (alespoň z funkčního hlediska) napsat, si myslím, i za pomocí vlastností:

Public ReadOnly Property getInt()
   Get
      Return CInt(Me.read)
   End Get
End Property

Public ReadOnly Property getString()
    Get
       Return Me.read().Replace(Chr(34), "")
    End Get
End Property
...
...

Existuje nějaké jednoduché vodítko, co v těchto případech raději použít (ať již z hlediska funkcionality, čistoty kódu nebo programátorské etiky)? Nebo se properties mají či smí používat pouze pro plnění resp. čtení třídních private proměnných?

2.:

Samotná třída může být i sama o sobě funkční (tj. spuštěna bez vytvoření instance)? Příklad naše známé "Form1". Je to objekt, nebo třída? Samozřejmě, dědí funkcionalitu z třídy Form, ale pokud ji mám spuštěnu, pak se už chová jako objekt, ale současně ji mohu použít i jako třídu (např. při tvorbě dalšího formuláře : dim f as new form1). Nebo mám-li v projektu Form1 a Form2, jaký je rozdíl, pokud (z kódu ve Form1) spustím ten druhý formulář příkazem

form2.show

, resp. jej spustím konstrukcí

dim f as new form2
f.show

?

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

Nejprve ke druhé věci, s těmi formuláři je to o trochu složitější, spíš kvůli kompatibilitě se staršími verzemi VB byla zachována možnost pracovat s formulářem přes název třídy. O tom si povíme v dalším z dílů.

A k těm vlastnostem - principiálně to bude fungovat opět stejně, ale vlastnosti se používají k řízení přístupu k proměnným ve třídě. Pokud potřebujete zvenku manipulovat s nějakou proměnnou ve třídě, dělá se to většinou tak, že vytvoříte vlastnost (tedy Property), která s touto proměnnou pracuje. Je to hlavně kvůli rozšiřitelnosti a kvůli ochraně třídy, můžete díky vlastnostem kontrolovat, aby do proměnné šly správné hodnoty, případně můžete nějak zareagovat při změně hodnoty této proměnné.

Metoda je víceméně to, čemu jsme říkali procedura nebo funkce. Něco udělá a může vrátit výsledek, pokud to má smysl. Vlastnost by také měla většinou vracet to samé a ne pokaždé jinou hodnotu, to jen když se změní obsah nějaké proměnné.

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

Děkuji za odpověď - stručné, jasné a vyčerpávající.

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

bry den , potreboval by som pomoct s kalkulackou vo vb.net :)

hadze mi to chyby v tlacitkach aj napriek tomu ze sa mi to zhoduje z drojakmi v knihe :) toto je normal tlacitko 1,2,3... ale len v jednom

Button2.Click, Button3.Click, Button4.Click, Button5.Click, _
        Button6.Click, Button7.Click, Button8.Click, Button9.Click, Button0.Click
        Dim cleardisplay As Integer
        If clearDisplay Then
            Label1.Text = ""
            cleardisplay = False
        End If
        Label1.Text = Label1.Text + sender.text

toto je tlacitko na + tie dalsie *,/,- sa daju tak isto len sa prehodi znamienko v kode

        Dim operatorx As String
        Dim operand1 As Double
        operand1 = Val(Label1.Text)
        operatorx = "+"

a toto je tlacitko =

        Dim operatorx As String
        Dim cleardisplay As Boolean
        Dim operand1 As Double
        Dim operand2 As Double
        Dim result As Double
        operand2 = Val(Label1.Text)
        Try
            Select Case operatorx
                Case "+"
                    result = operand1 + operand2
                Case "-"
                    result = operand1 - operand2
                Case "*"
                    result = operand1 * operand2
                Case "/"
                    If operand2 <> "0" Then result = operand1 / operand2
            End Select
            Label1.Text = result
        Catch exc As Exception
            MsgBox(exc.Message)
            Label1.Text = "CHYBA"
        Finally
            cleardisplay = True
        End Try

potom este desatina ciarka :

        If Label1.Text.IndexOf(".") > 0 Then
            Exit Sub
        Else
            Label1.Text = Label1.Text & "."
        End If

pls za opravenie alebo najdenie chyby dakujem :)

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

Milý příteli, jste si doopravdy jist, že se Váš kód shoduje s kódem ve Vaší knize? Moc se mi totiž nezdá, že by kniha o VB2005 používala konstrukci:

dim cleardisplay as integer
...
...
cleardisplay=false

ono to sice, ku podivu, funguje správně, ale určitě to není syntaktická perla, která by se měla přesvádět v odborných publikacích.

A dále není z Vašeho textu dost dobře zřejmé, kde ten text máte umístěn. Pokud totiž to jsou jednotlivé úseky textu z různých událostních procedur (button.click apod.) a pokud máte v každé této proceduře deklaraci jednotlivývh proměnných tak, jak ji uvádíte, jedná se o proměnné lokální, tzn. jejich platnost je pouze uvnitř dané procedury. Jinak řečeno, proměnná "operand1" lokálně definovaná v proceduře obsluhující zmáčknutí tlačítka "+" nemá nic společného s proměnnou "operand1" lokálně definovanou v proceduře obsluhující stisk tlačítka "=".

Ale to opravdu pouze odhaduji některé z možných zdrojů chyb. Bylo by zapotřebí, abyste napsal přesně co a jak kde deklarujete a kde jednotlivé fragmenty kódu máte umístěné.

Jinak vhodnějším by bylo využít k tomuto účelu diskuse ve fóru (tady pod článek to jednak nepatří, málokdo to najde a taky se sem zatím (?) vleze jenom 20 příspěvků.

Budete-li to dávat do fóra, přečtěte si úvodní informaci (jak volit název vlákna a také jak zadávat kód, aby byl lépe čitelný).

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

no dam to este raz a budem sa snazit to napisat presne dim cleardisplay as boolean ma byt no a v knihe sa pise : tlacitko 1 sa pouzilo aj na ostatne tlacitka aby sa kod nemusel pisat do kazdeho zvlast tak je to takto :

 Private Sub digit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, _
        Button2.Click, Button3.Click, Button4.Click, Button5.Click, _
        Button6.Click, Button7.Click, Button8.Click, Button9.Click, Button0.Click
        Dim cleardisplay As Integer
        If clearDisplay Then
            Label1.Text = ""
            cleardisplay = False
        End If
        Label1.Text = Label1.Text + sender.text
    End Sub

V TLACITKU +,-,*,/ je :

    Private Sub Buttonplus_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button13.Click

        Dim operand1 As Double
        operand1 = Val(Label1.Text)
        operatorx = "+"
    End Sub

DESATINNA CIARKA :

    Private Sub Buttonperiod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonperiod.Click
        If Label1.Text.IndexOf(".") > 0 Then
            Exit Sub
        Else
            Label1.Text = Label1.Text & "."
        End If
    End Sub

ROVNA SA :

    Private Sub Buttonequals_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonequals.Click
        Dim cleardisplay As Boolean
        Dim operand1 As Double
        Dim operand2 As Double
        Dim result As Double
        operand2 = Val(Label1.Text)
        Try
            Select Case operatorx
                Case "+"
                    result = operand1 + operand2
                Case "-"
                    result = operand1 - operand2
                Case "*"
                    result = operand1 * operand2
                Case "/"
                    If operand2 <> "0" Then result = operand1 / operand2
            End Select
            Label1.Text = result
        Catch exc As Exception
            MsgBox(exc.Message)
            Label1.Text = "CHYBA"
        Finally
            cleardisplay = True
        End Try
    End Sub

a este buplic class :

Public Class digcalculator
    Private operatorx As String
nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Jak jsem již naznačil, hlavním problémem, dle mého, jsou ty deklarace (z jaké knížky to máte?:-), protože např. operand1 nastavíte při zmáčknutí tlačítka operace, jenomže jakmile opustíte (po vykonání) proceduru obsluhující toto tlačítko, tak tato proměnná mizí. A Chcete s ní pak počítat v obsluze tlačítka "=". Skutečně to tak máte v nějaké knize?

Zkusil jsem to narychlo trochu předělat, ale zdaleka to není úplné (chybí tam ošetření několika chybových stavů). Berte to spíše jako námět na přemýšlení, ne jako hotové řešení - to není účelem.

Jinak v modrém pruhu nad tím, co právě píši, je ikonka "VBcode", na tu když zmáčknu dostanu prostor, do kterého mohu napsat (resp. zkopírovat) kód:

Public Class digcalculator

    ' deklarace GLOBÁLNÍCH proměnných tak, aby byly vidět ve všech procedurách
    Private operatorx As String = ""
    Private clearDisplay As Boolean = True
    Private operand1 As Double = 0
    Private operand2 As Double = 0
    Private result As Double = 0


    ' zachycení zmáčknutí "číselného" tlačítka
    Private Sub digit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                            Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, _
                            Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click, Button0.Click

        If clearDisplay Then
            Label1.Text = ""
            clearDisplay = False
        End If
        Label1.Text &= sender.text
    End Sub

    ' zachycení zmáčknutí desetinné čárky
    Private Sub Buttonperiod_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonperiod.Click

        ' opět musíme ošetřit "první" vstup, pokud jako první zmáčknu čárku, dáme tentokrát před ni "0"
        If clearDisplay Then
            Label1.Text = "0"
            clearDisplay = False
        End If

        If Label1.Text.IndexOf(",") > 0 Then
            Exit Sub
        Else
            Label1.Text &= ","
        End If
    End Sub

    ' ošetřšní zmáčknutí tlačítka operace
    Private Sub ButtonOperace_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                    Handles Button10.Click, Button11.Click, Button12.Click, Button13.Click

        ' pokud je v paměti nějaký operátor, nejprve provedeme vyhodnocení
        If operatorx <> "" Then Buttonequals_Click(Nothing, Nothing)


        operand1 = CDbl(Label1.Text)
        operatorx = sender.text

        ' musíme nastavit vymazání displeje, aby se při dalším zadávání začalo psát nové číslo!
        clearDisplay = True
    End Sub

    ' rovnítko
    Private Sub Buttonequals_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonequals.Click

        operand2 = CDbl(Label1.Text)
        clearDisplay = True
        Try
            Select Case operatorx
                Case "+"
                    result = operand1 + operand2
                Case "-"
                    result = operand1 - operand2
                Case "*"
                    result = operand1 * operand2
                Case "/"
                    If operand2 <> "0" Then
                        result = operand1 / operand2
                    Else
                        Label1.Text = "Nelze dělit nulou!"
                        Exit Sub
                    End If
            End Select
            Label1.Text = result
            ' vynulujeme operátor
            operatorx = ""
        Catch exc As Exception
            MsgBox(exc.Message)
            Label1.Text = "CHYBA"
        End Try

    End Sub
End Class

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

a na vkladanie kodu , to neviem pise sa ze mam kliknut na VB code ale mne sa tam kliknut neda :( takze sa ospravedlnujem

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

Ve všech prohlížečích jsem to testoval a fungovat by to mělo. Co máte za prohližeč?

Jinak v té knize určitě nic špatně není, musíte opravdu pozorně číst. Stačí hodit jeden řádek jinam, než patří, a je to špatně. Je důlžeité, abyste ale rozuměl tomu, co píšete. Naslepo opisovat kousky kódu nemá žádný smysl. Zkuste si pozorně přečíst tu knihu od začátku, nebo seriály na tomto serveru.

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

Diskuse: Práce se soubory, úvod do objektově orientovaného programování

Děkuji za další kvalitní článek, který zároveň vyřešil můj dotaz na fóru!!

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

Moc krásný a poučný článek ale omlouvám se nevím zda to bylo mnou nebo složitostí probrané látky,někde sem udělal chybu a aplikace neukládá obrázek a vubec celé se mi nějak slilo dohromady.Bylo by možné,časem,sepsat něco jako soupis možností OOP?

Děkuji.

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

Mohl byste vysvětli pojem "soupis možností OOP?"

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

Myslím tím jakýsi seznam,nebo pár příkladu, v čem je lebší,k čemu se dá použít jako jediná možnost a taky třeba proč se velmi často o OOP hovoří jako o zázraku? Četl jsem o OOP pár článku a všuse to autor popisoval jako dokonalou "věc".V čem tkví ta dokonalost?

nahlásit spamnahlásit spam 0 / 2 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