Články

Tisk článku Tisk článku

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

[Zpět na kategorii]

Datum: 19. 11. 2007 23:26       Autor: Tomáš Herceg       Zobrazeno: 26285x

Kategorie: Soubory

Témata: VB.NET

Seriál: VB.NET od začátku - Díl 15.

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.


> Na začátek

 

Hodnocení:

Hlasů: 45
Zvolte své hodnocení

Tomáš Herceg

Jsem hlavním softwarovým architektem ve společnosti Riganti. Mám dlouholeté zkušenosti s technologiemi ASP.NET, Silverlight, WPF a XNA. Působím též jako lektor ve společnosti Gopas a již třetím rokem jsem držitelem ocenění Microsoft Most Valuable Professional.

Podpořte vznik dalších článků

Související články

DílNázev článku 
Díl 1. Úvod, vývojové prostředí a základní pojmy 25. 4. 2007
Díl 2. Začínáme programovat 25. 4. 2007
Díl 3. Proměnné a datové typy 25. 4. 2007
Díl 4. Podmínky a operátory 26. 4. 2007
Díl 5. Složitější podmínky a rozhodovací struktury 26. 4. 2007
Díl 6. Cyklus For 5. 5. 2007
Díl 7. Pole 9. 5. 2007
Díl 8. Pole, cykly a práce se soubory 14. 5. 2007
Díl 9. Přidáváme druhý formulář 18. 5. 2007
Díl 10. Funkce a procedury 6. 7. 2007
Díl 11. Kolekce a pole 27. 7. 2007
Díl 12. Práce s textem a řetězci 17. 8. 2007
Díl 13. Úvod do grafiky 27. 8. 2007
Díl 14. Vykreslujeme graf 31. 8. 2007
Díl 15. Práce se soubory, úvod do objektově orientovaného programování 19. 11. 2007
Díl 16. Třídy a funkce .NET frameworku, o kterých je dobré vědět 31. 12. 2007
Díl 17. Objektově orientované programování - základy 30. 6. 2008
Díl 18. Dědičnost 6. 10. 2008

RSS Feed RSS Feed

Diskuse

Dík

Datum: 20.11.2007 18:10
Autor: Jan Novák
Hodnocení autora: 235
Příspěvků: 783
Děkuji za další kvalitní článek, který zároveň vyřešil můj dotaz na fóru!!
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

poučné a zajímavé

Datum: 20.11.2007 21:54
Autor: Roman Trakal
Hodnocení autora: -2
Příspěvků: 146
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.
 
           [Odpovědět]
 
Hodnocení: -2 Čekejte, prosím...

Re: poučné a zajímavé

Datum: 20.11.2007 21:56
Autor: Jan Novák
Hodnocení autora: 235
Příspěvků: 783
Mohl byste vysvětli pojem "soupis možností OOP?"
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: poučné a zajímavé

Datum: 20.11.2007 22:57
Autor: Roman Trakal
Hodnocení autora: -2
Příspěvků: 146
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?
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Metody vs. vlastnosti, funkčnost samotné třídy

Datum: 20.11.2007 22:49
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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
 
?
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Metody vs. vlastnosti, funkčnost samotné třídy

Datum: 21.11.2007 2:50
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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é.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Metody vs. vlastnosti, funkčnost samotné třídy

Datum: 21.11.2007 7:37
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
Děkuji za odpověď - stručné, jasné a vyčerpávající.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

pomoc

Datum: 29.11.2007 18:49
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
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 :)
 
           [Odpovědět]
 
Hodnocení: -2 Čekejte, prosím...

Re: pomoc

Datum: 29.11.2007 19:26
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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ý).
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: pomoc

Datum: 29.11.2007 21:07
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
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
 
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: pomoc

Datum: 29.11.2007 22:37
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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
 
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: pomoc

