tworzenie przeglądarki - kilka pytań

0

Niefortunnie nazwałem poprzedni temat, dlatego zakładam nowy.
Tworze sobie przeglądarkę, obecnie mam:
-progressbara pokazującego status załadowanej strony.
-przycisk: naprzód, wstecz, stop, odśwież,
-przycisk: strona_domowa
-opcje do ustawiania strony_domowej (tzn. w menu jest "Strona domowa" i tu sie wpisuje adres).

Chciałbym to dalej rozbudowywać.

Teraz chciałbym zrobić:

  1. pole szukaj, w które wpisuje sobie jakąś frazę i po kliknięciu na guzik będę miał wyświetlone wyniki z google.
  2. Zastanawiam się nad historią przeglądanych stron.

Czy mógłbym prosić o pomoc w tych dwóch pomysłach?

edit: jedno pytanie techniczne, do wpisywania adresu URL lepiej użyc textboxa czy comboboxa ? (teraz mam textboxa)

0
ne0 napisał(a)

Tworze sobie przeglądarkę

Korzystanie z gotowego komponentu jakim jest WebBrowser nazywasz tworzeniem przeglądarki? Na razie nie robisz nic ponad tworzenie nakładki na silnik IE.

ne0 napisał(a)

Czy mógłbym prosić o pomoc w tych dwóch pomysłach?

Masz jakiś konkretny problem czy czekasz aż ktoś Ci gotowca podeśle?

ne0 napisał(a)

jedno pytanie techniczne, do wpisywania adresu URL lepiej użyc textboxa czy comboboxa ? (teraz mam textboxa)

Jak chcesz żeby Twoja pseudo przeglądarka była podobna do innych to użyj ComboBoxa.

0
ne0 napisał(a)
  1. pole szukaj, w które wpisuje sobie jakąś frazę i po kliknięciu na guzik będę miał wyświetlone wyniki z google.

No a w czym konkretnie problem? Pobierasz tekst z pola, wklejasz do odpowiednio spreparowanego linka i przekierowujesz na stronę.

  1. Zastanawiam się nad historią przeglądanych stron.

Klasa History, w niej pola zawierające adres i datę odwiedzin, lista obiektów serializowana do pliku xml?

edno pytanie techniczne, do wpisywania adresu URL lepiej użyc textboxa czy comboboxa ? (teraz mam textboxa)

Wszystkie znane mi przeglądarki (oprócz lynxa rzecz jasna ;)) mają combo. Nie walczy się z przyzwyczajeniami użytkowników.

0

Jak będzie to pole szukaj, to rozumiem że po naciśnięciu jakiegoś przycisku, powiedzmy "OK" w mojej nakładce na przeglądarkę IE mają pojawić się wynik np. z google - no i mój problem jest że nie wiem jak pobrać i wyświetlić te wyniki.
no a co do historii: nie wiem czy na przykład zapisywać to do pliku i potem wyświetlać na osobnej formatce?

0

Prosiłbym o nie odpowiadanie tej osobie na pytania, bo świadczą o tym że nie chce mu się poszukać.

0

No a w czym konkretnie problem? Pobierasz tekst z pola, wklejasz do odpowiednio spreparowanego linka i przekierowujesz na stronę.
2.
Klasa History, w niej pola zawierające adres i datę odwiedzin, lista obiektów serializowana do pliku xml?

dobra 1) zrobione.

ale z tym 2 to coś mi nie idzie: rozumiem że obiekt klasy Historia tworze w momencie gdy user wciśnie Enter bądź "przejdź do strony" po wpisaniu URL-a.
Tym samym rozumiem że trzeba jakiś sposób zapisywania tych wszystkich obiektów? Załóżmy że stworzę ich 10, to gdzieś musze je trzymać (kolejka, stos ? ) by potem móc je wysłać do xml-a...

0

Ale co w związku z tym?
Spróbowałeś już coś napisać?

0

najpierw trochę info o aplikacji:
combobox gdzie wpisuje URL-a, obok jest guzik "Przejdz" i dwie funkcje: pierwsza reaguje na wcisniecie guzika "Przejdz", druga reaguje na wcisniecie enter-a.

i teraz mam tą klasę historia. rozumiem, że muszę do obu tych funkcji dodać tworzenie obiektow tej klasy historia?

public partial class History
    {
        private DateTime czas;
        private String adres;

        public History(DateTime _czas, String _adres)
        {
            czas = _czas;
            adres = _adres;
        }

    }

pytanie jest, czy wrzucać te obiekty klasy historia do jakiejś tablicy czy czegoś takiego aby później móc je odczytać?
Bo rozumiem że później muszę je jakoś "przewalić" do xml-a

Odczytywanie historii zrobiłem na osobnej formatce gdzie jest listBox w którym chciałbym pokazywać te strony.

0
class VisitedPage
{ 
	public List<DateTime> Date { get; set; } 
	public Uri Address { get; set; }

	public VisitedPage(Uri address)
	{
		Address = address;
		Date = new List<DateTime>();
		Date.Add(DateTime.Now); //?
	}
}

