Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 06.04.05 22:52
Оценка:
Помогите плиз... нужен компонент, или я не знаю где такое свойство у стандартного компонента...
Нужен Combobox такой как на верху у Object inspector в Delphi.

Например: когда на ворме три компонента GroupBox1,2,3. мы вводим букву g, в комбобоксе отображается groupbox1, но когда мы продолжаем вводить и на нажимаем все буквы (groupbox3) то в комбобоксе оно и высвечивается...

В стандартном компоненте если установлено свойство dropdownlist, то он ищет только по первой букве всегда...

Неужеле это интересно только мне???
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re: Умное свойство в Combobox
От: _Phantom_  
Дата: 07.04.05 06:51
Оценка:
Здравствуйте, Vodyamba, Вы писали:

---


Это нужно делать ручками
вот пример:

// cbxClients — TComboBox
// у него определен обработчик события OnKeyPress

void __fastcall Форма::cbxClientsKeyPress(TObject *Sender, char &Key)
{
AnsiString s;
if( cbxClients->SelLength == 0 )
{
int len = cbxClients->Text.Length();
if(Key != 8 ) // TAB
{
AnsiString f = cbxClients->Text.SubString(1,cbxClients->SelStart);
AnsiString l = cbxClients->Text.SubString(cbxClients->SelStart+1,len-cbxClients->SelStart);
s = f + Key + l;
}
else
{
AnsiString f = cbxClients->Text.SubString(1,cbxClients->SelStart-1);
AnsiString l = cbxClients->Text.SubString(cbxClients->SelStart+1,len-cbxClients->SelStart);
s = f + l;
}
}
else
{
if(Key != 8 )
{
s = cbxClients->Text.SubString(1,cbxClients->SelStart) + Key;
}
else
{
s = cbxClients->Text.SubString(1,cbxClients->SelStart-1);
}
}
for(int i=0;i<cbxClients->Items->Count;i++)
{
if( cbxClients->Items->Strings[i].Pos(s) == 1)
{
Key = 0;
cbxClients->ItemIndex = i;
cbxClients->SelStart = s.Length();
cbxClients->SelLength = cbxClients->Text.Length() — cbxClients->SelStart;
break;
}
}
}
Re[2]: Умное свойство в Combobox
От: Drago Россия  
Дата: 07.04.05 07:09
Оценка:
Здравствуйте, _Phantom_, Вы писали:
[skiped]

_P_>Это нужно делать ручками

_P_>вот пример:

а раньше это делалось так:

  Combo.IncrementalSearch:=True

эх, ностальгия
Re: Умное свойство в Combobox
От: alive Россия  
Дата: 07.04.05 08:42
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Неужеле это интересно только мне???


Не только См. здесь
Keep yourself alive
Re[2]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 07.04.05 11:06
Оценка:
Здравствуйте, _Phantom_, Вы писали:

_P_>Здравствуйте, Vodyamba, Вы писали:


_P_>---



_P_>Это нужно делать ручками

_P_>вот пример:

_P_>// cbxClients — TComboBox

_P_>// у него определен обработчик события OnKeyPress

Спасибо... попытаюсь перевести на Делфи... хотя Си для меня это туго... но я в себя верю
Re[3]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 07.04.05 11:06
Оценка:
Здравствуйте, Drago, Вы писали:

D>Здравствуйте, _Phantom_, Вы писали:

D>[skiped]

_P_>>Это нужно делать ручками

_P_>>вот пример:

D>а раньше это делалось так:


D>
D>  Combo.IncrementalSearch:=True
D>

D>эх, ностальгия

Где это так делалось интересненько?????
Re[4]: Умное свойство в Combobox
От: Drago Россия  
Дата: 08.04.05 07:16
Оценка:
Здравствуйте, Vodyamba, Вы писали:

[skiped]
V>Где это так делалось интересненько?????
в какой-то из версий Delphi... не то 4, не то 5.. точно не вспомню. а может даже в тройке. но что было — однозначно.
Re[2]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 10.04.05 08:12
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, Vodyamba, Вы писали:


V>>Неужеле это интересно только мне???


A>Не только См. здесь


Всё бы хорошо, но воспользоваться что-то не могу... говорит ошибки всякие...

Может где есть компоненты??? Странно, что такого я не нашел в JVCL, они вроде всё время дорабатываются... хотя может плохо искал...
Re[3]: Умное свойство в Combobox
От: alive Россия  
Дата: 12.04.05 20:25
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Всё бы хорошо, но воспользоваться что-то не могу... говорит ошибки всякие...


А какие ошибки то?
Сейчас вот взял с этой странички код, скопировал в модуль, установил компонент — все работает
... << RSDN@Home 1.1.4 beta 4 rev 391 >> <<silent>>
Keep yourself alive
Re[4]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 13.04.05 11:43
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, Vodyamba, Вы писали:


