Помогите плиз... нужен компонент, или я не знаю где такое свойство у стандартного компонента...
Нужен Combobox такой как на верху у Object inspector в Delphi.
Например: когда на ворме три компонента GroupBox1,2,3. мы вводим букву g, в комбобоксе отображается groupbox1, но когда мы продолжаем вводить и на нажимаем все буквы (groupbox3) то в комбобоксе оно и высвечивается...
В стандартном компоненте если установлено свойство dropdownlist, то он ищет только по первой букве всегда...
Здравствуйте, Drago, Вы писали:
D>Здравствуйте, _Phantom_, Вы писали: D>[skiped]
_P_>>Это нужно делать ручками _P_>>вот пример:
D>а раньше это делалось так:
D>
[skiped] V>Где это так делалось интересненько?????
в какой-то из версий Delphi... не то 4, не то 5.. точно не вспомню. а может даже в тройке. но что было — однозначно.
Здравствуйте, alive, Вы писали:
A>Здравствуйте, Vodyamba, Вы писали:
V>>Всё бы хорошо, но воспользоваться что-то не могу... говорит ошибки всякие...
A>А какие ошибки то? A>Сейчас вот взял с этой странички код, скопировал в модуль, установил компонент — все работает
Попробовал ещё раз, вроде и вправду без ошибок... Только как то не работает, не пойму... Вроде будто ничего не изменилось...
Может я не так как-то компоненту устанавливаю??? Может можно прописать это всё для стандартного компонента???
Здравствуйте, Vodyamba, Вы писали:
V>Попробовал ещё раз, вроде и вправду без ошибок... Только как то не работает, не пойму... Вроде будто ничего не изменилось...
Да, как-то кривовато работает. Попробуй еще так:
unit CompletingComboBox;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TCompletingComboBox = class(TComboBox)
private
FTextCompletion: Boolean;
function GetTextCompletion: Boolean;
procedure SetTextCompletion(const Value: Boolean);
protected// override the WndProc() so that we can trap KeyUp events.procedure ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
ComboProc: Pointer); override;
public{ Public declarations }published
property TextCompletion: Boolean read GetTextCompletion write SetTextCompletion;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TCompletingComboBox]);
end;
{ TCompletingComboBox }function TCompletingComboBox.GetTextCompletion: Boolean;
begin
Result := fTextCompletion;
end;
procedure TCompletingComboBox.SetTextCompletion(const Value: Boolean);
begin
fTextCompletion := Value;
end;
procedure TCompletingComboBox.ComboWndProc(var Message: TMessage; ComboWnd: HWnd;
ComboProc: Pointer);
var
rc, len: Integer;
begin
inherited;
case Message.Msg of
WM_KEYUP:
begin// test to see if its a character that should not be processed. if (Message.WParam <> 8) and (Message.WParam <> VK_DELETE) and
(Message.WParam <> VK_SHIFT) and (FTextCompletion = True) then
begin// Use CB_FINDSTRING to locate the string in the Items property
rc := Perform(CB_FINDSTRING, -1, Integer(PChar(Caption)));
// if its in there then add the new string to the Text and
// select the portion that wasn't typed in by the userif rc <> CB_ERR then
begin// store the length of the current string
len := Length(Text);
// set the new string
ItemIndex := rc;
// highlight the rest of the text that was added.
SelStart := len;
SelLength := Length(Text) - len;
// return 0 to signify that the message has been handled.Message.Result := 0;
end;
end;
end;
end; // caseend;
end.
... << RSDN@Home 1.1.4 beta 5 rev 405 >> <<Queen — [Live Killers CD1] Let Me Entertain You>>
Здравствуйте, alive, Вы писали:
A>Да, как-то кривовато работает. Попробуй еще так:
A>unit CompletingComboBox;
попробовал... вроде работает получше, но всё же в рабочую программу внедрять не стану...
Как то всё таки корявенько...
Есть мысль...
Попробовать обрабатывать вводимые символы. т.е. что бы компонент имел свойство DropDown, но ввести туда символы не соответствующие уточняемому поиску не удавалось бы...
Что самое хорошое в этом методе, что не надо придумывать велосипед (уточняющийся поиск при свойстве DropDown работает отлично)
V>Попробовать обрабатывать вводимые символы. т.е. что бы компонент имел свойство DropDown, но ввести туда символы не соответствующие уточняемому поиску не удавалось бы...
Что мешает, в конце концов, сделать поиск вручную а не средствами WinAPI? Какой стиль комбобокса нужен DropDown или DropDownList?
Здравствуйте, alive, Вы писали:
A>Здравствуйте, Vodyamba, Вы писали:
V>>Попробовать обрабатывать вводимые символы. т.е. что бы компонент имел свойство DropDown, но ввести туда символы не соответствующие уточняемому поиску не удавалось бы...
A>Что мешает, в конце концов, сделать поиск вручную а не средствами WinAPI?
Вроде как думал это легко... а на самом деле — неочень...
A>Какой стиль комбобокса нужен DropDown или DropDownList?
Мне надо:
1. чтобы пользователь не мог ввести в комбобококс данные отличные от его Items. Для этого есть свойство DropdownList.
2. т.к. комбобокс содержит около 1000 строк, то неудобно их выбирать, а при DropDownList уточняющий поиск только по первому символу.
Вот и вся проблема... Охото найти что-то среднее между DropDownList и DropDown...
Здравствуйте, Vodyamba, Вы писали:
V>Мне надо: V> 1. чтобы пользователь не мог ввести в комбобококс данные отличные от его Items. Для этого есть свойство DropdownList.
Дело в том, что комбобокс со стилем DropDownList не имеет Edit-а, то где отображается выбранный элемент — это static контрол.
V> Вот и вся проблема... Охото найти что-то среднее между DropDownList и DropDown...
Но тебе все равно придется что-то показывать если ползователь ошибся при вводе и подходящего айтема нет.
Измени код, например, так:
rc := Perform(CB_FINDSTRING, -1, Integer(PChar(Caption)));
if rc <> CB_ERR then
begin// store the length of the current string
len := Length(Text);
// set the new string
ItemIndex := rc;
/ highlight the rest of the text that was added.
SelStart := len;
SelLength := Length(Text) - len;
end
else//Ничего не нашли. Дальше где-нибудь в коде обрабатываем эту ситуацию
ItemIndex := -1;
// return 0 to signify that the message has been handled.Message.Result := 0;
Здравствуйте, alive, Вы писали:
A>Но тебе все равно придется что-то показывать если ползователь ошибся при вводе и подходящего айтема нет.
Мысль в том, что бы если пятый символ уже не совпадает, то он не вводится... key:=#0;
A>Измени код, например, так: A>
A>rc := Perform(CB_FINDSTRING, -1, Integer(PChar(Caption)));
A>if rc <> CB_ERR then
A>begin
A>// store the length of the current string
A> len := Length(Text);
A>// set the new string
A> ItemIndex := rc;
A>/ highlight the rest of the text that was added.
A> SelStart := len;
A> SelLength := Length(Text) - len;
A>end
A>else
A>//Ничего не нашли. Дальше где-нибудь в коде обрабатываем эту ситуацию
A> ItemIndex := -1;
A>// return 0 to signify that the message has been handled.
A>Message.Result := 0;
A>
Этот код надо вставить в procedure TCompletingComboBox.ComboWndProc ?
Здравствуйте, Vodyamba, Вы писали:
V>Здравствуйте, alive, Вы писали:
A>>Но тебе все равно придется что-то показывать если ползователь ошибся при вводе и подходящего айтема нет. V>Мысль в том, что бы если пятый символ уже не совпадает, то он не вводится... key:=#0;
Тогда, видимо, можно попробовать обрабатывать WM_KEYDOWN
V>Этот код надо вставить в procedure TCompletingComboBox.ComboWndProc ?
Да
Здравствуйте, Vodyamba, Вы писали:
V>Мне надо: V> 1. чтобы пользователь не мог ввести в комбобококс данные отличные от его Items. Для этого есть свойство DropdownList. V> 2. т.к. комбобокс содержит около 1000 строк, то неудобно их выбирать, а при DropDownList уточняющий поиск только по первому символу.
Может тогда лучше сделать csSimple, примерно как в предметном указателе в WinHelp.
Здравствуйте, alive, Вы писали:
A>Здравствуйте, Vodyamba, Вы писали:
V>>Здравствуйте, alive, Вы писали:
A>>>Но тебе все равно придется что-то показывать если ползователь ошибся при вводе и подходящего айтема нет. V>>Мысль в том, что бы если пятый символ уже не совпадает, то он не вводится... key:=#0; A>Тогда, видимо, можно попробовать обрабатывать WM_KEYDOWN
Пробовал, но надо обработать как то по хитрому...
1.Обрабатывать правильно нажатия кнопок delete и backspace и т.д.
2.А так же после нажатия энтер обнулять строку поиска...
Хотя я наверное уже сам запутался... чего я хочу... есть реальный пример в комбобоксе в delphi в ObjectInspector
Я хочу так же если есть где то готовое решение помогите. Плиз.
Здравствуйте, Vodyamba, Вы писали:
V>Хотя я наверное уже сам запутался... чего я хочу... есть реальный пример в комбобоксе в delphi в ObjectInspector
В инспекторе, по-моему, в самом гриде комбобокс со стилем DropDown, а наверху DropDownList. И ничего там особенного нет.Потом, насколько я знаю, начиная с 6 Delphi у комбобокса есть свойство AutoComplete или что-то вроде этого (могу ошибаться)
V>Я хочу так же если есть где то готовое решение помогите. Плиз.
А ты погугли на эту тему .Все решения основанные на виндосовском комбобоксе сводятся к тому, что уже приводили. А из сторонних компонентов посмотри здесь (не устанавливал)