Stack<VisitedPage> History = new Stack<VisitedPage>(); 
public Form1()
{
	InitializeComponent();
}
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
	VisitedPage page;
	page = History.Single((VisitedPage p) => p.Address == e.Url);
	if (page == null)
	{
		page = new VisitedPage(e.Url);
		History.Push(page);
	}
	else page.Date.Add(DateTime.Now);
}

void ZapiszHistorie(string filename)
{
	foreach (VisitedPage page in History)
	{
		//
	}
}

Odpowiedź na to jak zapisać obiekty znajdziesz tu:
http://www.dotnetjohn.com/articles.aspx?articleid=173

0

No ok, czyli, w tych dwóch miejscach gdzie następuje zatwierdzenie URL-a (1. wciśnienie buttona 2.naciśnięcie Enter-a) rozumiem że tworze obiekt typou Visitedpage i następnie wywołuje ZapiszHistorie ?

0

Nie rób tego przy naciśnięciu buttona tylko przy evencie Navigated WebBrowsera, to raz, a dwa ZapiszHistorie() powinienes robic na zakonczeniu programu, a utrzymywac gdzies kopię tylko obecnej historii (tzn obecnego uruchomienia) na wypadek gdyby coś się stało a user chciąłby "kontynuować sesję" (like Opera).

0

wygląda to teraz tak:

void ZapiszHistorie()
        {
            StreamWriter plik = new StreamWriter("C:\\historia.txt", true);
            foreach (VisitedPage page in History)
            {
            
            plik.Write(page);
            plik.Flush();
            plik.Close();
            }
        }

i kurcze nie zapisuje tego...

tworzenie obiektu oraz zapisywanie historii, czyli:

VisitedPage wizyta = new VisitedPage(przegladarka.Url);
            ZapiszHistorie();

zrobiłem dwa testy: jeden to wstawiłem ten kod tylko do Navigated i nie poszło, drugi: wstawiłem do navigated, buttona oraz Entera i też nie poszło

0

Zaczynasz mi działać na nerwy.
Jak ma Ci zapisywać do pliku skoro nie dodajesz tego obiektu (stworzonego) na stos a potem po tym stosie iterujesz?

Poczytaj trochę co to foreach, stack, obiekt, najlepiej przejdz kilka kursów C# (w necie jest wiele).

Pzdr.

0

I koniecznie o StreamWriter (taka klasa) też poczytaj - nie rozumiem czemu (bo nawet ktoś kto nie zna C# mógłby logicznie pomyśleć) zamykasz StreamWritera w każdej operacji pętli (co będzie jak na stosie znajdą się dwa elementy? Pierwszy zapiszesz, drugiego już nie? Gz.)

0

dobra poszło.
jednak jest jeden mały problemik... z tego co widzę zostaje stworzony plik historia.txt więc też ok;

jednak gdy wpiszę URLa i zatwierdzę, wywala mi program ze wskazaniem linii:

page = History.Single((VisitedPage p) => p.Address == e.Url);

oraz błędem:

Sequence contains no matching element

i nie tego nie rozumiem... :/

0

Heh...

  1. Dlaczego używać stosu?
  2. Po co męczyć się z zapisem do txt zamiast użyć serializacji XML?
0

nie wiem.
ja chciałem mieć to tak żeby automatycznie mi gdzieś zapisywało adresy stron które się wpisało; a następnie gdy kliknę na "Narzędzia" -> "Historia" to wyskoczy mi nowe okienko i tam np. w listboxie będę miał wszystkie te strony...

ale na razie nie umiem tego zrobić więc staram się skorzystać z czyjejś pomocy .

0

Co do stosu - można przecież użyć dowolnej kolekcji generycznej, Stos jest po prostu logiczny w tym momencie.
Serializacja XML - dałem Ci link jak to zrobić, czemu z tego nie korzystasz?

0

No bo jeszcze nie zrobiłem tego pierwszego. Chce najpierw zrobić aby to działało. A dopiero potem XML-a polecę.
Tylko że cały czas jest ten błąd... :/
wygląda to tak:

 private void przegladarka_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            TxtAdres.Text = przegladarka.Url.ToString();
            this.Text = przegladarka.DocumentTitle;
            if (przegladarka.CanGoBack)
                cmdWstecz.Enabled = true;
            else cmdWstecz.Enabled = false;
            if (przegladarka.CanGoForward)
                cmdDalej.Enabled = true;
            else cmdDalej.Enabled = false;

            VisitedPage page = new VisitedPage(e.Url);
            page = History.Single((VisitedPage p) => p.Address ==e.Url);
            if (page == null)
            {
                page = new VisitedPage(e.Url);
                History.Push(page);
            }
            else page.Date.Add(DateTime.Now);           
            ZapiszHistorie();
                  
        }
0

To zamień Stack na List, a Single() na Find() (argumentów nie zmieniaj, zamień po prostu słowo Single na Find oraz "Stack" na "List")

0

No i Push na Add, bo tak sie dodaje item do listy.

0

