Wątek zablokowany 2011-04-28 18:55 przez madmike.

C# Edytor tekstu z pewnymi funkcjami

0

Witam,
Muszę napisać program w języku C# na zaliczenie, który będzie w stanie realizować pewne funkcje edytora tekstu.
Program ma umożliwiać:
– tworzenie nowego dokumentu
– otwieranie dokumentu
– zapisywanie dokumentu
– wyszukiwanie słów w tekście (np. mam jakiś w stylu ala ma kota, dajmy na to szuka wyrazu ala i jak znajduje ma wyświetlić komunikat, że taki wyraz jest w tekście, w przeciwnym razie ma wyskoczyć komunikat w stylu takiego wyrazu nie ma w tekście)
– zamianę słów w tekście (np. jest tekst asia ma psa, dajmy na to chce zamienić wyraz ma na posiada i tekst będzie brzmiał asia posiada psa).
Do wyszukiwania i zamiany słów nie wiem za bardzo czego użyć czy mam to zapisywać do tablicy czy mam używać String builderów (jeśli z których tych rzeczy mam używać to jak to powinno mniej więcej wyglądać w tym przykładzie).
Będę bardzo wdzięczny za pomoc.
Oto kod (to co mi się udało na razie stworzyć czyli tworzenie, otwieranie i zapisywanie dokumentu):

 using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace zad1l6
{
    public partial class Form1 : Form
    {
        string plik = "";

        public Form1()
        {
            InitializeComponent();
        }

        private DialogResult czyzapisac()
        {
            DialogResult odp = MessageBox.Show("Chcesz zapisać zmiany?", "Notatnik",
                    MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation);
            if (odp == DialogResult.Yes)
                zapiszPlikToolStripMenuItem_Click(null, null);
            return odp;
        }

        private void zamknijProgramToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void otwórzPlikToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                DialogResult odp = czyzapisac();
                if (odp == DialogResult.Cancel)
                    return;
                plik = "";
                textBox1.Clear();
            }
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Plik tekstowy (*.txt)|*.txt";
            dialog.Multiselect = false;
            dialog.ShowDialog();
            if (dialog.FileName != "")
            {
                plik = dialog.FileName;
                StreamReader f = new StreamReader(plik);
                textBox1.Text = f.ReadToEnd();
                f.Close();
            }
        }

        private void zapiszPlikToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (plik != "")
            {
                StreamWriter f = new StreamWriter(plik);
                f.Write(textBox1.Text);
                f.Close();
            }
            else zapiszJakoToolStripMenuItem_Click(sender, e);
        }

        private void zapiszJakoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog dialog = new SaveFileDialog();
            dialog.Filter = "Plik tekstowy (*.txt)|*.txt";
            dialog.ShowDialog();
            if (dialog.FileName != "")
            {
                plik = dialog.FileName;
                StreamWriter f = new StreamWriter(plik);
                f.Write(textBox1.Text);
                f.Close();
            }
        }

        private void nowyPlikToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (textBox1.Text != "")
            {
                DialogResult odp = czyzapisac();
                if (odp == DialogResult.Cancel)
                    return;
                plik = "";
                textBox1.Clear();
            }
        }
    }
}
0

rozwiąże wszystkie twoje problemy http://www.dotnetperls.com/ ;)

0

– wyszukiwanie słów w tekście (np. mam jakiś w stylu ala ma kota, dajmy na to szuka wyrazu ala i jak znajduje ma wyświetlić komunikat, że taki wyraz jest w tekście, w przeciwnym razie ma wyskoczyć komunikat w stylu takiego wyrazu nie ma w tekście)
– zamianę słów w tekście (np. jest tekst asia ma psa, dajmy na to chce zamienić wyraz ma na posiada i tekst będzie brzmiał asia posiada psa)

Klasy String i StringBuilder posiadają metody do wyszukiwania i zamiany tekstu.

1

