Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > DBComboBox


Автор: Virus 21.6.2003, 14:39
Люди как работает DBComboBox или BDListBox почему он сразу не отражает данные которые прикрепленны к DataField?

Автор: &-ray 21.6.2003, 20:29
DBComboBox и BDListBox сами не формируются, их надо заполнять самому.
Если хочешь, чтобы списки формировались автоматически, то вместо этих компонентов используй DBLookupComboBox или DBLookupListBox

Автор: Cashey 22.6.2003, 15:05
Цитата

DBComboBox и BDListBox сами не формируются, их надо заполнять самому.
Если хочешь, чтобы списки формировались автоматически, то вместо этих компонентов используй DBLookupComboBox или DBLookupListBox

Так-то оно так вот даже код который можно использовать для загрузки данных в свойство Items автоматически

Код

procedure TForm1.FormActivate(Sender: TObject);
var a: Cardinal;
begin
for a:=1 to table1.RecordCount do  begin
DBListBox1.Items.Add(table1.FieldByName('name').AsString);
table1.next;
end;
end;


Вот только хотелось бы узнать для чего созданно св-во DataField. А компоненты DBLookupComboBox и DBLookupListBox предназначены немного для другого.

Автор: lider07 22.6.2003, 15:12
В практике программирования довольно часто встречается ситуация когда информация, предназначенная для отображения в имеющемся компоненте, не помещается по длине. С подобным обычно сталкиваются в работе с базами данных. В таких случая выручают всплывающие
подсказки – Hint. Но, в некоторых случаях, даже такая возможность не спасает. К таким ситуациям можно отнести работу с выпадающим списком в DBComboBox. Представьте, что размер поля увеличился, а изменить ширину DBComboBox на форме, по тем или иным причина
м, нет возможности. Конечно, можно увеличить ширину выпадающего списка. Но выглядит это не всегда красиво да и не делает чести разработчику. Предлагаемая идея позволит создать более изящный компонент. Взгляните на рисунок:




В демонстрационном примере в выпадающем списке появляется всплывающая подсказка для строки не помещающейся по длине.

При работе с Hint нужно помнить – использовать ToolTip из API, бесполезная затея. Delphi игнорирует любые попытки работы ним. Для этих целей в Delphi предусмотрен класс – THintWindow.

В своем компоненте объявите FTipHint:



--------------------------------------------------------------------------------
type
TVSComboBox = class(TCustomComboBox)

private
FHint: THintWindow;

protected
procedure WMCTLCOLORLISTBOX(var Message: TMessage); message WM_CTLCOLORLISTBOX;

и не забудьте выполнить инициализацию в конструкторе вашего компонента:



--------------------------------------------------------------------------------

begin
inherited Create(AOwner);
FHint := THintWindow.Create(Self);


Чтобы получить информацию об активной строке в выпадающем списке ComboBox перехватите сообщение WM_CTLCOLORLISTBOX. В процедуре сообщения анализируйте - если длина строки больше ширины выпадающего списка – передайте "длинную" строку в ваш Hint и активируй
те его:



--------------------------------------------------------------------------------
FHint.ActivateHint(TextRC, Items[ItemIndex]);

где
TextRC – прямоугольник для строки подсказки
Items[ItemIndex] – "длинная" строка из выпадающего списка

Если активная строка в выпадающем списке "короткая" – спрячьте Hint:



--------------------------------------------------------------------------------
FHint.ReleaseHandle;

Для получения подробной информации о классе THintWindow воспользуйтесь Help из Delphi.



Автор: &-ray 22.6.2003, 16:43
Цитата
Вот только хотелось бы узнать для чего созданно св-во DataField


Это свойство связывает данный компонент с полем связанного набора данных. При изменении item'а в компоненте, соответственно изменяется содержимое соответствующего поля в активной записи.

Автор: Virus 24.6.2003, 15:31
Цитата

Это свойство связывает данный компонент с полем связанного набора данных. При изменении item'а в компоненте, соответственно изменяется содержимое соответствующего поля в активной записи.

Спасибо, но не мог бы ты по-подробнее рассказать об отличии этого компонента от обычного CobboBox'а

Автор: eof 24.6.2003, 15:42
smile.gif свойством DataField и DataSource в первую очередь...
при изменение значения DBComboBox его DataSource.DataSet переходит в режим редактирования. Зничение которое выбрано из списка присваевается DataField.NewValue, при смене записи DataSource.DataSet пытается сделать Post. Короче это как DBEdit со списком предлагаемых вариантов заполнения поля...

извеняюсь, но подробнее чем &-ray врятли можно ответить

Автор: forest 29.4.2004, 23:32
jib,cz

Автор: eugenko 10.1.2006, 19:56
Люди хоть кто-нибудь.... хоть когда-нибудь.... доставал данные из DBComboBoxa ??? Как туда их запихнуть разжевано до мелочей... а достать?? а если еще и в переменную передать - так тогда я вообще буду премного благодарен!!!

Автор: FRAGNATIC 10.1.2006, 20:07
eugenko
а DBComboBox1.Text; ваще ни как?
или чёт я не понял чё те надо-то конкретно?

Автор: Guest 11.1.2006, 10:11
Вобщем задача следующая: есть Оракловый запрос, результат которого выводится в DBComboBox, так вот при позиционировании на какую-либо запись в комбобоксе хотелось бы чтобы строку на которой позиционируешься можно было присваивать в переменную. Вот. А я все обчитал и обыскался а как это реализовать - непойму smile

Автор: Albinos_x 11.1.2006, 11:29
Цитата(Guest @ 11.1.2006, 10:11 Найти цитируемый пост)

в комбобоксе хотелось бы чтобы строку на которой позиционируешься можно было присваивать в переменную.

нифига не понятно... тебе нужно итем сохранить?

Автор: eugenko 11.1.2006, 12:04
Разобрался!!! Надо юзаить DBLookupComboBox. Правильно настраиваем KeyField, ListField и ListSource - и будет счастье smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)