Tab + Completer jak w mircu :)

0

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) :)

0

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.
0

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

0

nic nie da rady ? :)

0

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

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