VB – 48. lekce
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

VB – 48. lekceVB – 48. lekce

 

VB – 48. lekce

Google       Google       4. 10. 2006       15 754×

48.1 MDI obecně
48.2 Proč v MDI objekty a jak nám pomůžou
48.3 Práce s MDI
48.4 Domácí úkol
48.5 V další lekcí

Reklama
Reklama

48.1 MDI

Co je to MDI?

MDI a SDI (to nás nebude zajímat) jsou, zkusím to říci zjednodušeně, typy programů podle toho, jak se v nich pracuje s dokumenty. SDI (Single Dokument Interface) nám umožňuje mít v jednom otevřeném programu otevřený jediný dokument. Jako příklad lze uvést třeba poznámkový blok. Zatímco v MDI (Multi Dokument Interface) může být otevřena spousta dokumentů. Jako příklad lze uvést programy jako PaintShop a Photoshop, kde můžete mít otevřeno spoustu obrázků.

A co nám vůbec MDI přináší?

No začínajícím programátorům možná bolavou hlavu, ale jinak jen samé výhody. V jednom jediném spuštěném programu můžeme mít otevřenu spoustu dokumentů. Je to přehledné, příjemnější na práci, pokud třeba pracujte mezi dvěma dokumenty. A je toho víc, na to přijdete časem.

Co je ještě třeba vědět o MDI?

Je zde několik záludných věcí, na které je třeba dávat pozor, a to:
› V celém projektu může být jen jediný MDI formulář, víc nejspíš stejně nebudete potřebovat.
› Formuláře jsou potom dceřiné a běžné formy, formuláře dceřiné jsou podřazeny formuláři MDI, ostatní jsou mu „rovny“.
› Menu formuláře MDI je velice propracované a toho bude využívat, funguje totiž tak, že pokud dceřiný formulář nemá menu, je zobrazeno MDI formu, pokud ale menu má, je zobrazeno jeho menu. To je naprosto skvělá i, když nahraditelná, vlastnost, ale proč si komplikovat život, když ji máme po ruce.
› Pokud chcete na samotný MDI form vložit nějaké objekty, používá se jako kontejner picture box.
› Na MDI form nejde vkládat běžné objekty, musíte využít picture boxu, na který je vložíte. Vložit lze Timer a jiné, v run módu neviditelné, objekty a objekt data.
› O zbytku si povíme během následujících lekcí.

Jak na MDI program?

Vytvoříme nový projekt, protože soudruhy od M$ „nenapadalo“, že lidi budou MDI projekty tvořit, tak musíme vytvořit standardní EXE a potom formulář MDI přidat. Otevřeme si okno Project properties a zvolíme si, že si přejeme, aby se spustil prvně MDI formulář a aby nebyl prázdný, tak Form1, který nám tam zůstal, lehce upravíme, a to tak, že jeho vlastnost MDIChild nastavíme na True. Tím pádem máme vytvořený dceřiný formulář. Teď formulář upravíme podle našeho gusta; pokud tedy budeme otevírat textové dokumenty, vložíme text box, pokud grafiku, tak třeba picture box. A nyní už to bude právě o objektech.


48.2 Proč v MDI objekty a jak nám pomůžou

Nyní tedy k objektům, jak je využít? Pokud bychom dělali v MDI a někdo chtěl mít otevřených 10, 20, 50 nebo i více dokumentů, bylo by dělání každého zvlášť tak trochu otrocká práce. My si tedy uděláme jen jeden jediný. Ten ovšem jako takový nepoužijeme, ale využijeme ho jako třídu, šablonu, podle které je budeme vytvářet jako nové objekty. Kód je veskrze prostý.

Dim objDoc As Object
Private Sub mnuNovy_Click()
    Set objDoc = New Form1
    objDoc.Show
End Sub

Kód potom může být různě upraven pro vaše účely; může mít navíc funkce, jako je čítání dokumentů, takže nebudte mít otevřeny jen samé Nový Dokument, ale Nový Dokument 1, Nový Dokument 2, Nový Dokument 3, atd. Viz kód.

Private Sub mnuNovy_Click()
    Static count As Long
    count = count + 1
    Set objDoc = New Form1
    objDoc.Caption = "Nový Dokument" & count
    objDoc.Show
End Sub

Každý formulář dostane vlastní handle. Stane se z něj tedy plnohodnotný formulář se vším všudy. Začali jsme s objekty tedy trošičku jinak, a to z toho důvodu, že nám onu šablonu netvořila třída , ale formulář. Ke třídě se dostaneme v další lekci.


48.3 Práce s MDI