Nie możesz dostaw się do komponentów innej formy jeśli są one private. Poza tym odwołanie Form1.CosTam to odwołanie się do klasy a nie do obiektu. Musisz operować na obiekcie. (Jesz ciasto anie przepis /ciasto = obiekt, klasa = przepis/. Poprzez klase dostęp jest tylko do pól klasowych (statycznych).

Poczytaj o podstawach.

0

Poczytaj o DialogResult i jak się okna dialogowe zamyka, bo na pewno nie przez Application.Exit() :D Jeśli już to this.Close();

Poza tym lepszą praktyką byłoby aby form1 udostępniało publiczną metodę(-y), którą wywoła wywołasz z dialogu.
Aby w dialogu mieć dostęp do tej metody w konstruktorze wyszukaj/zamień przekaż referencję do form1.

Inne rozwiązanie to wystawianie zdarzeń przez wyszukaj/zamień, do których podepnie się form1.

0

Poza tym lepszą praktyką byłoby aby form1 udostępniało publiczną metodę(-y), którą wywoła wywołasz z dialogu.
Aby w dialogu mieć dostęp do tej metody w konstruktorze wyszukaj/zamień przekaż referencję do form1.

Inne rozwiązanie to wystawianie zdarzeń przez wyszukaj/zamień, do których podepnie się form1.

Ciekawe jak to ma wyglądać? Byłbym bardzo wdzięczny za jakiś konkretny przykład (np. fragment kodu programu).

0

W okienku wyszukiwania utwórz propertisa, gdzie znajdzie się szukany tekst, np:

public string TextToFind {get; private set; }

ustaw dialog result dla przycisku "wyszukaj" na DialogResult.OK;

potem w klasie głównego okna, w akcji prowadzącej do wyświetlenia okna wyszukiwania:

using(FindFrm findFrm = new Findfrm())
{
   if(findFrm.ShowDialog() == DialogResult.OK)
       FindText(findFrm.TextToFind);
}

FindText to metoda, która zajmie się szukaniem tekstu przekazanego w parametrze.

0

Zakładam że mk3105 chce wyświetlać okna wyszukaj/zmień jako niemodalne, a nie jako modalne, dlatego odpada ShowDialog().

Ciekawe jak to ma wyglądać? Byłbym bardzo wdzięczny za jakiś konkretny przykład (np. fragment kodu programu).

Może weź się najpierw za przeczytanie jakiejś książki, a najlepiej kilku jeśli nie masz pojęcia jak ma to wyglądać. Ale z dobroci serca naskrobię kawałek.

public class ReplaceForm : Form
{
  DocumentForm _docForm;

  public ReplaceForm(DocumentForm docForm)
  {
    _docFoem = docForm;
   ...
  }

  void btnReplace_Click(object s, EventArgs e)
  {
    _docForm.ReplaceText(tbFindText.Text, tbReplaceTo.Text);
  }
}

// w DocumentForm
public void ReplaceText(string oldValue, string newValue)
{
  StringBuilder sb = new StringBuilder(tbDocText.Text);
  sb.Replace(oldValue, newValue);
  tbDocText.Text = sb.ToString();
}
0

Pisze jasno i wyraźnie: 'zad1l6.Form1' is a 'type' but is used like a 'variable'
translate.google.com jeśli masz problemy z angielskim

0

Eh, rozumiesz słowa, a nie znacznie.
Wiesz jaka jest różnica między typem a instancją typu (obiektem/zmienną)?
Ktoś ostatnio na forum posłużył się fajnym porównaniem, typ to przepis, a instancja to ciasto. Masz tam użyć (skonsumować :)) ciasto, a nie przepis.

0

Przeczytaj jakąkolwiek książkę o podstawach programowania. Nauka modą prób i błędów wcale nie jest dobra - prowadzi do rozwiązania problemu, bez nabycia wiedzy co stanowiło problem i dlaczego został rozwiązany.

0

Składniowo kod jest poprawny. Ale ty nadal nie rozumiesz co robisz. Sugestie abyś przeczytał książkę nie są złośliwe, to dla twojego dobra.
Analiza tego co napisałeś:
Do formularza zamieniaj przekazujesz string, który wewnątrz tegoż formularza modyfikujesz. String w .net to tym niezmienniczy (immutable type). Zmienionego stringa z formularza zamieniaj nigdzie nie zwracasz, nie pobierasz. Form1 nie umie wywróżyć zmiany.

0
  1. Nazwy klas wielką literą.
  2. Trzymamy się jednej konwencji, albo nazwy zmiennych po polsku albo po angielsku.
  3. Okno główne Twojego edytora powinno zawierać publiczną właściwość zwracającą tekst z TextBoxa.
  4. Okno do zmiany powinno mieć pole prywatne typu okna głównego oraz konstruktor ustawiający to pole.
  5. Metoda string.Replace() zwraca zmienionego stringa. Jego musisz wstawić do TextBoxa z głównego okna. Jak zrobisz dwa powyższe punkty, to wystarczy Ci coś takiego:
    this.poleOknaGlownego.TekstZTekstBoxa = this.poleOknaGlownego.TekstZTekstBoxa.Replace("ala", "ola");
0

Ta linijka powinna być w Zamieniaj.Zamien_Click. Ale nie zrobiłeś punktów 3 i 4, więc nie zadziała.

0
mk3105 napisał(a)
  1. Okno główne Twojego edytora powinno zawierać publiczną właściwość zwracającą tekst z TextBoxa.
    To ciekawe jaki fragment kodu za to odpowiada??

Wiesz co to właściwość? Wiesz jak napisać swoją? Wiesz co to TextBox i jak nazywa się Twój TextBox z tekstem? Napisanie własnej właściwości to nie jest jakieś rocket science.

  1. Okno do zmiany powinno mieć pole prywatne typu okna głównego oraz konstruktor ustawiający to pole.
    To z kolei próbowałem ustawić w linii