V>>Всё бы хорошо, но воспользоваться что-то не могу... говорит ошибки всякие...


A>А какие ошибки то?

A>Сейчас вот взял с этой странички код, скопировал в модуль, установил компонент — все работает

Попробовал ещё раз, вроде и вправду без ошибок... Только как то не работает, не пойму... Вроде будто ничего не изменилось...

Может я не так как-то компоненту устанавливаю??? Может можно прописать это всё для стандартного компонента???

Наверное я туплю...
Re[5]: Умное свойство в Combobox
От: alive Россия  
Дата: 13.04.05 20:37
Оценка:
Здравствуйте, 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 user
          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;
            
            // return 0 to signify that the message has been handled.
            Message.Result := 0;
          end;
        end;
      end;
  end; // case
end;

end.
... << RSDN@Home 1.1.4 beta 5 rev 405 >> <<Queen — [Live Killers CD1] Let Me Entertain You>>
Keep yourself alive
Re[6]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 14.04.05 12:37
Оценка:
Здравствуйте, alive, Вы писали:

A>Да, как-то кривовато работает. Попробуй еще так:


A>unit CompletingComboBox;


попробовал... вроде работает получше, но всё же в рабочую программу внедрять не стану...
Как то всё таки корявенько...

Есть мысль...

Попробовать обрабатывать вводимые символы. т.е. что бы компонент имел свойство DropDown, но ввести туда символы не соответствующие уточняемому поиску не удавалось бы...

Что самое хорошое в этом методе, что не надо придумывать велосипед (уточняющийся поиск при свойстве DropDown работает отлично)

Только вот реализовать всё это не могу...
Re[7]: Умное свойство в Combobox
От: alive Россия  
Дата: 14.04.05 20:10
Оценка:
Здравствуйте, Vodyamba, Вы писали:


V>Попробовать обрабатывать вводимые символы. т.е. что бы компонент имел свойство DropDown, но ввести туда символы не соответствующие уточняемому поиску не удавалось бы...


Что мешает, в конце концов, сделать поиск вручную а не средствами WinAPI? Какой стиль комбобокса нужен DropDown или DropDownList?
... << RSDN@Home 1.1.4 beta 5 rev 405 >> <<silent>>
Keep yourself alive
Re[8]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 15.04.05 10:45
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, Vodyamba, Вы писали:


V>>Попробовать обрабатывать вводимые символы. т.е. что бы компонент имел свойство DropDown, но ввести туда символы не соответствующие уточняемому поиску не удавалось бы...


A>Что мешает, в конце концов, сделать поиск вручную а не средствами WinAPI?

Вроде как думал это легко... а на самом деле — неочень...

A>Какой стиль комбобокса нужен DropDown или DropDownList?

Мне надо:
1. чтобы пользователь не мог ввести в комбобококс данные отличные от его Items. Для этого есть свойство DropdownList.
2. т.к. комбобокс содержит около 1000 строк, то неудобно их выбирать, а при DropDownList уточняющий поиск только по первому символу.

Вот и вся проблема... Охото найти что-то среднее между DropDownList и DropDown...

Охото и "рыбки" и "мяска"
Re[9]: Умное свойство в Combobox
От: alive Россия  
Дата: 15.04.05 19:37
Оценка:
Здравствуйте, 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;
... << RSDN@Home 1.1.4 beta 5 rev 411 >> <<Queen — [Hot Space] Action This Day>>
Keep yourself alive
Re[10]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 16.04.05 01:45
Оценка:
Здравствуйте, 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 ?
Re[11]: Умное свойство в Combobox
От: alive Россия  
Дата: 17.04.05 19:18
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Здравствуйте, alive, Вы писали:


A>>Но тебе все равно придется что-то показывать если ползователь ошибся при вводе и подходящего айтема нет.

V>Мысль в том, что бы если пятый символ уже не совпадает, то он не вводится... key:=#0;
Тогда, видимо, можно попробовать обрабатывать WM_KEYDOWN

V>Этот код надо вставить в procedure TCompletingComboBox.ComboWndProc ?

Да
... << RSDN@Home 1.1.4 beta 5 rev 411 >> <<silent>>
Keep yourself alive
Re[9]: Умное свойство в Combobox
От: ak_miass Россия  
Дата: 18.04.05 04:27
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Мне надо:

V> 1. чтобы пользователь не мог ввести в комбобококс данные отличные от его Items. Для этого есть свойство DropdownList.
V> 2. т.к. комбобокс содержит около 1000 строк, то неудобно их выбирать, а при DropDownList уточняющий поиск только по первому символу.

Может тогда лучше сделать csSimple, примерно как в предметном указателе в WinHelp.
Re[12]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 18.04.05 11:25
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, Vodyamba, Вы писали:


