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.