1 (edited by m.prokhachev 2019-05-31 10:59:15)

Topic: ComboBox: связанный и несвязанный

Все знают, что два комбобокса можно связать друг с другом при помощи свойства ParentComboBox - один (ведомый) станет зависеть от другого (ведущего), который будет указан в этом свойстве у ведомого.

Так вот вопрос на засыпку. Я хочу иметь ведомый комбобокс как самостоятельный (не связанный с ведущим) в том случае, если в ведущем комбобоксе не выбрано ни одно значение (при этом у ведущего FirstEmptyItem = True).

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

Для понимания конкретики. Есть у меня список датчиков (ведомый комбобокс в моей хотелке) и есть список объектов (ведущий комбобокс в моей хотелке), на котором эти датчики установлены (само собой, на одном объекте от одного до нескольких датчиков). Пока ни одно значение в ведущем комбобоксе не выборано, ведомый комбобокс должен вести себя как самостоятельный комбобокс с пустым свойством ParentComboBox и позволять выбирать ЛЮБОЙ датчик из всех существующих в базе. Однако как только в ведущем комбобоксе будет выбрано какое-то значение, то ведомый комбобокс должен уже отреагировать как положено в модели поведения "ведомый - ведущий" и позволить выбрать только те датчики, которые присутствуют на выбранном объекте из ведущего комбобокса.

2 (edited by m.prokhachev 2019-05-28 15:56:39)

Re: ComboBox: связанный и несвязанный

порыскал по форуму...

получается, надо определиться только с событием ведущего комбобокса, а связывать их статически при проектировании в самой IDE не обязательно, можно отрабатывать код типа:

if Form1.ComboBox_Master.dbItemID <> -1
  then
     begin
         Form1.ComboBox_Slave.dbSQLExecute('SELECT SensorName, id FROM Sensors WHERE id_Object='+IntToStr(Form1.ComboBox_Master.dbItemID));
         Form1.ComboBox_Slave.dbUpdate;
     end
  else
     begin
         Form1.ComboBox_Slave.dbSQLExecute('SELECT SensorName, id FROM Sensors');
         Form1.ComboBox_Slave.dbUpdate; 
     end;

или будут другие предложения?

Re: ComboBox: связанный и несвязанный

procedure Form1_ComboBox1_OnClick (Sender: TObject);
begin
if form1.ComboBox1.dbItemID<>-1 then form1.ComboBox2.dbSQLExecute('SELECT bb FROM B LEFT OUTER JOIN A ON B.id_A=A.id  WHERE A.id ='+ Form1.ComboBox1.sqlValue);
Form1.ComboBox2.dbUpdate;
end;
Post's attachments

Attachment icon test2.7z 480.48 kb, 291 downloads since 2019-05-28 

Re: ComboBox: связанный и несвязанный

А почему событие OnClick?

Re: ComboBox: связанный и несвязанный

m.prokhachev wrote:

А почему событие OnClick?

даже и не знаю, просто по привычке ))

Re: ComboBox: связанный и несвязанный

а я как-то больше привык работать с dbItemID, чем с sqlValue. да и проверки на наличие выбранного элемента у них разные: у первого <> -1, у второго <> "NULL".

Re: ComboBox: связанный и несвязанный

m.prokhachev wrote:

порыскал по форуму...

получается, надо определиться только с событием ведущего комбобокса, а связывать их статически при проектировании в самой IDE не обязательно, можно отрабатывать код типа:

if Form1.ComboBox_Master.dbItemID <> -1
  then
     begin
         Form1.ComboBox_Slave.dbSQLExecute('SELECT SensorName, id FROM Sensors WHERE id_Object='+IntToStr(Form1.ComboBox_Master.dbItemID));
         Form1.ComboBox_Slave.dbUpdate;
     end
  else
     begin
         Form1.ComboBox_Slave.dbSQLExecute('SELECT SensorName, id FROM Sensors');
         Form1.ComboBox_Slave.dbUpdate; 
     end;

или будут другие предложения?


Думаю этот вариант вполне рабочий, проверил его на другом примере

procedure frmMyFavoriteCity_cbCity_OnDropDown (Sender: TObject);
var
    idCity: integer;
begin
    if frmMyFavoriteCity.cbRegion.dbItemID <> -1 then
    begin
        idCity := frmMyFavoriteCity.cbCity.dbItemID;
        frmMyFavoriteCity.cbCity.dbSQLExecute('SELECT city, id FROM City WHERE id_Region='+IntToStr(frmMyFavoriteCity.cbRegion.dbItemID));
        frmMyFavoriteCity.cbCity.dbUpdate;
        frmMyFavoriteCity.cbCity.dbItemID := idCity;
    end else
    begin
        idCity := frmMyFavoriteCity.cbCity.dbItemID;
        frmMyFavoriteCity.cbCity.dbSQLExecute('SELECT city, id FROM City');
        frmMyFavoriteCity.cbCity.dbUpdate;
        frmMyFavoriteCity.cbCity.dbItemID := idCity;
    end;
end;

только добавил восстановление выбора в ComboBox-е, иначе выбор сбивается если снова раскрыть комбо.

Dmitry.

Re: ComboBox: связанный и несвязанный

DriveSoft, именно на OnDropDown вешать надо? Ведомого или таки ведущего комбобокса? smile

Re: ComboBox: связанный и несвязанный

Ведомого.

Dmitry.

Re: ComboBox: связанный и несвязанный

Мне не нравится такая логика. По моей логике и задумке латентный ведомый комбобокс должен становится явным ведомым только после выбора значения в ведущем комбобоксе, а до этого момента быть самостоятельным и независимым комбобоксом. Поэтому я думаю, что изменение содержимого ведомого комбобокса надо вешать на событие OnChange ведущего комбобокса. Сохранность значения в ведомом комбобоксе для последующих действий - не важна.

11 (edited by sibprogsistem 2019-05-31 14:55:23)

Re: ComboBox: связанный и несвязанный

m.prokhachev wrote:

Мне не нравится такая логика. По моей логике и задумке латентный ведомый комбобокс должен становится явным ведомым только после выбора значения в ведущем комбобоксе, а до этого момента быть самостоятельным и независимым комбобоксом. Поэтому я думаю, что изменение содержимого ведомого комбобокса надо вешать на событие OnChange ведущего комбобокса. Сохранность значения в ведомом комбобоксе для последующих действий - не важна.

procedure Form1_ComboBox1_OnChange (Sender: TObject);
begin
 if form1.ComboBox1.dbItemID<>-1 then form1.ComboBox2.dbSQLExecute('SELECT bb FROM B LEFT OUTER JOIN A ON B.id_A=A.id  WHERE A.id ='+ Form1.ComboBox1.sqlValue)else
 form1.ComboBox2.dbSQLExecute('SELECT bb FROM B '); // иначе вывести все записи
Form1.ComboBox2.dbUpdate;
end;

Re: ComboBox: связанный и несвязанный

О, оптимизация кода подъехала!.. Спасибо!