Помогите плиз... нужен компонент, или я не знаю где такое свойство у стандартного компонента...
Нужен 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>Я хочу так же если есть где то готовое решение помогите. Плиз.
А ты погугли на эту тему .Все решения основанные на виндосовском комбобоксе сводятся к тому, что уже приводили. А из сторонних компонентов посмотри здесь (не устанавливал)
Здравствуйте, Vodyamba, Вы писали:
V>Помогите плиз... нужен компонент, или я не знаю где такое свойство у стандартного компонента... V>Нужен Combobox такой как на верху у Object inspector в Delphi.
V>Например: когда на ворме три компонента GroupBox1,2,3. мы вводим букву g, в комбобоксе отображается groupbox1, но когда мы продолжаем вводить и на нажимаем все буквы (groupbox3) то в комбобоксе оно и высвечивается...
V>В стандартном компоненте если установлено свойство dropdownlist, то он ищет только по первой букве всегда...
V>Неужеле это интересно только мне???
Странные вы какие-то... все нормально работает... зачем столько воротить!
смотрим:
procedure TCustomComboBox.KeyPress(var Key: Char);
..................
begin
inherited KeyPress(Key);
if not AutoComplete then exit;
if Style in [csDropDown, csSimple] then
FFilter := Text
else
begin
if GetTickCount - FLastTime >= 500 then
FFilter := '';
FLastTime := GetTickCount;
end;
ну и дальше по тексту...
конечно не сильно удобно что константой 500мс выставленно, но! функция виртуальная!!! код на 99% можно оставить!
но мне всегда и этого хватало. может всетаки что-то где-то перехватывается не в тему?
Здравствуйте, alive, Вы писали:
A>В инспекторе, по-моему, в самом гриде комбобокс со стилем DropDown, а наверху DropDownList.
Интересует комбобокс, который наверху...
Он со стилем DropDownList, но если у наст на формк всего 2 edit (edit1 и edit2), то, когда мы нажимаем первую букву (e), у нас на в комбобоксе отображается edit1, т.к. он первый в сортировке по алфавиту, но если мы введём остальные символы (e d i t 2), то отобразится edit2
A> И ничего там особенного нет.Потом, насколько я знаю, начиная с 6 Delphi у комбобокса есть свойство AutoComplete или что-то вроде этого (могу ошибаться)
Свойство, то есть, только оно не для моего случая... оно работает только со свойством DropDown (Заканчивает введённую фразу или нет)
V>>Я хочу так же если есть где то готовое решение помогите. Плиз. A>А ты погугли на эту тему .Все решения основанные на виндосовском комбобоксе сводятся к тому, что уже приводили. А из сторонних компонентов посмотри здесь (не устанавливал)
Попытался... скачал только 2 набора демок, или компонент...
1 набор "Paradox Table Repair Components" вообще не компилится, не может найти один модуль...
2 набор "DTalk" видать для работы с голосовой информацией, но разобраться за 15 мин. не смог, т.к. нет хелпа... да и время жаль, хотя интересно для чего написаны эти 10 компонент...
3 набор "Combobox Plus" неизвестно от куда качать переходит в меню закачки 1 и 2 пункта...
Здравствуйте, ak_miass, Вы писали:
_>Здравствуйте, Vodyamba, Вы писали:
V>>Мне надо: V>> 1. чтобы пользователь не мог ввести в комбобококс данные отличные от его Items. Для этого есть свойство DropdownList. V>> 2. т.к. комбобокс содержит около 1000 строк, то неудобно их выбирать, а при DropDownList уточняющий поиск только по первому символу.
_>Может тогда лучше сделать csSimple, примерно как в предметном указателе в WinHelp.
Неа... в симпле можно ввести значение, которого нет в items, а мне это недопустимо...
Здравствуйте, Oleg A. Bachin, Вы писали:
OAB>Странные вы какие-то... все нормально работает... зачем столько воротить! OAB>смотрим: OAB>
OAB>procedure TCustomComboBox.KeyPress(var Key: Char);
OAB>..................
OAB>begin
OAB> inherited KeyPress(Key);
OAB> if not AutoComplete then exit;
OAB> if Style in [csDropDown, csSimple] then
OAB> FFilter := Text
OAB> else
OAB> begin
OAB> if GetTickCount - FLastTime >= 500 then
OAB> FFilter := '';
OAB> FLastTime := GetTickCount;
OAB> end;
OAB>
OAB>ну и дальше по тексту...
Извините, но не понятно по какому тексту... т.к. ответов и предложений было много...
V>Неа... в симпле можно ввести значение, которого нет в items, а мне это недопустимо...
А ты попробуй ввести в том же Help значение, которого нет в списке, и затем нажми "Показать". ИМХО, в случае с 1000 строк такой вариант будет удобнее для пользователя.
Здравствуйте, ak_miass, Вы писали:
_>А ты попробуй ввести в том же Help значение, которого нет в списке, и затем нажми "Показать". ИМХО, в случае с 1000 строк такой вариант будет удобнее для пользователя.
Для этого надо заняться более глобальной переработкой ПС, а в случае с умным комбобоксом — только замена самого комбобокса на новый.
Просто не хотелось изобретать велосипед, а выходит, что такого велосипеда ещё нет...
Здравствуйте, Vodyamba, Вы писали:
V>Интересует комбобокс, который наверху... V>Он со стилем DropDownList, но если у наст на формк всего 2 edit (edit1 и edit2), то, когда мы нажимаем первую букву (e), у нас на в комбобоксе отображается edit1, т.к. он первый в сортировке по алфавиту, но если мы введём остальные символы (e d i t 2), то отобразится edit2
Что-то я ступил. При установленом стиле DropDownList будет искать по всем введенным буквам при раскрытом списке и свойстве Sorted:= True.
... << RSDN@Home 1.1.4 beta 5 rev 411 >> <<Aerosmith — [Big Ones] Livin On The Edge>>
Здравствуйте, alive, Вы писали:
A>Здравствуйте, Vodyamba, Вы писали:
V>>Интересует комбобокс, который наверху... V>>Он со стилем DropDownList, но если у наст на формк всего 2 edit (edit1 и edit2), то, когда мы нажимаем первую букву (e), у нас на в комбобоксе отображается edit1, т.к. он первый в сортировке по алфавиту, но если мы введём остальные символы (e d i t 2), то отобразится edit2
A>Что-то я ступил. При установленом стиле DropDownList будет искать по всем введенным буквам при раскрытом списке и свойстве Sorted:= True.
Вроде работает, но не пойму логики... Иногда надо набирать первую букву (иногда и остальные) по два раза чтобы он начинал искать...