Otevření dokumentu, jak mi jistě všichni (doufám že všichni) dáte za pravdu, není dostatečné pro plnohodnotnou práci s dokumentem. Je potřeba nějaké ukládání a podobné procedury; ukládání a podobné bych nechal na vás, ale jak to vyřešit ohledně volání na některé základní funkce, se podíváme hned teď. Ostatní postupem času zvládneme také.

Ukládání dokumentu a reakce na pokus o jeho zavření

Ve vetšině programů, když editujete nějaký soubor a pokusíte se ho zavřít, na vás vyskočí s výzvou, zda chcete uložit změny nebo zda si přejete dokument uložit. My tohle teď našemu dokumentu přidáme také. Podíváme se tedy postupně na funkce Uložit, Uložit jako a právě na onu výzvu k uložení.

Co se týká ukládání, skládá se jen z několika a dotazů a je volán z menu formuláře, viz kód:

Private Sub mnuSave_Click()
 On Error GoTo konec

    If Me.txtMain.Text = "" Then 'dotaz na uložení prázdného dokumentu
        ret = MsgBox("Soubor" & Form.Caption & "je prázdný opravdu si přejete jej uložit?", vbYesNo, "Dotaz:")
        If ret = 7 Then Exit Sub
    End If
        
    If Left(Me.Caption, 7) = "Soubor:" Then 'ukládání dokumentum, který je upraven, již dříve existoval
        Lenght = Len(Me.Caption)
        Path = Right(Me.Caption, Lenght - 8)
        Open Path For Output As #1
        Print #1, Me.txtMain.Text
        Close #1
        
    Else: 'upravení dokumnetu který je nový
        With MainForm.CommonDialog1
            .Filter = "Textové soubory *.txt|*.txt"
            .CancelError = True
            .ShowSave
            Open .FileName For Output As #1
            Print #1, Me.txtMain.Text
            Close #1
            Me.Caption = "Soubor: " & .FileName
        End With
    End If
    Exit Sub
konec:
    MsgBox "Chyba při ukládání souboru. Soubor nelze uložit", vbCritical, "Chyba:"
End Sub

Funkce Uložit jako je trochu jednodušší, nemusí se totiž kontrolovat, zda dokument již existuje, viz kód:

Private Sub mnuSaveAs_Click()
    On Error GoTo konec
    
    If Me.txtMain.Text = "" Then 'dotaz na uložení prázdného dokumentu
        ret = MsgBox("Soubor " & Me.Caption & " je prázdný, opravdu si jej přejete uložit?", vbYesNo, "Dotaz:")
        If ret = 7 Then Exit Sub
    End If
    
    With MainForm.CommonDialog1 'ukládání
        .Filter = "Textové soubory *.txt|*.txt; Vše *.*|*.*"
        .CancelError = True
        .ShowSave
        Me.Caption = "Soubor: " & .FileName
        Open .FileName For Output As #1
        Print #1, Me.txtMain.Text
        Close #1
    End With
    Exit Sub
    
konec: 'ošetření chyb
    If Err.Number = 32755 Then
        Exit Sub
    Else:
        MsgBox "Nastala chyba při ukládání", vbCritical, "Chyba:"
    End If
End Sub

Na závěr bych se tedy zmínil k zavírání formuláře a k rekci na tuto událost. Všechnoby, si myslím, mělo vyplynout z kódu, který je mezi námi jen lehce okomentován stylem, který mi vyhovuje, tj. komentování bloků kódu a ne každého příkazu.

Private Sub Form_Unload(Cancel As Integer)
    Dim Lenght As Long
    On Error GoTo konec
    'výběr mezi tím zda uložit nebo neuložit či storno
    ret = MsgBox("Chcete uložit změny v souboru: " & Me.Caption & "?", vbYesNoCancel, "Ukládání: ")
    If ret = 2 Then Cancel = True
    If ret = 7 Then Cancel = False
    If ret = 6 Then
    
        If Me.txtMain.Text = "" Then 'dotaz na uložení prázdného dokumentu
            ret = MsgBox("Soubor: " & Me.Caption & " je prázdný, opravdu si jej přejete uložit?", vbYesNo, "Dotaz:")
            If ret = 7 Then Exit Sub
        End If
        
        If Left(Me.Caption, 7) = "Soubor:" Then 'ukládání dokumentu, který je upraven, již dříve existoval
            Lenght = Len(Me.Caption)
            Path = Right(Me.Caption, Lenght - 8)
            Open Path For Output As #1
            Print #1, Me.txtMain.Text
            Close #1
            Cancel = False
            
        Else: 'uložení dokumnetu který je nový
            With MainForm.CommonDialog1
                Cancel = True
                .Filter = "Textové soubory *.txt|*.txt"
                .CancelError = True
                .ShowSave
                Open .FileName For Output As #1
                Print #1, Me.txtMain.Text
                Close #1
                Cancel = False
            End With
        End If
    End If
    Exit Sub
    
