Zpět na seznam článků     Číst komentáře (10)     Verze pro tisk

C# tipy #6 - Jednoduchý editor RTF souborů

Autor: sukovanej   
17.3.2013

V článku si ukážeme, jak vytvořit jednoduchý editor souborů RTF se základními formátovacími prvky a se záložkami.


Jak již perex článku napovídá, pokusím se ukázat, jak lze naprogramovat jednoduchý editor souborů RTF. Editor by měl umět soubory vytvářet a upravovat. Také bude umět alespoň základní formátovací prvky, jako je například tučné písmo, kurzíva, podtržené písmo, nebo velikost písma. A konečně, bude umět pracovat s více soubory za pomoci záložek. Nuže, s chutí do práce!

Návrh uživatelského rozhraní

Rozhodl jsem se moc neexperimentovat a zůstat u klasického Word 2003 stylu, takže uživatelské rozhraní programu bude obsahovat jedno horní menu, pod ním panel s nástroji, pracovní místo pro psaní a nakonec nějaký panel s informačním textem (tj., co se právě v aplikaci děje).

"Naházejte" si komponenty na formulář přibližně tak, jako mám já na obrázku. Největší část programu vypadá, jako by na ní nic nebylo, ale je zde komponenta tabControl, která má nastavenou vlastnost Dock = fill, díky níž se při změně velikost formuláře vždy rozšíří tak, aby zaplňovali celý svůj prostor formuláře. Nahoře v menu je pod položkou Soubor ještě skryto dalších pět itemů - Uložit, Nový, Zavřít, Otevřít a Ukončit.

Jdeme programovat!

Pro úpravu souborů použijeme komponentu richTextBox, která je pro tento typ souborů přímo udělaná.

Nejdříve si vytvoříme pomocnou třídu, která bude obsahovat metodu pro přidání záložky a pro získání instance richTextBoxu, který zrovna prohlížíme.

Třída
  1. class Tabs
  2. {
  3.     public TabControl tabControl;
  4.  
  5.     public Tabs(TabControl tabControl)
  6.     {
  7.         this.tabControl = tabControl;
  8.     }
  9.  
  10.     public void Add(string Title)
  11.     {
  12.  
  13.     }
  14.  
  15.     public RichTextBox GetSelectedBox()
  16.     {
  17.  
  18.     }
  19. }

V konstruktoru třídy jsme si vyžádali instanci komponenty TabControl. TabControl obsahuje kolekci TabPages, s pomocí níž můžeme pracovat s jednotlivými záložkami.

Začněme metodou Add. Nejdříve vytvoříme instanci třídy TabPage a upřesníme její vlastnost Text (z argumentu metody). Dále vytvoříme novou instanci třídy RichTextBox a tu přidáme do kolekce Controls instance třídy TabPage. Tuto celou instanci přidáme komponentě TabControl do kolekce TabPages.

Add
  1. public void Add(string Title)
  2. {
  3.     TabPage newTabPage = new TabPage()
  4.     {
  5.         Text = Title
  6.     };
  7.  
  8.     RichTextBox newTextBox = new RichTextBox()
  9.     {
  10.         Dock = DockStyle.Fill,
  11.     };
  12.  
  13.     newTabPage.Controls.Add(newTextBox);
  14.     tabControl.TabPages.Add(newTabPage);
  15. }

Metoda GetSelectedBox bude jednodušší. Zde pouze zkontrolujeme, jestli jsou vůbec v kolekci TabPages nějaké položky a pokud ano, metoda vrátí instanci richTextBoxu na vybrané záložce. Jesliže v kolekci žádné prvky nejsou, necháme vrátit null.

GetSelectedBox
  1. public RichTextBox GetSelectedBox()
  2. {
  3.     if (tabControl.TabPages.Count > 1)
  4.         returun (RichTextBox)tabControl.SelectedTab.Controls[0];
  5.     else
  6.         return null;
  7. }

Implementace

Nejdříve vytvoříme instanci naší třídy Tabs a předáme jí instanci komponenty TabControl.

  1. private Tabs tabPages;
  2.  
  3. public Form1()
  4. {
  5.     InitializeComponent();
  6.     tabPages = new Tabs(tabControl1);
  7. }

Přidání nové záložky provede jednoduchým jednořádkovým kódem

  1. tabPages.Add("Nový soubor");

Při odstraňování záložky pouze zkontrolujeme, jestli je vůbec nějaká vytvořená a potom ji smažeme na základě indexu z vlastnosti SelectedIndex.

  1. if (tabPages.GetSelectedBox() != null)
  2. {
  3.     tabControl1.TabPages.RemoveAt(
  4.         tabControl1.SelectedIndex);
  5. }

