Hromadné ukládání dat do xml   otázka

VB.NET

Dobrý den, potřeboval bych poradit. Píšu program (VB.net ve VS2010 express), který obsahuje spoustu formulářů. V těch formulářích používám svoje komponenty a jejich metody vytvářejí xmlnody, které bych chtěl vkládat do kořenového xml souboru, reprezentující celý projekt. Jde o nody, které nesou hodnoty potřebné pro vyplnění položek formuláře.

Otázka zní: Je možnost, jak cyklem projet daný formulář, který by vyhledal všechny instance třídy řekněme typu "Class OvlPrvek" a vracel OvlPrvek1.xml OvlPrvek2.xml... as XmlNode? Chtěl bych to použít jako metodu formuláře, abych se nemusel starat u každého nového formuláře o uložení dat ručním vypisováním jednotlivých položek. Děkuji a omlouvám se, pokud můj dotaz někoho uráží... Josef Hranec

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

Tohle zavání špatnou architekturou aplikace. Z jakého důvodu jsou tam vlastní ovládací prvky a proč je tam tolik formulářů? Všechno uživatelské rozhraní pro zadávání dat by ideálně mělo být na jednom formuláři a potom není problém udělat ukládání do XML. Tím, že je to takto rozházené se to bude zbytečně komplikovat (ale řešení to samozřejmě má).

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

Nechtěl jsem to rozepisovat příliš podrobně, ale věc se má následovně (v první řadě teda nezavrhuji myšlenku, že jde skutečně o špatnou architekturu :Q) Jsem konstruktér ocelových konstrukcí a skládám si program, který mi bude pomáhat při návrhu zejména přípojů prvků konstrukce. Tyto přípoje jsou specifické součásti a těžko se mi nalézá systém, jak je soustředit do jednoho formuláře. Proto jsem volil tuto cestu. V podstatě pro určitý přípoj volám na míru šitý formulář, ve kterém používám právě ty ovládací prvky,které reprezentují například nosník, šroub, statické účinky... Ty plním z databáze resp. xml souborů a z nich chci jako výstupy mimo jiné i ty xmlnody pro uložení v podstatě dané úlohy. Chápu, že může jít o špatný způsob, ale programování není můj obor a lépe to zatím neumím. Četl jsem si něco o kolekcích, což si myslím, že je cesta. Jen jsem nenašel způsob, jak se má přidat automaticky do list() každá instance třídy. Ale asi by to neměl být problém přidat ručně. Možná bych to mohl podrobně probrat se zkušeným programátorem, abych se vyhnul zbytečným chybám třeba i v konceptu. Je to ale myslím si složitější (jsem začátečník) a bude třeba nějaké osobní setkání s případnou konzultaci daného problému. Děkuji za rychlou reakci, Hranec

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

To ale stále není důvod pro vytvoření vlastního ovládacího prvku (vizuální komponenty).

Pokud jde o řešení původního problému, tak je možnost například vytvořit si nějakou třídu starající se o přijímání vstupu v podobě XML uzlů a vytváření potřebného výstupu. Instanci této třídy předáte v konstruktoru do formulářů pro zadávání dat. Pro získání výstupu potom zavoláte příslušnou metodu.

Pokud jste začátečník, nevybral jste si zrovna tu nejjednodušší věc pokud nemáte přehled o OOP a architektuře aplikací.

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