V>>Здравствуйте, alive, Вы писали:


A>>>Но тебе все равно придется что-то показывать если ползователь ошибся при вводе и подходящего айтема нет.

V>>Мысль в том, что бы если пятый символ уже не совпадает, то он не вводится... key:=#0;
A>Тогда, видимо, можно попробовать обрабатывать WM_KEYDOWN

Пробовал, но надо обработать как то по хитрому...
1.Обрабатывать правильно нажатия кнопок delete и backspace и т.д.
2.А так же после нажатия энтер обнулять строку поиска...

Хотя я наверное уже сам запутался... чего я хочу... есть реальный пример в комбобоксе в delphi в ObjectInspector

Я хочу так же если есть где то готовое решение помогите. Плиз.
Re[13]: Умное свойство в Combobox
От: alive Россия  
Дата: 18.04.05 12:24
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Хотя я наверное уже сам запутался... чего я хочу... есть реальный пример в комбобоксе в delphi в ObjectInspector

В инспекторе, по-моему, в самом гриде комбобокс со стилем DropDown, а наверху DropDownList. И ничего там особенного нет.Потом, насколько я знаю, начиная с 6 Delphi у комбобокса есть свойство AutoComplete или что-то вроде этого (могу ошибаться)

V>Я хочу так же если есть где то готовое решение помогите. Плиз.

А ты погугли на эту тему .Все решения основанные на виндосовском комбобоксе сводятся к тому, что уже приводили. А из сторонних компонентов посмотри здесь (не устанавливал)
Keep yourself alive
Re: Умное свойство в Combobox
От: Oleg A. Bachin Украина  
Дата: 18.04.05 12:58
Оценка:
Здравствуйте, 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% можно оставить!
но мне всегда и этого хватало. может всетаки что-то где-то перехватывается не в тему?
Best regards,
Oleg A. Bachin
Re[14]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 19.04.05 10:17
Оценка:
Здравствуйте, 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 пункта...
Re[10]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 19.04.05 10:17
Оценка:
Здравствуйте, ak_miass, Вы писали:

_>Здравствуйте, Vodyamba, Вы писали:


V>>Мне надо:

V>> 1. чтобы пользователь не мог ввести в комбобококс данные отличные от его Items. Для этого есть свойство DropdownList.
V>> 2. т.к. комбобокс содержит около 1000 строк, то неудобно их выбирать, а при DropDownList уточняющий поиск только по первому символу.

_>Может тогда лучше сделать csSimple, примерно как в предметном указателе в WinHelp.

Неа... в симпле можно ввести значение, которого нет в items, а мне это недопустимо...
Re[2]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 19.04.05 10:17
Оценка:
Здравствуйте, 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>ну и дальше по тексту...
Извините, но не понятно по какому тексту... т.к. ответов и предложений было много...
Re[11]: Умное свойство в Combobox
От: ak_miass Россия  
Дата: 19.04.05 11:22
Оценка:
Здравствуйте, Vodyamba, Вы писали:


V>Неа... в симпле можно ввести значение, которого нет в items, а мне это недопустимо...


А ты попробуй ввести в том же Help значение, которого нет в списке, и затем нажми "Показать". ИМХО, в случае с 1000 строк такой вариант будет удобнее для пользователя.
Re[12]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 20.04.05 09:24
Оценка:
Здравствуйте, ak_miass, Вы писали:

_>А ты попробуй ввести в том же Help значение, которого нет в списке, и затем нажми "Показать". ИМХО, в случае с 1000 строк такой вариант будет удобнее для пользователя.


Для этого надо заняться более глобальной переработкой ПС, а в случае с умным комбобоксом — только замена самого комбобокса на новый.

Просто не хотелось изобретать велосипед, а выходит, что такого велосипеда ещё нет...
Re[15]: Умное свойство в Combobox
От: alive Россия  
Дата: 20.04.05 13:02
Оценка:
Здравствуйте, 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>>
Keep yourself alive
Re[16]: Умное свойство в Combobox
От: Vodyamba Россия  
Дата: 22.04.05 08:27
Оценка:
Здравствуйте, alive, Вы писали:

A>Здравствуйте, Vodyamba, Вы писали:


V>>Интересует комбобокс, который наверху...

V>>Он со стилем DropDownList, но если у наст на формк всего 2 edit (edit1 и edit2), то, когда мы нажимаем первую букву (e), у нас на в комбобоксе отображается edit1, т.к. он первый в сортировке по алфавиту, но если мы введём остальные символы (e d i t 2), то отобразится edit2

A>Что-то я ступил. При установленом стиле DropDownList будет искать по всем введенным буквам при раскрытом списке и свойстве Sorted:= True.


Вроде работает, но не пойму логики... Иногда надо набирать первую букву (иногда и остальные) по два раза чтобы он начинал искать...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.