Ukončení aplikace se provede následovně

  1. this.Close();

Formátování

Co se týče formátování (tučné, kurzíva, podtrženo), musíme nejdříve samozřejmě zkontrolovat, jestli je vybrána (reps., jestli existuje) nějaká záložka. Pokud ano, musíme zjistit, jestli už není vybraný text náhodou zvoleným formátem upraven. Pokud je, toto formátování zrušíme a pokud není, tak textu toto formátování nastavíme.

Pokud budeme chtít text "ztučnit", nejdříve musíme zjistit, jestli už tučně vytištěn není. Pokud je, tučný formát zrušíme a pokud není, tak mu tento formát nastavíme.

(K formátu právě vybraného textu se v komponentě richTextBox dostaneme pomocí vlastnosti SelectionFont.)

  1. if (tabPages.GetSelectedBox() != null)
  2. {
  3.     if (tabPages.GetSelectedBox().SelectionFont.Bold)
  4.     {
  5.         tabPages.GetSelectedBox().SelectionFont = new Font(tabPages.GetSelectedBox().SelectionFont.FontFamily,
  6.                            tabPages.GetSelectedBox().SelectionFont.Size);
  7.     }
  8.     else
  9.     {
  10.         tabPages.GetSelectedBox().SelectionFont = new Font(tabPages.GetSelectedBox().SelectionFont.FontFamily,
  11.                         tabPages.GetSelectedBox().SelectionFont.Size,
  12.                         FontStyle.Bold);
  13.     }
  14. }

Analogicky to bude i u kurzívy a podtrženého písma. U změny velikost písma to bude vypadat také velice podobně. Jen již nemusíme kontrolovat, jestli takoví formát (resp. velikost) vybraný text náhodou nemá.

  1. if (tabPages.GetSelectedBox() != null)
  2. {
  3.     tabPages.GetSelectedBox().SelectionFont = new Font(tabPages.GetSelectedBox().SelectionFont.FontFamily,
  4.                     (float)Convert.ToDouble(SizeComboBox.Text));
  5.             }

Otevírání a ukládání souborů

K ukládání a otevírání souborů nám dobře poslouží komponenty SaveFileDialog a OpenFileDialog. SaveFileDialog při zavolání ShowDialog() otevře dialogovou okno, v němž si můžeme zvolit soubor. Po výběru souboru a stisku na tlačítko OK metoda ShowDialog() vrátí strukturu Dialog.OK, takže můžeme podmínkou jednoduše informace zpracovat. K absolutní adrese vybraného souboru se dostaneme s pomocí vlastnosti FileName. RichTextBox má potom na otevírání(resp. ukládání) souborů vlastní metodu LoadFile (resp. SaveFile).

Ukládání/otevírání
  1. SaveFileDialog dialog = new SaveFileDialog();
  2. dialog.Filter = "RTF |*.rtf";
  3. if (dialog.ShowDialog() == DialogResult.OK)
  4. {
  5.     tabPages.GetSelectedBox().SaveFile(dialog.FileName);
  6. }

Při otevírání souboru ještě musíme pamatovat na to, že uživatel nemusí být nutně na poslední záložce. Takže budeme postupovat tak, že po získání adresy souboru vytvoříme novou záložku, kterou pojmenujeme jako adresu souboru. Potom nastavíme vlastnost SelectedIndex na úplně poslední index a v tomto bodě již můžeme pracovat s naší metodou GetSelectedBox(), protože se určitě nacházíme na úplně poslední záložce.

  1. OpenFileDialog dialog = new OpenFileDialog();
  2. if (dialog.ShowDialog() == DialogResult.OK)
  3. {
  4.     tabPages.Add(dialog.FileName);
  5.     tabPages.tabControl.SelectedIndex = tabPages.tabControl.TabPages.Count - 1;
  6.     tabPages.GetSelectedBox().LoadFile(dialog.FileName);
  7. }

Na závěr

Doufám, že i přesto, že jsem opravdu upozorňoval jen na ty nejdůležitější části kód, se k zdárnému dokončení programu všichni doškrábají.

Je zde strašně moc věcí, které lze na aplikaci dodělat. Barva textu, informační text (status v dolní části programu), spoustu dalších formátovacích prvků,... Takže můžete zkoušet a zkoušet a pokud vymyslíte něco originálního, můžete se klidně pochlubit v komentářích.


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 3.7/10

1  2  3  4  5    
(známkování jako ve škole)