Začátečník jsem už strašně dlouho... :Q) Nějakou představu o OOP sice mám, ale chápu, že je to problém tak rozsáhlý, že jej nelze pojmout tak jednoduše. Nicméně mě to baví a pomáhá mi to v práci. Co se týče těch ovládacích prvků... Proč není důvod používat vlastní komponenty? Pokud teda mluvíme o tom samém. Jde mi o to, že ve VS vytvořím komponentu (user control) a na tu si přidám řekněme textbox a button. To se zabalí do kupy a v těle vzniklé třídy si můžu dělat co chci. Pak do formuláře přidám instance této komponenty (třídy) a jednoduše můžu využívat její metody. Mezi těmi metodami by byla prostě metoda, generující xmlnode a ten bych po zavolání přidal k ostatním xmlnodům všech instancí třídy. Mezi těmi metodami může být třeba i výstup do dokumentu. Pro to používám html, protože jsem se s tím už kdysi setkal a vyhovuje mi to. Nemluvě o tom že to jednoduše uložím pro word či excel a bez znalosti *.rtf, *.doc či *.xls můžu generovat i dost obsáhlý dokument. Je nějaký vhodnější způsob, jak třeba po stisknutí buttonu zavolat dialog, ve kterém vyberu určitou možnost (třeba profil nosníku-z mého oboru), v textboxu se mi objeví ten profil (třeba jen readonly) a v třídě mám zabalené všechny parametry, včetně metod poskytujících třeba tabulku hodnot v html či zmíněný xmlnod. Můžu je volat ve výpočtu, při exportu či ukládání. Možná jsem si vzal sousto větší, ale ani jsem netušil, do čeho se pouštím. V průběhu té práce ovšem spoustu věcí pochopím a naučím se (nemluvě o literatuře, kterou kupuji a studuji). Je to krásna vědní disciplína, která si žádá spoustu času(který moc nemám) a obětí. Děkuji Vám za podnět a pokusím se najít řešení. V podstatě mi šlo o to, jestli existuje možnost, jak automaticky prohledat formulář a do list() kolekce přidat všechny instance dané třídy. Tu možnost vygenerovat xml dokument bych nějak využil, šlo mi o ulehčení práce při psaní a hlavně o snížení chybovosti v kodu.

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

Vizuální komponentu má smysl vytvářet pouze když bude využívána více než na jednom místě. Vzhledem k tomu, že tvrdíte, že přípoje jsou specifické součásti, tak je předpoklad, že máte více různých vizuálních komponent.

Právě to vyváření XML uzlů máte špatně vymyšleno. Ideální způsob je zavolat metodu nějakého nadřazeného objektu, která přidá uzel do výsledné struktury na základě předaných parametrů, tedy přesně opačně než to máte vy. Vy se snažíte někde si držet uzly a potom něčím jiným procházet v cyklu komponenty a sestavovat výsledek z těchto uzlů. To je špatně. Vytvořte si "sestavovací" třídu a její instanci předejte všude, kde se zadávají nějaké parametry. Potom jednak odpadne nutnost procházení něčeho v cyklu a druhak tím oddělíte proces zadávání parametrů od vytváření výsledného objektu.

Musíte se dívat na jednotlivé součásti programu jako na samostatné, na sobě nezávislé části, jinak vám vznikne naprosto nehorázný slepenec, kde je všechno napevno svázané se vším a úprava sebemenší části bude vyžadovat úpravu všeho.

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

Pane Linharte, děkuji za reakci a Váš čas. Abych upřesnil... Ty komponenty nejsou specifické. Jsou to právě prvky těch specifických přípojů. Ve formulářích těch přípojů budou v různých kombinacích se objevující komponenty (nosníky, šrouby, svary) Tyto komponenty (není jich mnoho zatím) jsou i se svými metodami vždy stejné ve všech přípojích a já jen určuji jejich vlasnosti a jejich počet.

Přikládám nástin toho řešení. Vy tvrdíte, že někde držím nody, ale já je nikde nedržím. Vytvářím je až při procesu uložení (pokud teda chápu dobře to, co předkládám). Naopak, pokud budu vázat vytvoření nodů na zadání hodnoty, budu je muset držet v průběhu celé práce, což nepotřebuji. V podstatě bych musel mít vytvořený dokument xml otevřený a do něj zapisovat při změně hodnoty? Chápu to dobře?

Metodu vytvářející nod jsem umístil záměrně do třídy, ke které se váže právě proto, abych do věci nevháněl zmatek. Myslel jsem, že pro případnou úpravu čehokoliv, to bude právě ku prospěchu.

Chápu, že se asi díváte na tyto kroky s údivem, ale ono mi tak dělá radost, když to dělá co má. Asi to není úplně košer... Doporučil by jste nějakou vhodnou literaturu, ktará v rozumném rozsahu obsahuje problematiku OOP ve VB.NET

