Как связать два combobox delphi

Обновлено: 25.04.2024

Господа!
Не подскажите ли каким образом сделать такую вещь - в имеющихся 3 combobox'ах 5 одинаковых элементов, можно ли их связать так, чтобы выбирая один элемент в одном combe, он автоматически появлялся в 2 других?

Originally posted by Solomon
Господа!
Не подскажите ли каким образом сделать такую вещь - в имеющихся 3 combobox'ах 5 одинаковых элементов, можно ли их связать так, чтобы выбирая один элемент в одном combe, он автоматически появлялся в 2 других?

Можно, причем самыми разными способами.

Можно, причем самыми разными способами.

Тогда не подскажите ли несколько из них?

Элементы списка хранятся в его свойстве Items. Это свойство имеет тип TStrings, или список строк. У этого типа есть метод IndexOf, позволяющий узнать индекс указанной строки. В первом списке выбирается элемент, свойство списка ItemIndex показывает индекс выбранного элемента, Combo1->Items[Combo1->ItemIndex] даёт строку, эта строка ищется во втором списке: Сombo2->Items->IndexOf(Combo1->Items->Strings[Combo1->ItemIndex]). По полученному индексу устанавливаете Combo2->ItemIndex.

Originally posted by kot_
При условии, что эти самые индексы во всех комбобоксах соответствуют одной и той же строке. )


Не обязательно. Поиск в связанном комбе производится по строке, выбранной в ведущем комбе: Сombo2->Items->IndexOf(Combo1->Items->Strings[Combo1->ItemIndex]).

Originally posted by fellow

Не обязательно. Поиск в связанном комбе производится по строке, выбранной в ведущем комбе: Сombo2->Items->IndexOf(Combo1->Items->Strings[Combo1->ItemIndex]).

Большое спасибо всем участникам форума за советы - все так на самом деле просто - однако интересно, что в огромной книжке Архангельского про свойство IndexOf кажется ничего нет (это при том, что там все разжевано до невозможности).
Тогда не подскажите ли ответ на похожий вопрос - как сделать, чтобы в 3 других comb'ах (там тоже те же 5 элементов, но в них придется потом переводить из первых) выбранный элемент первого comb'а исчезал?

Большое спасибо всем участникам форума за советы - все так на самом деле просто - однако интересно, что в огромной книжке Архангельского про свойство IndexOf кажется ничего нет (это при том, что там все разжевано до невозможности).


Забрасывай читать Архангельского, если хочешь стать программистом а не мартышкой кликательницей. Купи себе Калверта или BCB Dev Guide.

Originally posted by Solomon

Тогда не подскажите ли ответ на похожий вопрос - как сделать, чтобы в 3 других comb'ах (там тоже те же 5 элементов, но в них придется потом переводить из первых) выбранный элемент первого comb'а исчезал?


Исчезал или удалялся. Если исчезал то куда-нить его сохраняй а потом делай Delete(cb->Item[1]), примерно так, Билдер пускать впадлу.

Originally posted by moonmike

Забрасывай читать Архангельского, если хочешь стать программистом а не мартышкой кликательницей. Купи себе Калверта или BCB Dev Guide.

[COLOR=blue]Спасибо за направление (и за сравнение-:))[/COLOR]

Исчезал или удалялся. Если исчезал то куда-нить его сохраняй а потом делай Delete(cb->Item[1]), примерно так, Билдер пускать впадлу.

[COLOR=blue]Вообще надо
1) чтобы при одном Check'е первый элемент вообще исчезал из списка (из всех списков)
2) чтобы он исчезал во втором Comb'е при выборе его в первом (то есть в этих списках задаются системы счисления, чтобы например EVPU не переводить в EVPU)[/COLOR]

[COLOR=blue]Вообще надо
1) чтобы при одном Check'е первый элемент вообще исчезал из списка (из всех списков)
2) чтобы он исчезал во втором Comb'е при выборе его в первом (то есть в этих списках задаются системы счисления, чтобы например EVPU не переводить в EVPU)[/COLOR]


Делаете примерно то же, что я Вам и говорил. Находите в нужном комбе нужную строку и удаляете этот пункт из комба.
А что такое EVPU?

Originally posted by fellow

