FAQ VCL
Компоненты\ComboBox

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как установить положение курсора в TComboBox?

procedure TForm1.Button1Click(Sender: TObject);
begin
   ComboBox.SelStart := 10;
end;


Как реализовать быстрый поиск по упорядоченному (по алфавиту) списку строк?

// Упорядоченный (по алфавиту) списку строк хранится в ComboBox1.Items
procedure TForm1.ComboBox1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  x, i: Word;
  s: string;
begin
   if ( ( Key >= 0 ) and ( Key <= 31 ) ) and ( Key <> 13 ) then
      Exit;

   if Key > 31 then
   begin
      x := Length( ComboBox1.Text );
      if x > 0 then
         for i := 0 to ComboBox1.Items.Count-1 do
         begin
            s := Copy( ComboBox1.Items[i], 1, x );
            if AnsiLowerCase( ComboBox1.Text ) = AnsiLowerCase( s ) then
            begin
               s := Copy( ComboBox1.Items[i], x+1, Length( ComboBox1.Items[i] )-x );
               ComboBox1.Text := ComboBox1.Text + s;
               Edit1.SelStart := x;
               Edit1.SelLength := Length( ComboBox1.Text ) - x;
               Break;
            end;
         end;
   end
   else
   begin
      s := AnsiLowerCase( ComboBox1.Text );
      for i := 0 to ComboBox1.Items.Count-1 do
      if s = AnsiLowerCase( ComboBox1.Items[i] ) then
      begin
         ComboBox1.ItemIndex := i;
         ComboBox1.SelStart := ComboBox1.SelStart + ComboBox1.SelLength;
         ComboBox1.SelLength := 0;
         Break;
      end;
   end;
end;


Как показать многострочный текст в TComboBox?

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
   ComboBox1.Style := csOwnerDrawVariable;
   for i := 1 to 3 do
      ComboBox1.Items.Add( 'This is a very very very very long item line ' + IntToStr( i ) );
end;

procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer;
  var Height: Integer);
var
  ItemString: string;
  MyRect: TRect;
  MyImage: TImage;
  MyCombo: TComboBox;
begin
   // Не тратьте время на Index = -1
   if Index > -1 then
   begin
      MyCombo := TComboBox( Control );
      // Создаем временный canvas для вычисления высоты
      MyImage := TImage.Create( MyCombo );
      try
         MyRect := MyCombo.ClientRect;
         ItemString := MyCombo.Items.Strings[Index];
         MyImage.Canvas.Font := MyCombo.Font;
         // Вычисление высоты пункта меню
         Height := DrawText( MyImage.Canvas.Handle, PChar( ItemString ),
                             -1, MyRect, DT_CALCRECT or DT_WORDBREAK ) + 3;
      finally
         MyImage.Free;
      end;
   end;
end;

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  ItemString: string;
  MyRect: TRect;
begin
   MyRect := Rect;
   OffsetRect( MyRect, 2, 0 );
   TComboBox( Control ).Canvas.FillRect( Rect );
   ItemString := TComboBox( Control ).Items.Strings[Index];
   DrawText( TComboBox( Control ).Canvas.Handle, PChar( ItemString ), - 1, MyRect, DT_WORDBREAK );
end;

При использовании материала - ссылка на сайт обязательна