Saját Web-böngésző készítése VII

A cikksorozat utolsó számaként az előző cikkben ígért kiegészítéseket fogom ismertetni.

Mik is ezek a kiegészítések?

Ezek nagy része azok a böngészőnkbe eddig be nem írt dolgok, amelyek egy böngészőnek nem feltétlenül szerves részei, viszont egyes esetekben szükségesek lehetnek.

Bővebben ezek a dolgok a következők:

Amikor egy címet beírtunk a böngészőbe, és azt a combobox (cimcombo)-hoz adtuk akkor eddig előfordult, hogy egy-egy cím többször is szerepelt a listában ezt a következőképp oldhatjuk meg:

Az „ugrás” gombhoz kössük a következőt:

var

        cim : integer;

        cim1 : string;

begin

cim1:=combobox1.text;

webbrowser1.Navigate(cim1);

cim:=combobox1.Items.IndexOf(combobox1.Text);

combobox1.Items.Delete(cim);

combobox1.Items.Add(cim1);

end;

Ez megoldja a problémát, mivel ha egy cím már szerepel a listában mielőtt újra hozzáadnánk töröljük az előzőt.

Probléma volt eddig, hogy ha egy címet beírtunk akkor mindig meg kellett nyomnunk az „ugrás” gombot, hogy az oldal elkezdjen töltődni, de általában a böngészőkben elég egy enter-t nyomnunk, ezt a következőképpen oldhatjuk meg:

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);

begin

if key = #13 then speedbutton6.Click;

end;

Ebben az esetben a speedbutton6 volt az „ugrás” gomb, ha más gombot használunk akkor egyszerűbb a default jellemzőjét true-ra állítani.

A státusz sort is felraktuk a böngészőnk aljára, viszont elfelejtettem leírni, hogy hogyan és mire használjuk. Tehát a statusbar feladata legyen kijelezni az állapotokat, és azt, hogy az oldalból eddig mennyi töltődött le.

Kattintsunk kettőt a statusbar-on, ekkor megjelenik az Editing Statusbar1.Panels címkéjű ablak csináljunk két panelt, a másodiknak adjuk meg a width-jét, ez legyen 160. A másiknak nem fontos megadni, mivel ezt futtatási időben fogjuk megadni, de erről később lesz szó. Most a webbrowser OnStatusTextChange eseményéhez kössük a következőt:

statusbar1.Panels.Items[0].Text:=text;

Ide a szöveget a telepített IE adja, tehát ha az IE magyar, akkor szöveg is magyar lesz.

Most adjuk a webbrowser OnProgressChange eseményéhez a következőket:

statusbar1.Panels.Items[1].Text:='Letöltve: '+inttostr(progress)+' / '+inttostr(progressmax);

Ezért kellett megadni a méretét, hogy mindenképpen kiférjen.

Próbáltam ezt a panelrészt úgy megírni, hogy a letöltöttséget százalékosan írja ki, de mivel a webbrowser ezt elég rosszul írja ki (előfordul, hogy a progressmax=0, de a progress több mint 0 ezt százalékban elég nehéz megadni J) ezért maradtam ennél a megoldásnál.

Akkor most jöjjön a fentebb említett futtatás idejű méretváltoztatás. A probléma az, hogy amikor a böngészőt átméretezzük, akkor a gombok és a combobox is ugyanakkora marad, és ez elég bénán néz ki, ezért a méreteket a form OnResize eseményénél állítsuk be a következőképpen:

combobox1.Width:=toolbar2.Width-speedbutton6.Width;

speedbutton1.Width:=round((toolbar1.Width-gauge1.Width)/(toolbar1.ButtonCount-1));

speedbutton2.Width:=round((toolbar1.Width-gauge1.Width)/(toolbar1.ButtonCount-1));

speedbutton3.Width:=round((toolbar1.Width-gauge1.Width)/(toolbar1.ButtonCount-1));

speedbutton4.Width:=round((toolbar1.Width-gauge1.Width)/(toolbar1.ButtonCount-1));

speedbutton5.Width:=round((toolbar1.Width-gauge1.Width)/(toolbar1.ButtonCount-1));

speedbutton7.Width:=round((toolbar1.Width-gauge1.Width)/(toolbar1.ButtonCount-1));

statusbar1.Panels.Items[0].Width:=statusbar1.Width-statusbar1.Panels.Items[1].Width;

A gauge1-ről még eddig nem beszéltem, az első cikkben azt írtam, hogy a böngészőkben szokott lenni egy kis animáció a jobb sarokban, akkor én egy panelt javasoltam, de ez később nem tetszett nekem, ezért helyettesítettem ezzel.

A gauge azért jobb, mivel elég változatos tud lenni, akár kör alakú is lehet, és a színét is tetszés szerint lehet állítani. A gauge-t is az OnProgressChange-nél töltjük fel adatokkal:

gauge1.MaxValue:=progressmax;

gauge1.Progress:=progress;

Ennél a komponensnél természetesen nem okoz gondot a webbrowser hibája.

Az eddig megírt böngészőnknek volt egy elég nagy hiányossága, mégpedig, hogy amikor egy oldal egy új ablakban hivatkozott a másik lapra, akkor a böngészőnk a lapot az IE-ben nyitotta meg. Ez egy saját böngészőnél elég nagy hiba, erre a problémára több megoldás is létezik (mint általában a többire is) az egyik megoldás az, hogy a programunkat újra meghívjuk egy paraméterrel, amely paraméter tartalmazza a megnyitandó oldal címét, de ekkor kéne írni egy paraméterészlelőt a programba, ami ugyan nem nagy munka, de még mindig hosszabb, mint a többi megoldás. A másik lehetőség, hogy a webbrowser-t egy panelra, vagy egy pagecontrol-ra rakjuk, és mindig létrehozunk egy újat, amikor azt egy lap kéri. (ezt a megoldást szokták használni manapság a nem IE alapú böngészők, például a Netscape, vagy az Opera) Viszont én mégis egy kevésbé elegáns, de annál egyszerűbb, rövidebb megoldást fogok bemutatni:

A lényege, hogy a webbrowser-t az új ablakban megnyílandó címre navigáljuk. Ehhez először is meg kell tiltanunk a webbrowser-nek, hogy megnyissa a lapot az IE-ben. Ennek érdekében kössük a következőt a webbrowser OnNewWindow2 eseményéhez:

cancel:=true;

webbrowser1.Navigate(url2);

Az url2-őt deklaráljuk globálisan string-nek, az adatot pedig a webbrowser OnStatusTextChange-nél fogunk bele felvenni:

url2:=text;

Ez a módszer az esetek többségében működik, sőt akár azt is mondhatjuk, hogy a böngészőnk tartalmaz egy popup killert is J.

A levél küldőből eddig kimaradt a csatolt fájlok küldése, ennek a megoldása a következő:

A levél küldése gombhoz adjuk a következőt:

if csat<>'' then nmsmtp1.PostMessage.Attachments.Add(csat);

(Itt a csat a csatolt fájl nevét tartalmazó string)

A levél fogadóban ezzel nem kell foglalkoznunk, mivel ha beállítottuk a csatolt fájlok könyvtárát akkor oda magától letöltődnek a csatolt fájlok, viszont az fontos lehet, hogy milyen néven töltődnek le ezek a fájlok. Ahhoz, hogy ezt a felhasználó megadhassa, a következőket kell az NMPOP3 OnDecodeStart eseményéhez kötni:

var

  S: String;

begin

  S := FileName;

  if InputQuery('Csatolt fájl mentése', 'Fájlnév:', S) then

    FileName := S;

end;

A sorozat befejezése:

A forrásban található még egy-két változás, de ezek annyira már nem érdekesek. Mivel ez a cikksorozat befejező cikke, a cd-n megtalálható a program tejes forrása, és a lefordított program is.

Csubák Péter - chuby@chello.hu