konec: 'ošetření chyb
    If Err.Number = 32755 Then
        Exit Sub
    Else:
        MsgBox "Nastala chyba při ukládání", vbCritical, "Chyba:"
    End If
End Sub

Tato událost nastane, i když se zavírá hlavní MDI formulář.


48.4 Domácí úkol

Za domácí úkol je vytvořit si jakýkoliv program, který pracuje v režimu MDI.

Za druhé – zjistit, co je chyba 32755 a proč zpracovávám právě takto.


    If Err.Number = 32755 Then
        Exit Sub
    Else:
        MsgBox "Nastala chyba při ukládání", vbCritical, "Chyba:"
    End If

48.5 V další lekcí

Budeme pokračovat v objektech, které nám pomáhají v MDI, a podíváme se na vyřešení problému s funkcí zpět a vpřed. Ale třeba i na otevření existujícího dokumentu.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

1 názor  —  1 nový  
Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Jiří ChytilAutor programuje ve VB, zajímá se o elektrotechniku, studuje na SOŠ Elektrotechnické - obor číslicová technika.
Web    

Nové články

Obrázek ke článku Blockchain & Bitcoin konference

Blockchain & Bitcoin konference

V pátek 19. 5. 2017 se v pražském konferenčním centru Andel’s konala Blockchain & Bitcoin konference. Řada odborníků a podnikatelů v oboru blockchainu a kryptoměn představila možnosti budoucího směřování tohoto oboru. Speakeři většinou rusky mluvící provenience prezentovali řešení svých firem založená na technologii blockchainu.

Reklama
Reklama
Obrázek ke článku Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Bezpečnostní tým Cisco Talos odhalil celkem 4 kampaně dosud neobjeveného malwaru, který dostal jméno KONNI. Ten se dokázal úspěšně maskovat od roku 2014. Zpočátku se malware zaměřoval pouze na krádeže citlivých dat. Za 3 roky se ale několikrát vyvinul, přičemž jeho současná verze umožňuje útočníkovi z infikovaného počítače nejenom krást data, ale i mapovat stisky na klávesnici, pořizovat screenshoty obrazovky či v zařízení spustit libovolný kód. Pro odvedení pozornosti oběti zasílali útočníci v příloze také obrázek, zprávu a výhružkách severokorejského režimu či kontakty na členy mezinárodních organizací.

Obrázek ke článku Pouze jedna z deseti lokálních firem ví o pokutách plynoucích z GDPR

Pouze jedna z deseti lokálních firem ví o pokutách plynoucích z GDPR

Trend Micro, celosvětový lídr v oblasti bezpečnostních řešení a VMware, přední světový dodavatel cloudové infrastruktury a řešení pro podnikovou mobilitu, oznámily výsledky výzkumu mezi českými a slovenskými manažery zodpovědnými za ochranu osobních údajů, který zjišťoval, jak jsou připraveni na nové nařízení o ochraně osobních údajů (GDPR). Většina firem v České republice a na Slovensku nad 100 zaměstnanců je již s novým nařízením GDPR obeznámena. Výzkum provedený ve spolupráci s agenturou Ipsos ukázal, že téměř 8 firem z 10 o nařízení ví, přičemž jeho znalost je o něco vyšší na Slovensku (89 %) než v České republice (69 %).

Obrázek ke článku Vyděračský software Locky se vrací, tváří se jako potvrzení platby, odhalil tým Cisco Talos

Vyděračský software Locky se vrací, tváří se jako potvrzení platby, odhalil tým Cisco Talos

Jeden z nejznámějších ransomwarů, Locky, se vrací. Po většinu roku 2016 patřil mezi nejrozšířenější vyděračské softwary. Ke svému šíření využíval emailové kampaně s infikovanými přílohami. Ransomware Locky byl rozesílán prostřednictvím botnetu (internetový robot zasílající spamy) Necurs. Jeho aktivita na konci roku 2016 téměř upadla a spolu s ní i šíření ransomwaru Locky. Před několika týdny se Necurs opět probudil a začal posílat spamy nabízející výhodný nákup akcií. Dne 21. dubna zaznamenal bezpečnostní tým Cisco Talos první velkou kampaň ransomwaru Locky prostřednictvím botnetu Necurs za posledních několik měsíců.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý