Умное свойство в 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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.