Witam jak zrobic takie cos jakie jest np w mircu tj. zalozmy ze mamy listboxa z wartosciami i teraz wpisujemy np 1 lub 2 literki do edita i naciskamy klawisz TAB a w oknie edita pojawia sie dokonczony wpis taki jaki jest w listboxie (dany element) :)
Poniżej masz przykład jak zrobić coś takiego na zmodyfikowanym komponencie TComboBox.
Obsługa komunikatu WM_GETDLGCODE jest konieczna gdy chcesz wykonywać akcję na nacisnięcie Tab.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TCompletedComboBox =
class(TComboBox)
private
procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE;
end;
TForm1 = class(TForm)
procedure ComboBoxKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
ComboBox: TCompletedComboBox;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TCompletedComboBox.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
Message.Result := Message.Result or DLGC_WANTTAB;
end;
procedure TForm1.ComboBoxKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var PamSelStart, Index: Integer;
begin
if (Key = VK_TAB) then
begin
PamSelStart := Length(ComboBox.Text);
Index := SendMessage(ComboBox.Handle, CB_FINDSTRING, -1, LongInt(PChar(ComboBox.text)));
if Index >= 0 then
begin
ComboBox.ItemIndex := Index;
ComboBox.SelStart := PamSelStart;
ComboBox.SelLength := Length(ComboBox.Text);
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox := TCompletedComboBox.Create(Self);
ComboBox.Parent := Self;
ComboBox.OnKeyDown := ComboBoxKeyDown;
ComboBox.AutoComplete := False;
ComboBox.Items.Add('ala ma kota');
ComboBox.Items.Add('kot ma ale');
ComboBox.Left := 16;
ComboBox.Top := 16;
end;
end.
Dzieki, zaraz to sprawdze.
/////////////////
Cos nie moge poradzic sobie z przerzuceniem listy do listbox'a. Dokladnie nie daje rady z tym:
Index := SendMessage(ComboBox.Handle, CB_FINDSTRING, -1, LongInt(PChar(ComboBox.text)));
nie mam pojecia na jakiej to zasadzie dziala, domyslam sie ze wyszukuje ale co :O
wysle piwo temu kto mi to przerobi na listboxa :)))
pzdr
nic nie da rady ? :)
Ok dalem rade ;), moze komus sie kiedys przyda...
//gdzie //
var i:integer; s:string;
lb to listbox
edit1 to edit ;]
// po nacisnieciu entera - ale mozna sobie zmienic na np taba //
if key = #13 then
begin
for i := 0 to lb.Items.Count-1 do
// szukaj itema podobnego do tekstu ktory wpisujemy ;) //
if (pos(edit1.Text,lb.Items.Strings[i]) = 1) then
begin
// jesli znajdziemy to skopiuj od poczatku do konca caly wpis //
s:=copy(lb.Items.Strings[i],0,length(lb.Items.Strings[i]));
end;
// wyswietl na edicie slowo ;) //
edit1.Text:=s;
end;
end;
mozna sobie jeszcze uppercase / lower case pomoc :) pozdrawiam
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.