no to teraz błędu już nie ma;
kwestia jeszcze to wypisać do XMLa a potem do listbox-a :)
a jeszcze pytanie: w którym miejscu w kodzie wsadzić ten kod odpowiedzialny za wywalanie do XMLa ?
kod:

VisitedPage wizyta = new VisitedPage(przegladarka.Url);
                ZapiszHistorie();

mam w 2 miejscach (przy zdarzeniu dla Entera, oraz w ButtonClick ). czyli rozumiem że zapisywanie do XMLa można by zrobić np. w ZapiszHistorie() ?

0

to pisz, pisz.

0

Na pytanie gdzie dać ZapiszHistorie już Ci odpowiedź dałem.......

0

zapiszHistorie() na zakończenie programu, następnie nowy obiekt VisitedPage w Navigated...
ale nie wiem gdzie dać to wywalanie do XML-a..

0

A ty ten program robisz jakoś hobbistycznie? xd.
bo zabierasz sie do tego jakbyś chciał a nie mógł.

Napisałem Ci, że na koniec programu zapisać historię, a obecnie trzymane karty zapisywać w jakimś innym pliku (podczas otwierania/zamykania karty nadpisywać plik) aby na wypadek gdyby przeglądarka padła, po uruchomieniu można było wrócić do kart wcześniej otwartych.

Zapisać historię - dodać rekordy do istniejącego pliku XML (możesz robić plik na dzień, albo jeden plik i w nim dni, potem musiałbyś to podzielić). Zapisywanie historii rób na końcu programu.

0

Hobbistycznie :) - dlatego tyle nad tym siedzę.
Szczerze to nie wiem jak to robić.
Wydaje mi się że tak:
po naciśnięciu na "Przejdź do strony" bądź wciśnięcia Enter-a, tworzymy nowy obiekt klasy History;
następnie wywołuje te funkcje które są odpowiedzialne za zapisywanie do XML-a...

chciałem mieć tak, że jak wejde do tej Historii w programie to tam listbox pobierze te dane z XML-a, ale te funkcje które podesłałeś mi w pliku są jakieś dziwne - nie ma tam żadnego info na temat nazwy oraz lokalizacji pliku XML...

0

Zapisywanie do pliku xml przy każdym przejściu na inną (pod)stronę spowoduje narzut (trochę bez sensu imo, chyba że trzymałbyś ten plik ciągle otwarty ale wtedy np. dla dwóch instancji aplikacji coś mogłoby się popieprzyć) dlatego proponuje to robić przy zakończeniu działania programu (np. w tle, formy już nie widać, ale historia się zapisuje).

Obiekt History (historia) tworzysz raz, nie kilka razy - to lista obiektów VisitedPage, którą rozwijasz jak chcesz (ja dałem listę dat, tzn kiedy ktoś wchodził na ten link i sam URL).

VisitedPage tworzysz za każdym razem jak wejdziesz na podstronę - tworzysz i dodajesz do Listy, lub (jesli sprawdzisz że już taki link jest w historii) po prostu dodajesz datę do tego już istniejącego obiektu (tak jest w moim kodzie) w Liście.

Przy zakończeniu działania programu iterujesz po wypełnionej odpowiednio liście History i każdy element nadpisujesz do XMLa (nie wiem czy dałoby się zapisywać cały obiekt listy, dlatego tak to napisałem). Nadpisujesz, ponieważ nie chcesz skasować historii poprzedniej - do tego może służyć jakaś inna funkcja.

Nie dałem Ci żadnego pliku, więc nie wiem o co chodzi - jeśli chodzi o link który podałem (XML Serialization (...)) to napisali tam jasno:

Let us look through the code carefully. First we create an instance of the MemoryStream class since we intend to keep the XML string in memory instead of saving it to a file.

Zatem co zrobić żeby zapisać do pliku? : P może FileStream zamiast MemoryStream, albo z MemoryStream do FileStream?

0

No ok, czyli za każdym razem gdy ktoś zatwierdzi URL-a to w przegladarka.Navigated wykonuje sobie

 VisitedPage wizyta = new VisitedPage(przegladarka.Url);
 page = History.Find((VisitedPage p) => p.Address ==e.Url);
            if (page == null)
            {
                page = new VisitedPage(e.Url);
                History.Add(page);
            }
            else page.Date.Add(DateTime.Now);   

I tu tworzymy sobie tą kolejkę tych obiektów.

Natomiast gdy program kończy swoje działanie (tu jest pytanie w której funkcji to zrobić), ja wywalam to wszystko do pliku bądź pamięci (w tym przypadku pamięć). i robię to tak (oczywiście dla każdego obiektu z kolejki):
Step 1. StringToUTF8ByteArray
Step 2. SerializeObject
natomiast czytanie:
Step 1.DeserializeObject
Step 2. UTF8ByteArrayToString

dobrze to rozumiem?

0
  1. Tak
  2. Hmm, nie potrzebujesz metod String To Bytes i odwrotnej, bo one są uzywane wewnętrznie - chcesz tylko Serialize i Deserialize.

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