:: MVP ::
|
|
:: RSS ::
|
|
|
Как реализовать быстрый поиск по упорядоченному (по алфавиту) списку строк?
// Упорядоченный (по алфавиту) списку строк хранится в 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;
|
При использовании материала - ссылка на сайт обязательна
|
|