Twoje okno od zmieniania tekstu (Zamieniaj) nadal przyjmuje w konstruktorze zmienną typu string i przechowuje ją w prywatnym polu. A ma przyjmować typ okna głównego, czyli w Twoim przypadku typu Formatka. Mam nadzieje, że teraz jaśniej napisałem.

0

textBox1 jest PRYWATNYM polem klasy Formatka. NIE dostaniesz się do niego z zewnątrz, dlatego napisałem Ci, żebyś zrobił właściwość. A Ty sobie to olewasz.

public string TekstZTextboxa
{
    get { return this.textBox1.Text; }
    set { this.textBox1.Text = value; }
}

Serio takie to trudne? Czy po prostu nie wiesz co to właściwość i bałeś się spytać?

Druga sprawa:

Zamieniaj zamienianie = new Zamieniaj(Formatka);

Do konstruktora masz przekazać OBIEKT, a nie KLASĘ. Obiekt klasy Formatka, w tym momencie bieżący obiekt, czyli this. Po prostu:

Zamieniaj zamienianie = new Zamieniaj(this);

A w Zamien_Click ma być:

this.OknoGl.TekstZTextboxa = this.OknoGl.TekstZTextboxa.Replace(stareslowo.Text, noweslowo.Text);

Poczytaj o klasach, obiektach, zmiennych, modyfikatorach dostępu, bo bez tego nie ruszysz dalej. Nie chcę Ci dogryzać, po prostu widzę, że masz z tym braki. Jakby co, to pytaj gdy już będziesz coś wiedział.

0

Dlaczego dokonujesz losowych zmian zamiast przeczytać komunikat o błędzie?

Konstruktor w Zamieniaj ma przyjmować parametr typu Formatka, a nie Form.

0

Wczytaj się w komentarze:

namespace zad1l6
{
    public partial class Zamieniaj : Form
    {
        Form Oknogl;  // pole typu klasy bazowej Form (tylko dlaczego wielką literą, skoro nazwy pól pisze się małą?)

        public Zamieniaj(Formatka Oknoglowne)  // konstruktor przyjmujący parametr typu pochodnego (tylko dlaczego wielką literą, skoro nazwy argumentów pisze się małą?)
        {
            this.Oknogl=Oknoglowne;  // tu możesz przypisać obiekt klasy pochodnej, tak działa dziedziczenie
            InitializeComponent();
        }
        
        private void Zamien_Click(object sender, EventArgs e)
        {
            if (this.Oknogl.TekstZTextboxa.Contains(stareslowo.Text))
            {
                this.Oknogl.TekstZTextboxa = this.Oknogl.TekstZTextboxa.Replace(stareslowo.Text, noweslowo.Text); // a tu nie masz dostępu do właściwości TekstZTestboxa, bo pole Oknogl jest typu Form, a Form nie ma takie właściwości. Gdyby to pole było typu Formatka, nie byłoby problemu
            }
            else
            {
                MessageBox.Show("Tekst nie zawiera tego słowa", "Komunikat");
            }
        }
    }
}
 

Tak więc, pole Oknogl powinno być typu Formatka, a nie Form.
W ogóle, to weź nazywaj pola, klasy i metody w jakiś czytelny sposób. Nazwa Formatka nic nie mówi, nazwa Zamieniaj pasuje raczej do metody niż do klasy, a Oknogl dziwnie wygląda.
Czytałeś jakąś książkę? Bo to by trwało krócej niż próby wprowadzania losowych zmian bez zrozumienia zjawiska.

0

Proszę o administratora o usunięcie tego tematu z forum, gdyż on już nie będzie kontynuowany i chciałbym żeby został on usunięty. Z góry dziękuję.
{ {Template:do usunięcia}}
{ {Cat:Artykuły do usunięcia}}

0

Możesz sam usunąć jeśli Ci na tym zależy. Ale nie radzę bo wywołasz pianę na ustach i żądzę mordu niektórych

0

{ {Template:do usunięcia}}
{ {Cat:Artykuły do usunięcia}}
Proszę o usunięcie tego tematu z forum, gdyż on już nie będzie kontynuowany i chciałbym żeby został on usunięty. Z góry dziękuję.
PS
Jeśli mogę sam usunąć temat to jak to trzeba zrobić? Bardzo mi na tym zależy.

0

Znaczek "usuń ten post" przy pierwszym poście w temacie...

0

Nie widzę, gdzie on jest, gdzie to się znajduje?

0

Ten wątek wisi tu 11 dni, więc nic się nie stanie, jeśli jeszcze chwilę "poistnieje". Autor otrzymał zdaje się odpowiedź, więc wątek chwilowo blokuję - do celów edukacyjnych: JA dostałem odpowiedz, a was mam gdzieś!

BTW: właściwie powinienem zmienić temat tego wątku na: rozmowy somekind'a z somekind'em :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1