Datum: 29.11.2007 21:09
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
a na vkladanie kodu , to neviem pise sa ze mam kliknut na VB code ale mne sa tam kliknut neda :( takze sa ospravedlnujem
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: pomoc

Datum: 29.11.2007 23:31
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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.
 
           [Odpovědět]
 
Hodnocení: 2 Čekejte, prosím...

pomoc

Datum: 24.11.2007 18:37
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: pomoc

Datum: 24.11.2007 23:31
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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ů.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Viktor

Datum: 24.11.2007 23:42
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
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: Damnation@zoznam.sk
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 25.11.2007 0:18
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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"...:))
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 25.11.2007 12:29
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
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 .
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 25.11.2007 13:51
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Viktor

Datum: 25.11.2007 14:50
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
mate aj nejake ine pomocky na ucenie ako web ?
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 25.11.2007 15:32
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
pouze nějakých pár základních publikací (asi 3), ale nejvíc stejně čerpám z internetu.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 25.11.2007 16:33
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 25.11.2007 19:11
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 26.11.2007 17:58
Autor: David Damnationnn
Hodnocení autora: 2
Příspěvků: 2
diki za radu . A ak sa smiem spytat na akom projekte pracujete Vy ?
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Viktor

Datum: 26.11.2007 20:12
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
Smiete - je to dost specifická aplikace - program na odbavování televizního vysílání pro obecní televizi.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 26.11.2007 20:22
Autor: David Damnationnn
Hodnocení autora: 2
Příspěvků: 2
tak to mi moc nehovori :)
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: Viktor

Datum: 26.11.2007 20:47
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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á.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 1.12.2007 7:08
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Viktor

Datum: 5.1.2008 0:50
Autor: neregistrovaný (85.207.11.34)
Hodnocení autora: není
Příspěvků: 0
Zajímám se také o odbavování pořadů v kabelovce, ozvi se na josefmatuska@seznam.cz. Díky. JM.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

námět na další menší díl seriálu nebo dotaz-matematika-matice

Datum: 28.11.2007 12:05
Autor: Jan Malý
Hodnocení autora: 1
Příspěvků: 3
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
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: námět na další menší díl seriálu nebo dotaz-matematika-matice

Datum: 30.11.2007 9:41
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
Mohl bych na toto téma napsat seriál, ale bude mi to chvíli trvat.
 
           [Odpovědět]
 
Hodnocení: 2 Čekejte, prosím...

Re: námět na další menší díl seriálu nebo dotaz-matematika-matice

Datum: 1.12.2007 7:09
Autor: neregistrovaný (84.47.49.224)
Hodnocení autora: není
Příspěvků: 0
tema na tu "tlacitkovu , co je aj vo windovse " kalkulacku ?
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

dotaz na přetěžování a třídy

Datum: 1.12.2007 23:15
Autor: neregistrovaný (83.69.46.1)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 1:08
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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).
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 13:37
Autor: neregistrovaný (83.69.46.1)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 14:03
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 15:41
Autor: neregistrovaný (83.69.46.1)
Hodnocení autora: není
Příspěvků: 0
Vyzkoušel jsem, je to tak. Děkuji
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Form1.Designer.vb

Datum: 7.2.2008 17:54
Autor: Petr Slezák
Hodnocení autora: 6
Příspěvků: 60
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
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 14:04
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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á.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 16:23
Autor: neregistrovaný (83.69.46.1)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 23:07
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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.
 
           [Odpovědět]
 
Hodnocení: 1 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 3.12.2007 9:55
Autor: neregistrovaný (80.95.100.99)
Hodnocení autora: není
Příspěvků: 0
Díky, budu s tím pokusníkovat.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 14:35
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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()".
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dotaz na přetěžování a třídy

Datum: 2.12.2007 15:19
Autor: neregistrovaný (83.69.46.1)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Obrázek jako str

Datum: 4.2.2008 20:21
Autor: Petr Slezák
Hodnocení autora: 6
Příspěvků: 60
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
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

dialog pro výběr obrázku

Datum: 7.2.2008 13:17
Autor: neregistrovaný (193.84.218.104)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dialog pro výběr obrázku

Datum: 7.2.2008 13:35
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: dialog pro výběr obrázku

Datum: 7.2.2008 15:39
Autor: neregistrovaný (193.84.218.104)
Hodnocení autora: není
Příspěvků: 0
Děkuji za rychlou odpověď. To samozřejmě zvládnu :). Jen jsem ten odstavec špatně pochopil.
Martin K.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

HELP !!!

Datum: 20.2.2008 0:27
Autor: neregistrovaný (85.71.145.90)
Hodnocení autora: není
Příspěvků: 0
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 mr.weeman@seznam.cz)
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: HELP !!!

Datum: 20.2.2008 7:05
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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).
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: HELP !!!

Datum: 20.2.2008 8:14
Autor: neregistrovaný (85.71.145.90)
Hodnocení autora: není
Příspěvků: 0
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!
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Prepisovani