Делаете примерно то же, что я Вам и говорил. Находите в нужном комбе нужную строку и удаляете этот пункт из комба.
А что такое EVPU?

Дело в том, что, как я понял, в Borland'е нет такого действия (то есть метода для строки как элемента массива) как например Enable (то есть видимый , но недоступный, как у label'ов и так далее), потому наверное, придется дважды удалять (удалять внутри удаления) первый элемент - как поведет себя родной Builder, пока мне не ясно (то есть могут ли быть какие-то сбои, и вообще, эта штука предусмотрена разработчиками?) когда сделаю ( . если), непременно напишу.
EVPU - это полиграфический формат, созданный и используемый специально для FINALE (самый мощный сейчас нотный редактор), а сделать я хочу, соответственно, конвертер для перевода его в другие - дюймы, пики (написал бы больше, да не могу - когда сделаю, все подробно объясню).

Внимательнее изучите свойства и методы компонентов (Component properties and methods). Некоторые свойства сами являются компонентами, у которых есть и свойства, и методы. Один из распространённых компонентов в VCL - коллекция строк. В общем, читайте справку и удачи Вам.

Originally posted by fellow
Внимательнее изучите свойства и методы компонентов (Component properties and methods). Некоторые свойства сами являются компонентами, у которых есть и свойства, и методы. Один из распространённых компонентов в VCL - коллекция строк. В общем, читайте справку и удачи Вам.

Да, да, спасибо, когда написал, то понял, что написал не то, буду изучать! ( у Архантельского это как-то не очень понятно. )


Связать два ComboBox'a, чтоб от выбора пункта в первом, формировались пункты во втором
Пишу программу, нужно связать два ComboBox'a, чтоб от выбора пункта в первом, формировались пункты.


Как связать ComboBox, ListBox и Memo
У меня не получается связать комбобокс 2-ой строчки на листбох, а из лист бох на мемо.

Как связать combobox, listbox и memo?
Добрый день! Проблема в следующем. В combobox задается список, по выбору строки из этого списка.

Как связать два combobox так, что бы они зависили друг от друга, через базу данных?
Доброго времени суток. Я начинающий программист. Решил написать программу, для удобства работы. Но.

Решение

Связать два ComboBox
Добрый вечер! Помогите решить задачу. Есть два элемента ComboBox и ComboBox1 как в коде связать.

Связать два Combobox через BindingContext
Доброго времени суток, возникла такая вот проблема на форме есть несколько комбобоксов с общим.

Как связать comboBox и dateTimePicker ?
Доброго времени суток! Прошу вас помощи в моем приложении: нужно связать два поля для получения.


Здравствуйте
У меня проблема-нужно заполнить 2 ComboBox и связать их таким образом что один показывает ID_клиента ,а другой Имя клиента и когда я выбираю в одном ID - в другом выбирается клиент ?!Помогите пожалуйста,заранее спасибо.

У нас принято давать темам названия, отражающие суть вопроса.
Модератор

Дурь - это особая форма материи, которая не возникает ниоткуда и не исчезает никуда, а лишь переходит из одной головы в другую.

Извените,спасибо конечно за код-но я немного не это имел ввиду!У меня имя клиента-это подстановочное поле-которое берёться из таблицы-справочника,а созданы BomboBox на другой форме и с другой таблицей ?!

Tcombobox.onchange событие информирующее об изменении выбранной стрки
TcomboBox.itemIndex свойство указывающее строку которая в данный момент выбрана(read) / надо сделать выбранной(write)

пишем обработчик OnChange для первого combobox c ID и пользуясь ItemIndex выставляем соответственные строки

Часто, в ответ на вопрос «как связать комбобокс с БД» Вы услышите — «используй dbLookupComboBox».
Возможно это действительно наиболее удачный вариант, но в силу моей к нему неприязни, я использую обычный ComboBox практически всегда.
Да, действительно, он не всегда удобен, если информацию о работе с ним получать только из книг по Delphi. Ведь в них, обычно, рассматриваются только самые просте способы и методы работы с ним.
В своих проектах я использую его на формах добавления или редактирования записи в базе данных.
Не буду описывать его свойства — это Вы и так можете найти в книгах или на просторах интернета, — благо форумы пестрят подобными заголовками.
В этой статье рассмотрим конкретную реализацию.
База данных выступает в качестве хранилища информации, которую мы будем добавлять или редактировать.
ComboBox, в данном описании, выступает как сомпонент позволяющий выбрать запись из таблицы-справочника для внесения информации в другую таблицу, либо как элемент выступающий в роли отображающего сохраненнную информацию на форме редактирования..
В данном примере для внесения записи и для ее редактирования применяется одна и та же форма, открываемая с различными входными параметрами.
На скринах показано много элементов формы, но я вам покажу работу на примере двух ComboBox-ов. Двух — по той причине что тут они связаны между собой и выбор элемента в первом, изменяет набор данных во втором и при редактировании записи второго ComboBox (связанного с первым по условию) это требует дополнительных операций.
На приведенном изображении фокус установлен на боксе с помощью которого, в данном случае, оператор выбирает назначение рельса (форма открыта в режиме добавления новой записи).


При этом Combobox «Тип оборудования» не содержит никакой информации, поскольку еще не сделан выбор назначения.
После того как назначение будет выбрано, список типов будет заполнен и доступен для выбора необходимой записи и в нем будут отображены только те типы (в данном случае рельса) которые связаны с выбранным назначением. Теперь оператор может выбрать нужный ему тип. Данные связаны.

Теперь о реализации.
Для боксов «Назначение» и «Тип» в БД существуют справочные таблицы, из которых и выполняется наполнение боксов.

Активация формы просходит из другой (родительской) формы, при которой и передается некий параметр определяющий роли элементов.

Определили роль действий как «Добавление записи» и открыли форму, скрины которой показаны выше.
Как работает Form2. Вот что выполняется при открытии формы:

Поскольку форма может быть запущена больше одного раза , то Combobox необходимо очистить от существуюещго набора, ведь набор данных мог и поменяться, — что и сделано командой NaznBox.Items.Clear;
Далее обращаемся к БД для формирования текущего набора элементов бокса. Процедура стандартная и не вижу необходимости ее описывать. Однако стоит остановиться на части кода отображенном в цикле while.
Здесь из набора данных формируем объекты Combobox-а взяв в качестве оборажемого текста, хранящееся в таблице БД имя (здесь «назначение» — поле ‘nazn’), а ключ выбранной записи помещаем в TObject этого Item.
Combobox наполнен необходимыми значениями. Теперь наполним второй, связанный с первым по смыслу.
Следует заметить: поскольку в данный момент рассматриваем форму как оболочку для внесения новой записи — то бокс содержащий типы, в данном случае рельсов, наполняется только после выбора назначения. И вот как я это делаю:
Так как существует связка между назначеним и типом, то необходимо сначала получить значение связующего звена. Связку можно понять внимательно взгянув на скрины таблиц БД.

После чего становится доступным выбор позиции во втором боксе.
На этом прекращаю рассмотрение формы в режиме добавления записи. Сам процесс записи данных в БД должен быть Вам известен.
И приступим к рассмотрению наиболее интересной части статьи, а именно позиционирование Combobox-а на нужную запись при редактировании.
Далее в тексте описания и примерах кода Вы увидите обращение к элементу DBGridEh — это табличное отображение набора данных которые будем редактированить.
Сам грид и процесс его наполнения показывать не буду — это тема для отдельной статьи, но процесс получения значений из него частино будет приведен и если у читателя будет желание получить информацию о реализации отображения табличных данных в рамках этой статьи — дополню ее или оформлю ссылкой на отдельную запись.
Как я уже отметил, на основной форме имеется некий DBGridEh с набором данных. Для редактирования записи ее нужно сначала выбрать, выполнив клик мышью на нужной строке.
Используя событие OnMouseDown DBGridEh-а получаю ключ записи (поле ‘pk’), которая будет радактироваться. Ключ так же содержится в таблице, но столбец с этой информацие скрыт, поскольку для пользователя он, как правило, не нужен.

Теперь обрабатываем нажатие кнопки «Редактировать»

Передали форме form2 информацию о том, что она должна быть открыта в режиме редактирования записи…
Зная этот параметр отрываю форму активируя следующий набор операций:

Здесь мной использован вызов процедуры, поскольку в своей программе вызов этот (редактирование значений) я допускаю делать в различных блоках программы.
И вот так выглядит сама процедура:

Выбрал значения текущих параметров для всех полей в переменные
Ведь при выполнении обновления записи потребуются они все (дабы не писать кучу условий..)
Далее выбираю позицию для бокса «назначение рельса» в соответсвии с записью в БД

Когда у нас есть наполненный по условию связки бокс типов оборудования, — остается последняя операция: Выбираю позицию для бокса «тип рельса» в соответсвии с записью в БД

В сети Вы найдете и другие реализации форм редактирования на Delphi, но поскольку ни одна из них меня не устроила по своему функционалу — я написал код, который и представил на Ваше рассмотрение. Пусть Вас не смущают значения NaznBox и TipBox — это обычные Combobox-ы…
Далее выполняется стандартная процедура обновления записи в таблице базы данных (в данном примере это таблица railslist).
Надеюсь статья получилась вполне читабельна и изложение доходчиво.

← →
TRSteep © ( 2009-12-14 13:45 ) [0]

В ComboBox вносятся текстовые поля, у каждого поля есть дополнительный цифровой параметр.
Есть ли какие то стандартные методы хранения этого поля?

2 Поле
4 Лес
7 Поляна
9 Лес

Т.е. текстовые поля могут повторятся.

Пока в голову приходит мысль только создать 2 динамических массива
и заносить и выбирать поле в combobox по порядковой позиции в массиве

← →
RWolf © ( 2009-12-14 13:49 ) [1]

Objects[]

← →
RWolf © ( 2009-12-14 13:52 ) [2]

пример:
ComboBox1.AddObject("строка",Pointer(42));
ShowMesage(IntToStr(Integer(ComboBox1.Items.Objects[0])));

← →
TRSTeep © ( 2009-12-14 14:11 ) [3]

Я так понимаю ComboBox.Items.Objects, а как его использовать?
Не нашел примера в справке.

← →
TRSTeep © ( 2009-12-14 14:12 ) [4]

о! пока искал уже написали пример - спасибо!

> В ComboBox вносятся текстовые поля, у каждого поля есть
> дополнительный цифровой параметр.
> Есть ли какие то стандартные методы хранения этого поля?

Цифровой vs аналоговый?
Хотя, в любом случае, стандартных нет.
Однако, для любых случаев полезен стиль csOwnerDraw*&etc.

> Пока в голову приходит мысль только создать 2 динамических
> массива
> и заносить и выбирать поле в combobox по порядковой позиции
> в массиве

Почему 2?
Почему по порядковой?

> Не нашел примера в справке.

А он и не спасет ОРД, если исходная постановка верна.

--
Regards, LVT.

← →
Германн © ( 2009-12-15 00:41 ) [6]


> Leonid Troyanovsky © (14.12.09 22:02) [5]

Как-то мне нужно было хранить в TCheckListBox помимо самих строк ещё и 3 числа. Я бы пошел через использование Objects, но была задача иметь возможность сортировки строк по значениям этих чисел. И самым простым оказался путь через OwnerDraw.

← →
KilkennyCat © ( 2009-12-15 08:53 ) [7]

хранение через OwnerDraw? Как прекрасен и удивителен этот мир, полный любви т. д.

← →
TRSteep © ( 2009-12-18 11:02 ) [8]


> Почему 2?
> Почему по порядковой?

2 потому что первый содержит ID, второй под тем же порядковым номером String
реализвать проще чем один с двумя вложенными.


> И самым простым оказался путь через OwnerDraw

Не знаю даже что это :)

а вообще задача решилась благодаря первому примеру:

ввод


ZQuery.SQL.Text := "SELECT * FROM " + ZConnection.Database + ".Member";
ZQuery.Open;

cbb_Contact.Items.Clear;
while not ZQuery.eof do
begin
cbb_Contact.items.AddObject(ZQuery.fieldbyname("Member_Surname").AsString,
Pointer( ZQuery.fieldbyname("Member_ID").AsInteger ));
ZQuery.next;
end;
ZQuery.SQL.Clear;
ZQuery.Close;

и вывод:
Integer(cbb_Contact.Items.Objects[cbb_Contact.itemindex])

Читайте также: