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

 

Az előző cikkben ígért saját komponens készítését, telepítését, és a böngészőbe való beírását fogom ebben a cikkben ismertetni.

 

A komponens készítése

 

A komponens készítéséhez a menüből válasszuk a Component -> New Component… menüpontot.

A New Component ablakba állítsuk be a következőket:

 

Ancestor Type: TComboBox

Class Name:  TCimCombo (lehet más név is)

Palette Page: Samples (lehet máshova is)

 

 

A Unit file name és Search path megváltoztatható de nincs sok értelme. Az Ok gombra kattintva megjelenik az új komponensünk alapja a Delphi szerkesztőjében.

Még nem írtam le hogy pontosan mit is kell majd a komponensünknek tudnia. Egy olyan combobox komponensre van szükségünk, ami a beírt szöveget kiegészíti ha talál a listájában hasonló szöveget, úgy ahogyan azt az ie is teszi. (Fontos, hogy Delphi 6–tól felfele erre a komponensre nincs szükség a fent leírt hatás eléréséhez, mivel a combobox-nak van egy AutoComplete nevű jellemzője, amit ha true-ra állítunk akkor automatikusan kiegészíti a szöveget.)

Hogyan is fogjuk ezt megoldani, egyértelműnek tűnik, hogy a Change eseményt kell kiegészíteni, ez így is van tehát írjuk meg a kiegészítőt:

 

protected

    procedure Change; override;

 

. . .

 

Procedure TCimCombo.Change;

 

   function Egyezes (Mi, Miben : String) : Boolean;

        Begin

        Egyezes:= Pos(Mi, Miben)=1;

        end;

 

   Var

   i, poz : Integer;

 

   Begin

   i:=0;

   while ((i<=Items.Count-1) and (Egyezes(Text, Items[i])=false)) do

   Inc(i);

   If (i<=Items.Count-1) then

        begin

        poz:=Length(Text);

        ItemIndex:=i;

        SelStart:=poz;

        SelLength:=((Length(Text))-poz);

        end;

   Inherited Change;

   end;

 

Ha a komponensünket így telepítjük, és megpróbáljuk használni, akkor láthatjuk, hogy a kiegészítés már működik, de a kiegészített szöveg nem törölhető. Ennek oka, hogy a backspace billentyű hatására is lefut a Change eseményhez kötött szöveg kiegészítő, és kiegészíti a szöveget. Erre is van „orvosság” mégpedig az, hogy csak akkor hagyjuk futni a szöveg kiegészítőt, ha a leütött billentyű nem a backspace. Ennek megállapításához használjuk a KeyDown eseményt, és egy boolean változót. Egészítsük ki tehát a forrást a következő képpen:

protected

    procedure Change; override;

    procedure KeyDown(var Key: Word; Shift: TShiftState); override;

 

. . .

 

implementation

 

var

        irhato: boolean;

 

. . .

 

   while ((i<=Items.Count-1) and (Egyezes(Text, Items[i])=false)) do

   Inc(i);

   if ((i<=Items.Count-1) and (irhato=true)) then

 

. . .

 

procedure TCimCombo.KeyDown(var Key: Word; Shift: TShiftState);

begin

if Key=VK_BACK then irhato:=false

else irhato:=true;

Inherited KeyDown(Key, Shift);

end;

 

Telepítés

 

A komponensünknek most még csak a forrása van kész ezt telepíteni is kell a Delphi komponensek közzé. Először is mentsük el a forrást, majd válasszuk a Component -> Install Component… menüpontot. Ekkor az előjövő ablakban benne van alapból a komponensünk neve, helye stb. már csak meg kell nyomnunk az Ok gombot. Ha ez mégsem így lenne, vagy ha másik komponenst szeretnénk telepíteni, akkor a következőket kell beállítani:

 

Unit file name: ide kerül a forrás helye.

Search path: ide azok a könyvtárak kerülnek, ahol a delphi keresni fogja a telepített komponenseket, ami alapból benne van azt még véletlenül sem szabad törölni. Ide egyébként a könyvtárat automatikusan beírja a delphi, ha a Unit file name –t megadtuk.

Package file name: Itt választhatjuk ki, hogy melyik csomagba szeretnénk telepíteni a komponenst, érdemes az alapbeállításon hagyni.

 

Az ok megnyomása után rákérdez a delphi hogy újra fordítsa e a kiválasztott csomagot? Erre ha igen el válaszolunk, akkor ha minden rendben akkor minden üzenet nélkül lefordítja. Ha nem akkor a hibákról a megszokott módon értesít. Mikor bezárnánk a komponenseket tartalmazó listadobozt akkor rákérdez, hogy mentse e a változásokat, erre válaszoljunk igennel.

 

A böngésző kiegészítése a komponenssel

 

Így most már a komponens működik, de ezt még bele kell írni a böngészőbe. Nézzük át először, hogy hol használtuk eddig a ComboBox-ot, és ezek helyére helyettesítsük be a CimCombo-t:

 

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

webbrowser1.Navigate(cimcombo1.text);

end;

 

Viszont van még egy probléma, mégpedig, hogy a listában alapból nincsen semmi, tehát a beírt címeket a listába kell helyezni, és a listát el kell menteni:

 

procedure TForm1.BitBtn1Click(Sender: TObject);

 

Var

      Cim : integer;

begin

webbrowser1.Navigate(cimcombo1.text);

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

cimcombo1.Items.Delete(cim);

cimcombo1.Items.Add(cimcombo1.Text);

end;

 

. . .

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

cimcombo1.Items.SaveToFile('list.lst');

end;

 

Továbbiak:

 

Nem maradt más hátra mint a levélfogadó megírása, ezt viszont okkal hagytam utoljára.

 

Forrás (A CimCombo forrása) :

 

unit CimCombo;

 

interface

 

uses

  Windows, Messages, SysUtils, WinTypes, WinProcs, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls;

 

type

  TCimCombo = class(TComboBox)

  private

    { Private declarations }

  protected

    { Protected declarations }

    procedure Change; override;

    procedure KeyDown(var Key: Word; Shift: TShiftState); override;

  public

    { Public declarations }

  published

    { Published declarations }

  end;

 

procedure Register;

 

implementation

 

var

        irhato: boolean;

 

Procedure TCimCombo.Change;

 

   function Egyezes (Mi, Miben : String) : Boolean;

        Begin

        Egyezes:= Pos(Mi, Miben)=1;

        end;

 

   Var

   i, poz : Integer;

 

   Begin

   i:=0;

   while ((i<=Items.Count-1) and (Egyezes(Text, Items[i])=false)) do

   Inc(i);

   If ((i<=Items.Count-1) and (irhato=true)) then

        begin

        poz:=Length(Text);

        ItemIndex:=i;

        SelStart:=poz;

        SelLength:=((Length(Text))-poz);

        end;

   Inherited Change;

   end;

 

procedure TCimCombo.KeyDown(var Key: Word; Shift: TShiftState);

begin

irhato:=true;

if Key=VK_BACK then irhato:=false

else irhato:=true;

Inherited KeyDown(Key, Shift);

end;

 

 

procedure Register;

begin

  RegisterComponents('Standard', [TCimCombo]);

end;

 

end.

 

 

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