Datum: 26.2.2008 15:04
Autor: Martin Valent
Hodnocení autora: 0
Příspěvků: 7
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é.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Prepisovani

Datum: 26.2.2008 16:53
Autor: Petr Slezák
Hodnocení autora: 6
Příspěvků: 60
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
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Editace souboru

Datum: 3.3.2008 13:54
Autor: neregistrovaný (193.108.106.20)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: Editace souboru

Datum: 3.3.2008 14:40
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

otázka

Datum: 23.3.2008 22:12
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: otázka

Datum: 23.3.2008 22:24
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: otázka

Datum: 24.3.2008 21:55
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
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?
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: otázka

Datum: 24.3.2008 22:15
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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á.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: otázka

Datum: 24.3.2008 23:11
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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...
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: otázka

Datum: 25.3.2008 8:00
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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.).
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Re: otázka

Datum: 25.3.2008 18:14
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
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?
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

K matfyzu

Datum: 29.3.2008 12:49
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: K matfyzu

Datum: 29.3.2008 14:27
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Datum

Datum: 2.4.2008 20:23
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: Datum

Datum: 21.5.2008 12:29
Autor: neregistrovaný (85.248.56.3)
Hodnocení autora: není
Příspěvků: 0
If mojDatum = #08/05/2008# Then ...
(Teraz si nie som istý, ale zrejme ide o 5. august...)

 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

openfiledialog

Datum: 15.4.2009 18:32
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
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
 
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: openfiledialog

Datum: 15.4.2009 18:50
Autor: Tomáš Herceg
Hodnocení autora: 1673
Příspěvků: 3536
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.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: openfiledialog

Datum: 16.4.2009 20:46
Autor: neregistrovaný (88.100.109.83)
Hodnocení autora: není
Příspěvků: 0
Dekuji za rychlou odpoved a omlouvam se za spatne umisteni
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Název ukládaného souboru

Datum: 23.6.2009 21:19
Autor: neregistrovaný (81.25.23.1)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: Název ukládaného souboru

Datum: 23.6.2009 21:48
Autor: Viktor Langer
Hodnocení autora: 300
Příspěvků: 641
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
 
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: Název ukládaného souboru

Datum: 24.6.2009 6:55
Autor: neregistrovaný (85.160.69.133)
Hodnocení autora: není
Příspěvků: 0
Děkuji za rychlou pomoc již je vše v pořádku.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Image.Save( ...

Datum: 29.7.2009 15:49
Autor: neregistrovaný (194.228.18.139)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Databáze

Datum: 6.9.2009 22:11
Autor: neregistrovaný (85.161.89.101)
Hodnocení autora: není
Příspěvků: 0
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
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Re: Databáze

Datum: 6.9.2009 22:14
Autor: neregistrovaný (85.161.89.101)
Hodnocení autora: není
Příspěvků: 0
Ještě upřesnění. Jedná se mi o obyčejnou lokální databázi v Accessu.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Konec řádku

Datum: 7.12.2009 13:44
Autor: neregistrovaný (81.23.33.100)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

rr.EndOfStream

Datum: 10.4.2010 10:26
Autor: Alžběta Brychtová
Hodnocení autora: 1
Příspěvků: 12
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ě.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

Zamrzání aplikace

Datum: 12.7.2010 8:07
Autor: neregistrovaný (88.81.91.130)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: -1 Čekejte, prosím...

rw.Close()

Datum: 13.11.2010 3:33
Autor: neregistrovaný (89.102.126.125)
Hodnocení autora: není
Příspěvků: 0
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!
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Jakdi

Datum: 8.6.2011 22:17
Autor: neregistrovaný (213.192.4.162)
Hodnocení autora: není
Příspěvků: 0
Zdravim .. jsem se chtěl jen zeptat nemáš tento zdrojak někde ke stažení???
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

cesta k textovýmu souboru

Datum: 28.9.2011 21:04
Autor: neregistrovaný (88.102.114.153)
Hodnocení autora: není
Příspěvků: 0
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.
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...

Možná trochu hloupý dotaz

Datum: 19.1.2012 10:03
Autor: neregistrovaný (94.229.93.17)
Hodnocení autora: není
Příspěvků: 0
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ěď
 
           [Odpovědět]
 
Hodnocení: 0 Čekejte, prosím...
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.