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é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;
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.
Í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;
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.