Public Class TridaA
    Private parh As Single
    Private parb As Single

    Public Property h() As Single
        Get
            Return parh
        End Get
        Set(ByVal value As Single)
            parh = value
        End Set
    End Property

    Public Property b() As Single
        Get
            Return parb
        End Get
        Set(ByVal value As Single)
            parb = value
        End Set
    End Property

    Public Function A() as Single
        Return h * b
    End Function

    Public Function Dokument() As String
        Return "h=" & h() & "m" & vbCrLf & "b=" & b() & "m" & vbCrLf & "A=" & A() & "m2" & vbCrLf
    End Function
End Class

Public Class Form1

    Public ctv1 As New TridaA
    Public ctv2 As New TridaA
    Public ctv3 As New TridaA
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ctv1.h = 2
        ctv1.b = 3

        ctv2.h = 22
        ctv2.b = 25

        ctv3.h = 0.2
        ctv3.b = 0.1
    End Sub

    Private Sub UlozDokument_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UlozDokument.Click

        Dim kolekce As New List(Of TridaA)({ctv1, ctv2, ctv3})
        Dim Vystup As String = ""

        For i = 0 To kolekce.Count - 1
            Vystup &= kolekce(i).Dokument() & vbCrLf
        Next

        Label1.Text = Vystup
    End Sub
End Class

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

Hodnoty pro vytváření nikde držet nemusíte. Použijete je až v případě potřeby přímým načtením hodnot z ovládacích prvků.

Podle toho co píšete nevíte, co je komponenta. Ta může být buď vizuální (běžné ovládací prvky), nebo nevizuální (Timer, BackgroundWorker). Vizuální komponenta se používá buď v případě, kdy nestačí funkčnost standardních ovládacích prvků (Button, TextBox, ListBox...) a je potřeba vytvořit kompletně vlastní, nebo v případě, kdy skupina standardních ovládacích prvků tvořících nějaký logický celek se používá na více místech (více formulářích).

Co se týče literatury, doporučuji Co programátory ve škole neučí aneb Softwarové inženýrství v reálné praxi (ISBN 80-251-0073-1), což je skvělá kniha, která se nezabývá konkrétními programovacími jazyky, ale právě architekturou aplikací, častými problémy při vývoji a zásadami správného psaní kódu.

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

Podle Vašeho popisu termín komponenta asi zhruba chápu. Nevypisoval jsem to pro stručnost. Ale komponenty běžně a rád používám (Teda ty vizuální-kdy skupina standardních ovládacích prvků...). Chtěl jsem jen nastínit, jak si představuji to vytváření nodů. A ten postup jak ho zmiňujete... Musel bych teda nějakou metodu zavolat, ale jako parametry bych jí musel dát seznam vstupů, jejichž hodnoty chci ukládat? Nebo by to bylo možno napsat tak, že si prostě zobne z formuláře to, co ji dle nějakých podmínek nařídím?

Děkuji za doporučení literatury, vypadá to dle popisu přínosně.

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

Pokud je těch parametrů hodně, můžete je předat ve formě struktury.

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

Po knize " Co programátory ve škole neučí aneb Softwarové inženýrství v reálné praxi (ISBN 80-251-0073-1)" se sháním již velmi dlouho.Netušíte někdo kde ji objednat?

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

Normálně už se neprodává, ale když si ji objednáte přes Internet (http://knihy.cpress.cz/), tak vám ji vytisknou. Takto jsem to udělal já.

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

Jj,díky.Už jsem kontaktoval cpress s dotazem na dotisk - ať už single či "hromadnější",tak budu doufat.

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

Tak bych se možná přidal... Pokud to budou tisknout, tak je asi lepší rovnou dvakrát, nebo víckrát... Nechcete na mě kontakt, pro případnou objednávku? Pokud není k dostání, tak bych to asi řešil podobně.

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

Cpress napsal:

"Dobrý den,

Vámi požadovaná kniha Co programátory ve škole neučí (9788025100738) je bohužel zcela vyprodaná, dotisk se neplánuje.

"

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

To je velmi mrzuté, ještě že jsem to stihnul včas. Před objednáním jsem zkoušel knihu sehnat i v jakékoliv elektronické podobě, ale bezúspěšně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • 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