× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

VB – 48. lekce

[ http://programujte.com/profil/27-jiri-chytil/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       4. 10. 2006       19 235×

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í

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.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006100102-vb-48-lekce/ ].